Skip to content

Commit 913162f

Browse files
committed
add molecule tests
1 parent bdeafd6 commit 913162f

File tree

5 files changed

+320
-0
lines changed

5 files changed

+320
-0
lines changed

molecule/default/asserts.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
3+
- name: Verify
4+
hosts: localhost
5+
connection: local
6+
vars:
7+
ansible_python_interpreter: '{{ ansible_playbook_python }}'
8+
deploy_dir: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/deploy"
9+
tasks:
10+
- block:
11+
- name: Assert that an address has been set on the custom resource
12+
assert:
13+
that: custom_resource.0.status.address is defined
14+
vars:
15+
custom_resource: "{{ q('k8s',
16+
api_version='games.fabianism.us/v1alpha1',
17+
kind='Minecraft',
18+
resource_name='example-minecraft',
19+
namespace=namespace
20+
)}}"
21+
22+
- name: Store address
23+
set_fact:
24+
address: "{{ q('k8s',
25+
api_version='games.fabianism.us/v1alpha1',
26+
kind='Minecraft',
27+
resource_name='example-minecraft',
28+
namespace=namespace
29+
).0.status.address}}"
30+
rescue:
31+
- name: Output CR
32+
debug: var=custom_resource
33+
vars:
34+
custom_resource: "{{ q('k8s',
35+
api_version='games.fabianism.us/v1alpha1',
36+
kind='Minecraft',
37+
resource_name='example-minecraft',
38+
namespace=namespace
39+
)}}"
40+
41+
- fail:
42+
msg: "Failed in asserts.yml"
43+
44+
- import_playbook: '{{ playbook_dir }}/../default/asserts.yml'

molecule/default/molecule.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
dependency:
3+
name: galaxy
4+
driver:
5+
name: docker
6+
lint:
7+
name: yamllint
8+
enabled: False
9+
platforms:
10+
- name: kind-test-local
11+
groups:
12+
- k8s
13+
image: bsycorp/kind:latest-1.12
14+
privileged: True
15+
override_command: no
16+
exposed_ports:
17+
- 8443/tcp
18+
- 10080/tcp
19+
published_ports:
20+
- 0.0.0.0:${TEST_CLUSTER_PORT:-10443}:8443/tcp
21+
pre_build_image: yes
22+
volumes:
23+
- ${MOLECULE_PROJECT_DIRECTORY}:/src/mc-router:Z
24+
provisioner:
25+
name: ansible
26+
log: True
27+
lint:
28+
name: ansible-lint
29+
enabled: False
30+
inventory:
31+
group_vars:
32+
all:
33+
namespace: ${TEST_NAMESPACE:-osdk-test}
34+
env:
35+
K8S_AUTH_KUBECONFIG: /tmp/molecule/kind-test-local/kubeconfig
36+
KUBECONFIG: /tmp/molecule/kind-test-local/kubeconfig
37+
KIND_PORT: '${TEST_CLUSTER_PORT:-10443}'
38+
scenario:
39+
name: default
40+
test_sequence:
41+
- lint
42+
- destroy
43+
- dependency
44+
- syntax
45+
- create
46+
- prepare
47+
- converge
48+
- side_effect
49+
- verify
50+
- destroy
51+
verifier:
52+
name: testinfra
53+
lint:
54+
name: flake8

molecule/default/playbook.yml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
---
2+
3+
- name: Build Controller in Kubernetes docker container
4+
hosts: k8s
5+
vars:
6+
image_name: games.fabianism.us/mc-router:testing
7+
tasks:
8+
# using command so we don't need to install any dependencies
9+
- name: Get existing image hash
10+
command: docker images -q {{image_name}}
11+
register: prev_hash
12+
changed_when: false
13+
14+
- name: Build Controller Image
15+
command: docker build -f /src/mc-router/Dockerfile.build -t {{ image_name }} /src/mc-router
16+
register: build_cmd
17+
changed_when: not prev_hash.stdout or (prev_hash.stdout and prev_hash.stdout not in ''.join(build_cmd.stdout_lines[-2:]))
18+
19+
- name: Converge
20+
hosts: localhost
21+
connection: local
22+
vars:
23+
ansible_python_interpreter: '{{ ansible_playbook_python }}'
24+
image_name: games.fabianism.us/mc-router:testing
25+
tasks:
26+
- block:
27+
- name: Delete the Operator Deployment
28+
k8s:
29+
state: absent
30+
namespace: '{{ namespace }}'
31+
name: mc-router
32+
api_version: apps/v1
33+
kind: Deployment
34+
register: delete_deployment
35+
when: hostvars[groups.k8s.0].build_cmd.changed
36+
37+
- name: Wait 30s for Operator Deployment to terminate
38+
k8s_facts:
39+
api_version: 'apps/v1'
40+
kind: 'Deployment'
41+
namespace: '{{ namespace }}'
42+
name: 'mc-router'
43+
register: deployment
44+
until: not deployment.resources
45+
delay: 3
46+
retries: 10
47+
when: delete_deployment.changed
48+
49+
- name: Create the Operator Deployment
50+
k8s:
51+
namespace: '{{ namespace }}'
52+
definition:
53+
apiVersion: apps/v1
54+
kind: Deployment
55+
metadata:
56+
labels:
57+
run: mc-router
58+
name: mc-router
59+
spec:
60+
selector:
61+
matchLabels:
62+
run: mc-router
63+
strategy:
64+
type: Recreate
65+
template:
66+
metadata:
67+
labels:
68+
run: mc-router
69+
spec:
70+
serviceAccountName: mc-router
71+
containers:
72+
- image: '{{ image_name }}'
73+
name: mc-router
74+
args: ["--api-binding", ":8080", "--in-kube-cluster"]
75+
ports:
76+
- name: proxy
77+
containerPort: 25565
78+
- name: web
79+
containerPort: 8080
80+
81+
- import_playbook: verify.yml

