Update zuul_cluster to use cr metadata

Also refactor the roles to share group_vars and common tasks
This commit is contained in:
Tristan Cacqueray 2019-04-04 05:32:54 +00:00
parent 9cbe822f81
commit 996737d56d
16 changed files with 197 additions and 295 deletions

View File

@ -65,7 +65,7 @@ $ oc logs zuul-operator-c64756f66-rbdmg -c operator
```
$ oc apply -f - <<EOF
apiVersion: zuul-ci.org/v1alpha1
kind: Zuul
kind: ZuulService
metadata:
name: example-zuul
spec:
@ -80,7 +80,19 @@ spec:
EOF
zuul.zuul-ci.org/example-zuul created
$ oc get zuul
$ oc get zuulservice
NAME AGE
example-zuul 16s
example-zuul 10s
$ oc get pods
example-zuul-executor-696f969c4-6cpjv 1/1 Running 0 8s
example-zuul-scheduler-77b6cf7967-ksh64 1/1 Running 0 11s
example-zuul-web-5f744f89c9-qjp9l 1/1 Running 0 6s
example-zuul-zk-0 1/1 Running 0 22s
$ oc get svc
example-zuul-web ClusterIP 172.30.209.181 <none> 80/TCP 41s
$ curl 172.30.209.181/api/info
{"info": {"capabilities": {"job_history": false}, "websocket_url": null, "stats": {"prefix": null, "type": "graphite", "url": null}}}
```

View File

@ -1,25 +1,7 @@
---
namespace: "default"
state: "present"
zuul_app_name: "zuul"
zuul_cluster_name: "zuul"
zuul_version: "latest" #"3.7.1"
zuul_image_name: "docker.io/zuul/zuul"
zuul_image_name_scheduler: "{{ zuul_image_name }}-scheduler:{{ zuul_version }}"
zuul_image_name_merger: "{{ zuul_image_name }}-merger:{{ zuul_version }}"
zuul_image_name_executor: "{{ zuul_image_name }}-executor:{{ zuul_version }}"
zuul_image_name_web: "{{ zuul_image_name }}-web:{{ zuul_version }}"
zuul_service_account_name: "zuul-operator"
zuul_configmap_name: "{{ zuul_cluster_name }}-config"
zk_cluster_name: "example-zk"
zk_api_version: "zookeeper.pravega.io/v1beta1"
# Default cr spec
meta:
name: demozuul
tenants: []
connections: []
merger:
@ -28,3 +10,23 @@ executor:
instances: 1
web:
instances: 1
namespace: "{{ meta.namespace|default('default') }}"
state: "present"
zuul_app_name: "zuul"
zuul_cluster_name: "{{ meta.name }}"
zuul_version: "latest" #"3.7.1"
zuul_image_name_base: "docker.io/zuul/zuul"
zuul_image_name:
scheduler: "{{ zuul_image_name_base }}-scheduler:{{ zuul_version }}"
merger: "{{ zuul_image_name_base }}-merger:{{ zuul_version }}"
executor: "{{ zuul_image_name_base }}-executor:{{ zuul_version }}"
web: "{{ zuul_image_name_base }}-web:{{ zuul_version }}"
zuul_service_account_name: "zuul-operator"
zuul_image_pull_policy: "IfNotPresent"
zuul_configmap_name: "{{ zuul_cluster_name }}-config"
zk_cluster_name: "{{ zuul_cluster_name }}-zk"
zk_api_version: "zookeeper.pravega.io/v1beta1"

View File

@ -3,8 +3,8 @@
k8s:
state: "{{ state }}"
definition:
apiVersion: v1
kind: ConfigMap
apiVersion: v1
metadata:
name: "{{ zuul_configmap_name }}-scheduler"
namespace: "{{ namespace }}"
@ -28,20 +28,34 @@
{% for connection in connections %}
[connection {{ connection["name"] }}]
driver={{ connection["driver"] }}
server={{ connection["server"] }}
{% for k, v in connection.items() %}{% if k != "name" %}
{{ k }}={{ v }}
{% endif %}{% endfor %}
{% endfor %}
"main.yaml": |
{{ tenants|to_yaml }}
register: scheduler_config
- name: Register if tenant config changed
set_fact:
tenant_config_updated: >-
{% if (scheduler_config is changed and
scheduler_config.diff and
'main.yaml' in scheduler_config.diff[-1][1]) %}True
{% endif %}
- debug:
msg: "Tenant config is updated"
when: tenant_config_updated
- name: Create the zuul service configmap
k8s:
state: "{{ state }}"
definition:
apiVersion: v1
kind: ConfigMap
apiVersion: v1
metadata:
name: "{{ zuul_configmap_name }}"
namespace: "{{ namespace }}"
@ -51,15 +65,20 @@
data:
"zuul.conf": |
[gearman]
server=zuul-scheduler
server={{ zuul_cluster_name }}-scheduler
port=4730
[zookeeper]
hosts={{ zk_cluster_name }}-client:2181
[web]
listen_address=0.0.0.0
port=9000
{% for connection in connections %}
[connection {{ connection["name"] }}]
driver={{ connection["driver"] }}
server={{ connection["server"] }}
{% for k, v in connection.items() %}{% if k != "name" %}
{{ k }}={{ v }}
{% endif %}{% endfor %}
{% endfor %}

