Skip to content

Commit

Permalink
makes one operator being enabled depend on another (#436)
Browse files Browse the repository at this point in the history
* made one operator being enabled depend on another

* added changelog and api docs

* fixed small templating change

* move changelog to correct location

* corrected changelog type

* add capability to control cluster role
  • Loading branch information
Albert authored Mar 31, 2023
1 parent a96e0cc commit 408a95e
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 5 deletions.
4 changes: 4 additions & 0 deletions changelog/v0.29.3/8450-operator-enabled-dependson.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
changelog:
- type: NEW_FEATURE
description: Added ability for one operator to be not enabled if another operator is also not enabled
issueLink: https://github.com/solo-io/gloo-mesh-enterprise/issues/8450
110 changes: 109 additions & 1 deletion codegen/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"reflect"

goyaml "gopkg.in/yaml.v3"
rbacv1 "k8s.io/api/rbac/v1"
v12 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"

. "github.com/onsi/ginkgo/v2"
Expand Down Expand Up @@ -813,7 +814,6 @@ var _ = Describe("Cmd", func() {
})

It("supports overriding the deployment and service specs via helm values", func() {

cmd := &Command{
Chart: &Chart{
Operators: []Operator{
Expand Down Expand Up @@ -1073,6 +1073,114 @@ var _ = Describe("Cmd", func() {
Expect(renderedService.Spec.LoadBalancerIP).To(Equal(loadBalancerIp))
Expect(*renderedDeployment.Spec.Replicas).To(Equal(replicas))
})

It("supports enabling one service depending on whether another is enabled", func() {
cmd := &Command{
Groups: []Group{
{
GroupVersion: schema.GroupVersion{
Group: "things.test.io",
Version: "v1",
},
Module: "github.com/solo-io/skv2",
Resources: []Resource{
{
Kind: "Paint",
Spec: Field{Type: Type{Name: "PaintSpec"}},
Status: &Field{Type: Type{Name: "PaintStatus"}},
},
{
Kind: "ClusterResource",
Spec: Field{Type: Type{Name: "ClusterResourceSpec"}},
ClusterScoped: true,
},
},
RenderManifests: true,
RenderTypes: true,
RenderClients: true,
RenderController: true,
MockgenDirective: true,
ApiRoot: "codegen/test/api",
CustomTemplates: contrib.AllGroupCustomTemplates,
},
},
AnyVendorConfig: skv2Imports,
RenderProtos: true,

Chart: &Chart{
Operators: []Operator{
{
Name: "painter",
EnabledDependsOn: []string{"test1", "test2"},
Rbac: []rbacv1.PolicyRule{
{
Verbs: []string{"GET"},
},
},
Deployment: Deployment{
Container: Container{
Image: Image{
Tag: "v0.0.0",
Repository: "painter",
Registry: "quay.io/solo-io",
PullPolicy: "IfNotPresent",
},
Args: []string{"foo"},
},
},
},
},
Values: nil,
Data: Data{
ApiVersion: "v1",
Description: "",
Name: "Painting Operator",
Version: "v0.0.1",
Home: "https://docs.solo.io/skv2/latest",
Sources: []string{
"https://github.com/solo-io/skv2",
},
},
},

ManifestRoot: "codegen/test/chart",
}

err := cmd.Execute()
Expect(err).NotTo(HaveOccurred())

fileContents, err := os.ReadFile("codegen/test/chart/templates/deployment.yaml")
Expect(err).NotTo(HaveOccurred())

Expect(string(fileContents)).To(ContainSubstring("{{- if and $painter.enabled $.Values.test1.enabled $.Values.test2.enabled }}"))

expectedSA := "kind: ServiceAccount\nmetadata:\n labels:\n app: painter\n name: painter\n"
expectedCR := "kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: painter"

type enabledThing struct {
Enabled bool `json:"enabled"`
}
helmValues := map[string]*enabledThing{
"painter": &enabledThing{Enabled: true},
"test1": &enabledThing{Enabled: false},
"test2": &enabledThing{Enabled: false},
}

renderedManifests := helmTemplate("codegen/test/chart", helmValues)
Expect(renderedManifests).NotTo(ContainSubstring(expectedSA))
Expect(renderedManifests).NotTo(ContainSubstring(expectedCR))

helmValues["test1"].Enabled = true
renderedManifests = helmTemplate("codegen/test/chart", helmValues)
Expect(renderedManifests).NotTo(ContainSubstring(expectedSA))
Expect(renderedManifests).NotTo(ContainSubstring(expectedCR))

helmValues["test2"].Enabled = true
renderedManifests = helmTemplate("codegen/test/chart", helmValues)
Expect(string(renderedManifests)).To(ContainSubstring(expectedSA))
Expect(renderedManifests).To(ContainSubstring(expectedCR))
})

Context("generates CRD with validation schema for a proto file", func() {
var cmd *Command

Expand Down
5 changes: 5 additions & 0 deletions codegen/model/chart.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ type Operator struct {

// Custom values to include at operator level
Values interface{}

// (Optional) If this operator depends on another operator being enabled,
// the name of the other operator can be included in this list. This operator
// will not be provisioned unless both are enabled (by having values.enabled = true)
EnabledDependsOn []string
}

func (o Operator) FormattedName() string {
Expand Down
14 changes: 11 additions & 3 deletions codegen/templates/chart/operator-deployment.yamltmpl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ Expressions evaluating SKv2 Config use "[[" and "]]"

{{- $[[ $operatorVar ]] := [[ (opVar $operator) ]]}}
---
[[- $enabledCheck := print "{{- if $" $operatorVar ".enabled }}" -]]
[[- if $operator.EnabledDependsOn -]]
[[- $enabledCheck = print "{{- if and $" $operatorVar ".enabled" -]]
[[- range $index, $element := $operator.EnabledDependsOn -]]
[[- $enabledCheck = print $enabledCheck " $.Values." $element ".enabled" -]]
[[- end -]]
[[- $enabledCheck = print $enabledCheck " }}" -]]
[[- end ]]

{{- define "[[ $operator.Name ]].deploymentSpec"}}
[[- $workloadKind := "Deployment" ]]
Expand Down Expand Up @@ -138,7 +146,7 @@ spec:
{{- end }} {{/* define "[[ $operator.Name ]].deploymentSpec" */}}

{{/* Render [[ $operator.Name ]] deployment template with overrides from values*/}}
{{- if $[[ $operatorVar ]].enabled }}
[[ $enabledCheck ]]
{{- $[[ $operatorVar ]]DeploymentOverrides := dict }}
{{- if $[[ $operatorVar ]].deploymentOverrides }}
{{- $[[ $operatorVar ]]DeploymentOverrides = $[[ $operatorVar ]].deploymentOverrides }}
Expand All @@ -148,7 +156,7 @@ spec:
{{- end }}
---

{{- if $[[ $operatorVar ]].enabled }}
[[ $enabledCheck ]]
apiVersion: v1
kind: ServiceAccount
metadata:
Expand Down Expand Up @@ -199,7 +207,7 @@ spec:
[[ end ]]
{{- end }} {{/* define "[[ $operator.Name ]].serviceSpec" */}}

{{- if $[[ $operatorVar ]].enabled }}
[[ $enabledCheck ]]
{{/* Render [[ $operator.Name ]] service template with overrides from values*/}}
{{- $[[ $operatorVar ]]ServiceOverrides := dict }}
{{- if $[[ $operatorVar ]].serviceOverrides }}
Expand Down
11 changes: 10 additions & 1 deletion codegen/templates/chart/operator-rbac.yamltmpl
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,16 @@ Expressions evaluating SKv2 Config use [[ "[[" ]] and [[ "]]" ]]
# Rbac manifests for [[ $operator.Name ]]

{{- $[[ $operatorVar ]] := [[ (opVar $operator)]]}}
{{- if $[[ $operatorVar ]].enabled }}

[[- $enabledCheck := print "{{- if $" $operatorVar ".enabled }}" -]]
[[- if $operator.EnabledDependsOn -]]
[[- $enabledCheck = print "{{- if and $" $operatorVar ".enabled" -]]
[[- range $index, $element := $operator.EnabledDependsOn -]]
[[- $enabledCheck = print $enabledCheck " $.Values." $element ".enabled" -]]
[[- end -]]
[[- $enabledCheck = print $enabledCheck " }}" -]]
[[- end ]]
[[ $enabledCheck ]]
---

kind: ClusterRole
Expand Down

0 comments on commit 408a95e

Please sign in to comment.