Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 4 additions & 3 deletions pkg/generator/deploy_tmpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

package generator

const operatorYamlTmpl = `apiVersion: apiextensions.k8s.io/v1beta1
const crdYamlTmpl = `apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: {{.KindPlural}}.{{.GroupName}}
Expand All @@ -27,8 +27,9 @@ spec:
singular: {{.KindSingular}}
scope: Namespaced
version: {{.Version}}
---
apiVersion: apps/v1
`

const operatorYamlTmpl = `apiVersion: apps/v1
kind: Deployment
metadata:
name: {{.ProjectName}}
Expand Down
43 changes: 29 additions & 14 deletions pkg/generator/gen_deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,40 +22,55 @@ import (
)

const (
crdTmplName = "deploy/crd.yaml"
operatorTmplName = "deploy/operator.yaml"
rbacTmplName = "deploy/rbac.yaml"
crTmplName = "deploy/cr.yaml"
)

// OperatorYaml contains all the customized data needed to generate deploy/operator.yaml for a new operator
// when pairing with operatorYamlTmpl template.
type OperatorYaml struct {
// CRDYaml contains data needed to generate deploy/crd.yaml
type CRDYaml struct {
Kind string
KindSingular string
KindPlural string
GroupName string
Version string
ProjectName string
Image string
}

// renderCRDYaml generates deploy/crd.yaml
func renderCRDYaml(w io.Writer, kind, apiVersion string) error {
t := template.New(crdTmplName)
t, err := t.Parse(crdYamlTmpl)
if err != nil {
return fmt.Errorf("failed to parse crd yaml template: %v", err)
}

ks := strings.ToLower(kind)
o := CRDYaml{
Kind: kind,
KindSingular: ks,
KindPlural: toPlural(ks),
GroupName: groupName(apiVersion),
Version: version(apiVersion),
}
return t.Execute(w, o)
}

// OperatorYaml contains data needed to generate deploy/operator.yaml
type OperatorYaml struct {
ProjectName string
Image string
}

// renderOperatorYaml generates deploy/operator.yaml.
func renderOperatorYaml(w io.Writer, kind, apiVersion, projectName, image string) error {
func renderOperatorYaml(w io.Writer, projectName, image string) error {
t := template.New(operatorTmplName)
t, err := t.Parse(operatorYamlTmpl)
if err != nil {
return fmt.Errorf("failed to parse operator yaml template: %v", err)
}

ks := strings.ToLower(kind)
o := OperatorYaml{
Kind: kind,
KindSingular: ks,
// suffix KindSingular with "s" to create KindPlural.
// TODO: make this more grammatically correct for special nouns.
KindPlural: ks + "s",
GroupName: groupName(apiVersion),
Version: version(apiVersion),
ProjectName: projectName,
Image: image,
}
Expand Down
117 changes: 117 additions & 0 deletions pkg/generator/gen_deploy_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package generator

import (
"bytes"
"testing"
)

const crdYamlExp = `apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: appservices.app.example.com
spec:
group: app.example.com
names:
kind: AppService
listKind: AppServiceList
plural: appservices
singular: appservice
scope: Namespaced
version: v1alpha1
`

const operatorYamlExp = `apiVersion: apps/v1
kind: Deployment
metadata:
name: app-operator
spec:
replicas: 1
selector:
matchLabels:
name: app-operator
template:
metadata:
labels:
name: app-operator
spec:
containers:
- name: app-operator
image: quay.io/example-inc/app-operator:0.0.1
command:
- app-operator
imagePullPolicy: Always
`

const rbacYamlExp = `kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: app-operator
rules:
- apiGroups:
- app.example.com
resources:
- "*"
verbs:
- "*"
- apiGroups:
- ""
resources:
- pods
- services
- endpoints
- persistentvolumeclaims
- events
- configmaps
- secrets
verbs:
- "*"
- apiGroups:
- apps
resources:
- deployments
- daemonsets
- replicasets
- statefulsets
verbs:
- "*"

---

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: default-account-app-operator
subjects:
- kind: ServiceAccount
name: default
roleRef:
kind: Role
name: app-operator
apiGroup: rbac.authorization.k8s.io
`

func TestGenDeploy(t *testing.T) {
buf := &bytes.Buffer{}
if err := renderCRDYaml(buf, appKind, appAPIVersion); err != nil {
t.Error(err)
}
if crdYamlExp != buf.String() {
t.Errorf("want %v, got %v", crdYamlExp, buf.String())
}

buf = &bytes.Buffer{}
if err := renderOperatorYaml(buf, appProjectName, appImage); err != nil {
t.Error(err)
}
if operatorYamlExp != buf.String() {
t.Errorf("want %v, got %v", operatorYamlExp, buf.String())
}

buf = &bytes.Buffer{}
if err := renderRBACYaml(buf, appProjectName, appGroupName); err != nil {
t.Error(err)
}
if rbacYamlExp != buf.String() {
t.Errorf("want %v, got %v", rbacYamlExp, buf.String())
}
}
11 changes: 6 additions & 5 deletions pkg/generator/gen_olm_catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ import (
const (
// Sample catalog resource values
// TODO: Make this configurable
packageChannel = "alpha"
packageChannel = "alpha"
catalogCRDTmplName = "deploy/olm-catalog/crd.yaml"
)

// CatalogPackageConfig contains the data needed to generate deploy/olm-catalog/package.yaml
Expand Down Expand Up @@ -60,9 +61,9 @@ type CRDConfig struct {
Version string
}

// renderCRD generates deploy/olm-catalog/crd.yaml
func renderCRD(w io.Writer, config *Config) error {
t := template.New(catalogCRDYaml)
// renderCatalogCRD generates deploy/olm-catalog/crd.yaml
func renderCatalogCRD(w io.Writer, config *Config) error {
t := template.New(catalogCRDTmplName)
t, err := t.Parse(crdTmpl)
if err != nil {
return fmt.Errorf("failed to parse catalog CRD template: %v", err)
Expand All @@ -72,7 +73,7 @@ func renderCRD(w io.Writer, config *Config) error {
crdConfig := CRDConfig{
Kind: config.Kind,
KindSingular: kindSingular,
KindPlural: kindSingular + "s",
KindPlural: toPlural(kindSingular),
GroupName: groupName(config.APIVersion),
Version: version(config.APIVersion),
}
Expand Down
16 changes: 12 additions & 4 deletions pkg/generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const (
crYaml = "cr.yaml"
catalogPackageYaml = "package.yaml"
catalogCSVYaml = "csv.yaml"
catalogCRDYaml = "crd.yaml"
crdYaml = "crd.yaml"
)

type Generator struct {
Expand Down Expand Up @@ -184,6 +184,14 @@ func renderDeployFiles(deployDir, projectName, apiVersion, kind string) error {
return err
}

buf = &bytes.Buffer{}
if err := renderCRDYaml(buf, kind, apiVersion); err != nil {
return err
}
if err := writeFileAndPrint(filepath.Join(deployDir, crdYaml), buf.Bytes(), defaultFileMode); err != nil {
return err
}

buf = &bytes.Buffer{}
if err := renderCustomResourceYaml(buf, apiVersion, kind); err != nil {
return err
Expand All @@ -194,7 +202,7 @@ func renderDeployFiles(deployDir, projectName, apiVersion, kind string) error {
// RenderOperatorYaml generates "deploy/operator.yaml"
func RenderOperatorYaml(c *Config, image string) error {
buf := &bytes.Buffer{}
if err := renderOperatorYaml(buf, c.Kind, c.APIVersion, c.ProjectName, image); err != nil {
if err := renderOperatorYaml(buf, c.ProjectName, image); err != nil {
return err
}
return ioutil.WriteFile(operatorYaml, buf.Bytes(), defaultFileMode)
Expand Down Expand Up @@ -225,10 +233,10 @@ func RenderOlmCatalog(c *Config, image, version string) error {

// deploy/olm-catalog/crd.yaml
buf = &bytes.Buffer{}
if err := renderCRD(buf, c); err != nil {
if err := renderCatalogCRD(buf, c); err != nil {
return err
}
path = filepath.Join(olmDir, catalogCRDYaml)
path = filepath.Join(olmDir, crdYaml)
if err := ioutil.WriteFile(path, buf.Bytes(), defaultFileMode); err != nil {
return err
}
Expand Down
Loading