View File

@ -1 +0,0 @@
zuul_image_pull_policy: IfNotPresent

View File

@ -0,0 +1,47 @@
- name: Create Deployment
k8s:
state: "{{ state }}"
definition:
kind: "Deployment"
apiVersion: "extensions/v1beta1"
metadata:
name: "{{ zuul_cluster_name }}-{{ deployment_name }}"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
annotations:
configHash: ""
spec:
replicas: "{{ deployment_replicas|default(1) }}"
selector:
matchLabels:
app: "{{ zuul_cluster_name }}-{{ deployment_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
template:
metadata:
name: "{{ zuul_cluster_name }}-{{ deployment_name }}"
labels:
app: "{{ zuul_cluster_name }}-{{ deployment_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
containers:
- name: "{{ zuul_cluster_name }}-{{ deployment_name }}"
image: "{{ zuul_image_name[deployment_name] }}"
imagePullPolicy: "{{ zuul_image_pull_policy }}"
ports: "{{ deployment_ports|default([]) }}"
volumeMounts:
- mountPath: "/etc/zuul"
name: zuul-config-volume
readOnly: true
- mountPath: "/var/lib/zuul"
name: zuul-data-volume
command:
- "zuul-{{ deployment_name }}"
- "-d"
volumes:
- name: zuul-config-volume
configMap:
name: "{{ deployment_config|default(zuul_configmap_name) }}"
- name: zuul-data-volume
emptyDir: {}

View File

@ -0,0 +1,18 @@
- name: Create Service
k8s:
state: "{{ state }}"
definition:
kind: Service
apiVersion: v1
metadata:
name: "{{ zuul_cluster_name }}-{{ service_name }}"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
type: ClusterIP
selector:
app: "{{ zuul_cluster_name }}-{{ service_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
ports: "{{ service_ports }}"

View File

