Skip to content

Commit 792abfc

Browse files
pkg/generator: Generate service at runtime
1 parent 163ba0b commit 792abfc

7 files changed

+42
-163
lines changed

README.md

-6
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@ $ kubectl create -f deploy/rbac.yaml
5656
$ kubectl create -f deploy/crd.yaml
5757
$ kubectl create -f deploy/operator.yaml
5858

59-
# Monitor the app-operator using prometheus and serviceMonitor CRD
60-
$ kubectl create -f deploy/service.yaml
61-
$ kubectl create -f deploy/serviceMonitor.yaml
62-
6359
# By default, creating a custom resource (App) triggers the app-operator to deploy a busybox pod
6460
$ kubectl create -f deploy/cr.yaml
6561

@@ -72,8 +68,6 @@ busy-box 1/1 Running 0 50s
7268
$ kubectl delete -f deploy/cr.yaml
7369
$ kubectl delete -f deploy/operator.yaml
7470
$ kubectl delete -f deploy/rbac.yaml
75-
$ kubectl delete -f deploy/service.yaml
76-
$ kubectl delete -f deploy.serviceMonitor.yaml
7771
```
7872

7973
To learn more about the operator-sdk, see the [user guide][guide].

pkg/generator/deploy_tmpl.go

+4-28
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ spec:
5959
valueFrom:
6060
fieldRef:
6161
fieldPath: metadata.namespace
62+
- name: OPERATOR_NAME
63+
valueFrom:
64+
fieldRef:
65+
fieldPath: metadata.name
6266
`
6367

6468
const rbacYamlTmpl = `kind: Role
@@ -114,31 +118,3 @@ kind: "{{.Kind}}"
114118
metadata:
115119
name: "example"
116120
`
117-
118-
const serviceYamlTmpl = `apiVersion: v1
119-
kind: Service
120-
metadata:
121-
name: {{.ProjectName}}
122-
labels:
123-
name: {{.ProjectName}}
124-
spec:
125-
selector:
126-
name: {{.ProjectName}}
127-
ports:
128-
- protocol: TCP
129-
targetPort: metrics
130-
port: 9090
131-
name: metrics`
132-
133-
const serviceMonitorYamlTmpl = `apiVersion: monitoring.coreos.com/v1
134-
kind: ServiceMonitor
135-
metadata:
136-
name: {{.ProjectName}}
137-
labels:
138-
name: {{.ProjectName}}
139-
spec:
140-
selector:
141-
matchLabels:
142-
name: {{.ProjectName}}
143-
endpoints:
144-
- port: metrics`

pkg/generator/gen_deploy.go

+4-47
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@ import (
2222
)
2323

2424
const (
25-
crdTmplName = "deploy/crd.yaml"
26-
operatorTmplName = "deploy/operator.yaml"
27-
rbacTmplName = "deploy/rbac.yaml"
28-
crTmplName = "deploy/cr.yaml"
29-
serviceTmplName = "deploy/service.yaml"
30-
serviceMonitorTmplName = "deploy/serviceMonitor.yaml"
25+
crdTmplName = "deploy/crd.yaml"
26+
operatorTmplName = "deploy/operator.yaml"
27+
rbacTmplName = "deploy/rbac.yaml"
28+
crTmplName = "deploy/cr.yaml"
3129
)
3230

3331
// CRDYaml contains data needed to generate deploy/crd.yaml
@@ -79,47 +77,6 @@ func renderOperatorYaml(w io.Writer, projectName, image string) error {
7977
return t.Execute(w, o)
8078
}
8179