molecule/default/prepare.yml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
3+
- name: Prepare
4+
hosts: k8s
5+
gather_facts: no
6+
vars:
7+
kubeconfig: "{{ lookup('env', 'KUBECONFIG') }}"
8+
tasks:
9+
- name: delete the kubeconfig if present
10+
file:
11+
path: '{{ kubeconfig }}'
12+
state: absent
13+
delegate_to: localhost
14+
15+
- name: Fetch the kubeconfig
16+
fetch:
17+
dest: '{{ kubeconfig }}'
18+
flat: yes
19+
src: /root/.kube/config
20+
21+
- name: Change the kubeconfig port to the proper value
22+
replace:
23+
regexp: 8443
24+
replace: "{{ lookup('env', 'KIND_PORT') }}"
25+
path: '{{ kubeconfig }}'
26+
delegate_to: localhost
27+
28+
- name: Wait for the Kubernetes API to become available (this could take a minute)
29+
uri:
30+
url: "https://localhost:8443/apis"
31+
status_code: 200
32+
validate_certs: no
33+
register: result
34+
until: (result.status|default(-1)) == 200
35+
retries: 60
36+
delay: 5
37+
38+
- name: Prepare operator resources
39+
hosts: localhost
40+
connection: local
41+
vars:
42+
ansible_python_interpreter: '{{ ansible_playbook_python }}'
43+
deploy_dir: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/deploy"
44+
tasks:
45+
- name: Ensure specified namespace is present
46+
k8s:
47+
api_version: v1
48+
kind: Namespace
49+
name: '{{ namespace }}'
50+
51+
- name: Create RBAC resources and Service
52+
k8s:
53+
namespace: '{{ namespace }}'
54+
definition:
55+
- apiVersion: v1
56+
kind: ServiceAccount
57+
metadata:
58+
name: mc-router
59+
- apiVersion: rbac.authorization.k8s.io/v1
60+
kind: ClusterRole
61+
metadata:
62+
name: services-watcher
63+
rules:
64+
- apiGroups: [""]
65+
resources: ["services"]
66+
verbs: ["watch","list"]
67+
- apiVersion: rbac.authorization.k8s.io/v1
68+
kind: ClusterRoleBinding
69+
metadata:
70+
name: mc-router-services-watcher
71+
subjects:
72+
- kind: ServiceAccount
73+
name: mc-router
74+
namespace: '{{ namespace }}'
75+
roleRef:
76+
kind: ClusterRole
77+
name: services-watcher
78+
apiGroup: rbac.authorization.k8s.io
79+
- apiVersion: v1
80+
kind: Service
81+
metadata:
82+
name: mc-router
83+
spec:
84+
type: NodePort
85+
ports:
86+
- targetPort: web
87+
name: web
88+
port: 8080
89+
- targetPort: proxy
90+
name: proxy
91+
port: 25565
92+
selector:
93+
run: mc-router

molecule/default/verify.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
---
2+
3+
- hosts: localhost
4+
connection: local
5+
gather_facts: no
6+
vars:
7+
ansible_python_interpreter: '{{ ansible_playbook_python }}'
8+
tasks:
9+
- name: Wait for minecraft deployment to report ready
10+
k8s_facts:
11+
api_version: 'apps/v1'
12+
kind: 'Deployment'
13+
namespace: '{{ namespace }}'
14+
label_selectors:
15+
- 'app=example-minecraft'
16+
register: deployment
17+
until: "'MinimumReplicasAvailable' in (deployment | json_query('resources[].status.conditions[].reason'))"
18+
delay: 10
19+
retries: 60
20+
21+
- set_fact:
22+
address: 172.17.0.2:{{ node_port }}
23+
vars:
24+
node_port: "{{ q('k8s',
25+
api_version='v1',
26+
kind='Service',
27+
namespace=namespace,
28+
resource_name='mc-router'
29+
).0.spec.ports.1.nodePort }}"
30+
31+
- debug: var=address
32+
33+
- name: Wait two minutes to confirm server is reachable
34+
command: 'mcstatus {{ address }} ping'
35+
changed_when: false
36+
retries: 24
37+
delay: 5
38+
register: result
39+
until: not (result is failed)
40+
41+
- name: Fetch status of server
42+
command: 'mcstatus {{ address }} status'
43+
changed_when: false
44+
register: mcstatus
45+
46+
- name: Output status of server
47+
debug:
48+
var: mcstatus.stdout_lines

0 commit comments

Comments
 (0)