@ -1,229 +1,56 @@
---
- name: Scheduler Deployment
k8s:
definition:
kind: "Deployment"
apiVersion: "extensions/v1beta1"
metadata:
name: "{{ zuul_cluster_name }}-scheduler"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}-scheduler"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
replicas: 1
selector:
matchLabels:
app: "{{ zuul_app_name }}-scheduler"
zuul_cluster: "{{ zuul_cluster_name }}"
template:
metadata:
name: "{{ zuul_cluster_name }}-scheduler"
labels:
app: "{{ zuul_app_name }}-scheduler"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
serviceAccountName: "{{ zuul_service_account_name }}"
containers:
- name: zuul-scheduler
image: "{{ zuul_image_name_scheduler }}"
imagePullPolicy: "{{ zuul_image_pull_policy }}"
ports:
- containerPort: 4730
protocol: "TCP"
volumeMounts:
- mountPath: "/etc/zuul"
name: zuul-config-volume
readOnly: true
- mountPath: "/var/lib/zuul"
name: zuul-data-volume
command:
- "zuul-scheduler"
- "-d"
volumes:
- name: zuul-config-volume
configMap:
name: "{{ zuul_configmap_name }}-scheduler"
- name: zuul-data-volume
emptyDir: {}
vars:
deployment_name: scheduler
deployment_ports:
- containerPort: 4730
protocol: "TCP"
deployment_config: "{{ zuul_configmap_name }}-scheduler"
include_tasks: "./create_deployment.yaml"
register: sched_deployment
- name: Create Scheduler service
k8s:
state: "{{ state }}"
definition:
apiVersion: v1
kind: Service
metadata:
name: "{{ zuul_cluster_name }}-scheduler"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
type: ClusterIP
selector:
app: "{{ zuul_app_name }}-scheduler"
zuul_cluster: "{{ zuul_cluster_name }}"
ports:
- name: "gearman"
port: 4730
protocol: TCP
when: (services_lookup|default([])|length==0)
- name: Scheduler service
vars:
service_name: scheduler
service_ports:
- name: "gearman"
port: 4730
protocol: TCP
include_tasks: "./create_service.yaml"
- name: Reload scheduler
include_tasks: "./reload_scheduler.yaml"
when:
- sched_deployment is not changed
- tenant_config_updated
- name: Merger Deployment
k8s:
definition:
kind: "Deployment"
apiVersion: "extensions/v1beta1"
metadata:
name: "{{ zuul_cluster_name }}-merger"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}-merger"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
replicas: "{{ merger.instances }}"
selector:
matchLabels:
app: "{{ zuul_app_name }}-merger"
zuul_cluster: "{{ zuul_cluster_name }}"
template:
metadata:
name: "{{ zuul_cluster_name }}-merger"
labels:
app: "{{ zuul_app_name }}-merger"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
serviceAccountName: "{{ zuul_service_account_name }}"
containers:
- name: zuul-merger
image: "{{ zuul_image_name_merger }}"
imagePullPolicy: "{{ zuul_image_pull_policy }}"
volumeMounts:
- mountPath: "/etc/zuul"
name: zuul-config-volume
readOnly: true
- mountPath: "/var/lib/zuul"
name: zuul-data-volume
command:
- "zuul-merger"
- "-d"
volumes:
- name: zuul-config-volume
configMap:
name: "{{ zuul_configmap_name }}"
- name: zuul-data-volume
emptyDir: {}
vars:
deployment_name: merger
deployment_replicas: "{{ merger.instances }}"
include_tasks: "./create_deployment.yaml"
- name: Executor Deployment
k8s:
definition:
kind: "Deployment"
apiVersion: "extensions/v1beta1"
metadata:
name: "{{ zuul_cluster_name }}-executor"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}-executor"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
replicas: "{{ executor.instances }}"
selector:
matchLabels:
app: "{{ zuul_app_name }}-executor"
zuul_cluster: "{{ zuul_cluster_name }}"
template:
metadata:
name: "{{ zuul_cluster_name }}-executor"
labels:
app: "{{ zuul_app_name }}-executor"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
serviceAccountName: "{{ zuul_service_account_name }}"
containers:
- name: zuul-executor
image: "{{ zuul_image_name_executor }}"
imagePullPolicy: "{{ zuul_image_pull_policy }}"
volumeMounts:
- mountPath: "/etc/zuul"
name: zuul-config-volume
readOnly: true
- mountPath: "/var/lib/zuul"
name: zuul-data-volume
command:
- "zuul-executor"
- "-d"
volumes:
- name: zuul-config-volume
configMap:
name: "{{ zuul_configmap_name }}"
- name: zuul-data-volume
emptyDir: {}
vars:
deployment_name: executor
deployment_replicas: "{{ executor.instances }}"
include_tasks: "./create_deployment.yaml"
- name: Web Deployment
k8s:
definition:
kind: "Deployment"
apiVersion: "extensions/v1beta1"
metadata:
name: "{{ zuul_cluster_name }}-web"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}-web"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
replicas: "{{ web.instances }}"
selector:
matchLabels:
app: "{{ zuul_app_name }}-web"
zuul_cluster: "{{ zuul_cluster_name }}"
template:
metadata:
name: "{{ zuul_cluster_name }}-web"
labels:
app: "{{ zuul_app_name }}-web"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
serviceAccountName: "{{ zuul_service_account_name }}"
containers:
- name: zuul-web
image: "{{ zuul_image_name_web }}"
imagePullPolicy: "{{ zuul_image_pull_policy }}"
volumeMounts:
- mountPath: "/etc/zuul"
name: zuul-config-volume
readOnly: true
- mountPath: "/var/lib/zuul"
name: zuul-data-volume
command:
- "zuul-web"
- "-d"
volumes:
- name: zuul-config-volume
configMap:
name: "{{ zuul_configmap_name }}"
- name: zuul-data-volume
emptyDir: {}
vars:
deployment_name: web
deployment_replicas: "{{ web.instances }}"
deployment_ports:
- containerPort: 9000
protocol: "TCP"
include_tasks: "./create_deployment.yaml"
- name: Create Web service
k8s:
state: "{{ state }}"
definition:
apiVersion: v1
kind: Service
metadata:
name: "{{ zuul_cluster_name }}-web"
namespace: "{{ namespace }}"
labels:
app: "{{ zuul_app_name }}"
zuul_cluster: "{{ zuul_cluster_name }}"
spec:
type: ClusterIP
selector:
app: "{{ zuul_app_name }}-web"
zuul_cluster: "{{ zuul_cluster_name }}"
ports:
- name: "web"
port: 9000
protocol: TCP
targetPort: 9000
- name: Web Service
vars:
service_name: web
service_ports:
- name: "web"
port: 80
protocol: TCP
targetPort: 9000
include_tasks: "./create_service.yaml"