82-
// ServiceYaml contains all the customized data needed to generate deploy/service.yaml for a new operator
83-
// This service will be monitor by prometheus
84-
// when pairing with serviceYamlTmpl template.
85-
type ServiceYaml struct {
86-
ProjectName string
87-
}
88-
89-
// renderServiceYaml generates deploy/service.yaml.
90-
func renderServiceYaml(w io.Writer, projectName string) error {
91-
t := template.New(serviceTmplName)
92-
t, err := t.Parse(serviceYamlTmpl)
93-
if err != nil {
94-
return fmt.Errorf("Failed to parse service yaml template: %v", err)
95-
}
96-
97-
s := ServiceYaml{
98-
ProjectName: projectName,
99-
}
100-
return t.Execute(w, s)
101-
}
102-
103-
// ServiceMonitorYaml contains all the customized data needed to generate deploy/serviceMonitor.yaml for a new operator
104-
// when pairing with serviceMonitorYamlTmpl template.
105-
type ServiceMonitorYaml struct {
106-
ProjectName string
107-
}
108-
109-
// renderServiceYaml generates deploy/service.yaml.
110-
func renderServiceMonitorYaml(w io.Writer, projectName string) error {
111-
t := template.New(serviceMonitorTmplName)
112-
t, err := t.Parse(serviceMonitorYamlTmpl)
113-
if err != nil {
114-
return fmt.Errorf("Failed to parse serviceMonitor yaml template: %v", err)
115-
}
116-
117-
s := ServiceYaml{
118-
ProjectName: projectName,
119-
}
120-
return t.Execute(w, s)
121-
}
122-
12380
// RBACYaml contains all the customized data needed to generate deploy/rbac.yaml for a new operator
12481
// when pairing with rbacYamlTmpl template.
12582
type RBACYaml struct {

pkg/generator/gen_deploy_test.go

+4-44
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ spec:
5050
valueFrom:
5151
fieldRef:
5252
fieldPath: metadata.namespace
53+
- name: OPERATOR_NAME
54+
valueFrom:
55+
fieldRef:
56+
fieldPath: metadata.name
5357
`
5458

5559
const rbacYamlExp = `kind: Role
@@ -100,34 +104,6 @@ roleRef:
100104
apiGroup: rbac.authorization.k8s.io
101105
`
102106

103-
const serviceYamlExp = `apiVersion: v1
104-
kind: Service
105-
metadata:
106-
name: app-operator
107-
labels:
108-
name: app-operator
109-
spec:
110-
selector:
111-
name: app-operator
112-
ports:
113-
- protocol: TCP
114-
targetPort: metrics
115-
port: 9090
116-
name: metrics`
117-
118-
const serviceMonitorYamlExp = `apiVersion: monitoring.coreos.com/v1
119-
kind: ServiceMonitor
120-
metadata:
121-
name: app-operator
122-
labels:
123-
name: app-operator
124-
spec:
125-
selector:
126-
matchLabels:
127-
name: app-operator
128-
endpoints:
129-
- port: metrics`
130-
131107
func TestGenDeploy(t *testing.T) {
132108
buf := &bytes.Buffer{}
133109
if err := renderCRDYaml(buf, appKind, appAPIVersion); err != nil {
@@ -152,20 +128,4 @@ func TestGenDeploy(t *testing.T) {
152128
if rbacYamlExp != buf.String() {
153129
t.Errorf(errorMessage, rbacYamlExp, buf.String())
154130
}
155-
156-
buf = &bytes.Buffer{}
157-
if err := renderServiceYaml(buf, appProjectName); err != nil {
158-
t.Error(err)
159-
}
160-
if serviceYamlExp != buf.String() {
161-
t.Errorf("want %v, got %v", serviceYamlExp, buf.String())
162-
}
163-
164-
buf = &bytes.Buffer{}
165-
if err := renderServiceMonitorYaml(buf, appProjectName); err != nil {
166-
t.Error(err)
167-
}
168-
if serviceMonitorYamlExp != buf.String() {
169-
t.Errorf("want %v, got %v", serviceMonitorYamlExp, buf.String())
170-
}
171131
}

pkg/generator/gen_main_test.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,25 @@ func printVersion() {
4545
logrus.Infof("operator prometheus port :%s", promPort)
4646
}
4747
48+
func initOperatorService() {
49+
service, err := k8sutil.InitOperatorService()
50+
if err != nil {
51+
logrus.Fatalf("Failed to init operator service: %v", err)
52+
}
53+
err = sdk.Create(service)
54+
if err != nil {
55+
logrus.Infof("Failed to create operator service: %v", err)
56+
return
57+
}
58+
logrus.Infof("Service %s have been created", service.Name)
59+
}
60+
4861
func main() {
4962
printVersion()
63+
initOperatorService()
5064
5165
http.Handle("/metrics", promhttp.Handler())
52-
logrus.Fatalf("%s", http.ListenAndServe(promPort, nil))
66+
go http.ListenAndServe(promPort, nil)
5367
5468
resource := "app.example.com/v1alpha1"
5569
kind := "AppService"

pkg/generator/generator.go

-36
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ const (
5454
gopkglock = "Gopkg.lock"
5555
config = "config.yaml"
5656
operatorYaml = deployDir + "/operator.yaml"
57-
serviceYaml = "service.yaml"
58-
serviceMonitorYaml = "serviceMonitor.yaml"
5957
rbacYaml = "rbac.yaml"
6058
crYaml = "cr.yaml"
6159
catalogPackageYaml = "package.yaml"
@@ -208,22 +206,6 @@ func renderDeployFiles(deployDir, projectName, apiVersion, kind string) error {
208206
return err
209207
}
210208

211-
buf = &bytes.Buffer{}
212-
if err := renderServiceYaml(buf, projectName); err != nil {
213-
return err
214-
}
215-
if err := writeFileAndPrint(filepath.Join(deployDir, serviceYaml), buf.Bytes(), defaultFileMode); err != nil {
216-
return err
217-
}
218-
219-
buf = &bytes.Buffer{}
220-
if err := renderServiceMonitorYaml(buf, projectName); err != nil {
221-
return err
222-
}
223-
if err := writeFileAndPrint(filepath.Join(deployDir, serviceMonitorYaml), buf.Bytes(), defaultFileMode); err != nil {
224-
return err
225-
}
226-
227209
buf = &bytes.Buffer{}
228210
if err := renderCRDYaml(buf, kind, apiVersion); err != nil {
229211
return err
@@ -248,24 +230,6 @@ func RenderOperatorYaml(c *Config, image string) error {
248230
return ioutil.WriteFile(operatorYaml, buf.Bytes(), defaultFileMode)
249231
}
250232

251-
// RenderServiceYaml generates "deploy/service.yaml"
252-
func RenderServiceYaml(c *Config) error {
253-
buf := &bytes.Buffer{}
254-
if err := renderServiceYaml(buf, c.ProjectName); err != nil {
255-
return err
256-
}
257-
return ioutil.WriteFile(serviceYaml, buf.Bytes(), defaultFileMode)
258-
}
259-
260-
// RenderServiceMonitorYaml generates "deploy/serviceMonitor.yaml"
261-
func RenderServiceMonitorYaml(c *Config) error {
262-
buf := &bytes.Buffer{}
263-
if err := renderServiceMonitorYaml(buf, c.ProjectName); err != nil {
264-
return err
265-
}
266-
return ioutil.WriteFile(serviceMonitorYaml, buf.Bytes(), defaultFileMode)
267-
}
268-
269233
// RenderOlmCatalog generates catalog manifests "deploy/olm-catalog/*"
270234
// The current working directory must be the project repository root
271235
func RenderOlmCatalog(c *Config, image, version string) error {

pkg/generator/main_tmpl.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,25 @@ func printVersion() {
4141
logrus.Infof("operator prometheus port :%s", promPort)
4242
}
4343
44+
func initOperatorService() {
45+
service, err := k8sutil.InitOperatorService()
46+
if err != nil {
47+
logrus.Fatalf("Failed to init operator service: %v", err)
48+
}
49+
err = sdk.Create(service)
50+
if err != nil {
51+
logrus.Infof("Failed to create operator service: %v", err)
52+
return
53+
}
54+
logrus.Infof("Service %s have been created", service.Name)
55+
}
56+
4457
func main() {
4558
printVersion()
59+
initOperatorService()
4660
4761
http.Handle("/metrics", promhttp.Handler())
48-
logrus.Fatalf("%s", http.ListenAndServe(promPort, nil))
62+
go http.ListenAndServe(promPort, nil)
4963
5064
resource := "{{.APIVersion}}"
5165
kind := "{{.Kind}}"

0 commit comments

Comments
 (0)