View File

@ -0,0 +1,3 @@
---
- name: Add scheduler pod to the inventory
command: echo TODO...

View File

@ -1,2 +0,0 @@
---
state: "present"

View File

@ -1,6 +1,7 @@
---
- set_fact:
label_selector_value: "zuul_cluster={{ zuul_cluster_name }},app={{ zuul_app_name }}"
sched_selector_value: "zuul_cluster={{ zuul_cluster_name }},app={{ zuul_cluster_name }}-scheduler"
- name: lookup k8s secrets
set_fact:
@ -10,19 +11,15 @@
set_fact:
zk_cr_lookup: "{{ lookup('k8s', api_version=zk_api_version, kind='ZookeeperCluster', namespace=namespace, resource_name=zk_cluster_name) }}"
- name: lookup k8s configmap
- name: lookup scheduler pod
set_fact:
configmap_lookup: "{{ lookup('k8s', api_version='v1', kind='ConfigMap', namespace=namespace, resource_name=zuul_configmap_name) }}"
zuul_scheduler_pod: "{{ lookup('k8s', api_version='v1', kind='Pod', namespace=namespace, label_selector=sched_selector_value) }}"
- name: lookup k8s Zuul cluster service
set_fact:
services_lookup: "{{ lookup('k8s', api_version='v1', kind='Service', namespace=namespace, label_selector=label_selector_value) }}"
- name: lookup k8s Zuul cluster deployment
- name: lookup k8s Zuul deployment
set_fact:
zuul_deployment_lookup: "{{ lookup('k8s', api_version='extensions/v1beta1', kind='Deployment', namespace=namespace, resource_name=zuul_cluster_name) }}"
- name: Get currently deployed Zuul image name
- name: get currently deployed Zuul image name
set_fact:
current_deployed_image: "{{ zuul_deployment_lookup.spec.template.spec.containers['name'=='zuul'].image }}"
when: zuul_deployment_lookup.spec is defined

View File

@ -3,6 +3,8 @@
gather_facts: no
tasks:
- debug: msg="Running Zuul Operator Playbook"
- name: Show the env
command: env
- import_role:
name: get_status
- import_role:

View File

@ -1,5 +1,5 @@
apiVersion: zuul-ci.org/v1alpha1
kind: Zuul
apiVersion: operator.zuul-ci.org/v1alpha1
kind: ZuulService
metadata:
name: example-zuul
spec:

View File

@ -1,18 +1,19 @@
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: zuuls.zuul-ci.org
name: zuulservices.operator.zuul-ci.org
spec:
group: zuul-ci.org
group: operator.zuul-ci.org
names:
kind: Zuul
listKind: ZuulList
plural: zuuls
singular: zuul
kind: ZuulService
listKind: ZuulServiceList
plural: zuulservices
singular: zuulservice
shortNames:
- zuul
scope: Namespaced
subresources:
status: {}
version: v1alpha1
versions:
- name: v1alpha1
served: true

View File

@ -55,7 +55,7 @@ rules:
verbs:
- update
- apiGroups:
- zuul-ci.org
- operator.zuul-ci.org
resources:
- '*'
verbs:

View File

@ -1,23 +0,0 @@
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: zuul-operator
subjects:
- kind: ServiceAccount
name: zuul-operator
roleRef:
kind: Role
name: zuul-operator
apiGroup: rbac.authorization.k8s.io
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: zookeeper-operator
subjects:
- kind: ServiceAccount
name: zuul-operator
roleRef:
kind: Role
name: zookeeper-operator
apiGroup: rbac.authorization.k8s.io

View File

@ -1,5 +1,5 @@
---
- version: v1alpha1
group: zuul-ci.org
kind: Zuul
group: operator.zuul-ci.org
kind: ZuulService
playbook: /opt/ansible/zuul.yaml