Skip to content

Commit d48ae76

Browse files
committed
Add ocp-29871-resquota
1 parent b2d40b9 commit d48ae76

File tree

12 files changed

+401
-0
lines changed

12 files changed

+401
-0
lines changed

roles/migration_getfacts/defaults/main.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ apis:
88
rolebinding:
99
default: "rbac.authorization.k8s.io/v1beta1"
1010
"3.7": "v1"
11+
deployment:
12+
default: "apps/v1"
13+
"3.7": "extensions/v1beta1"
1114
daemonset:
1215
default: "apps/v1"
1316
"3.7": "extensions/v1beta1"

roles/migration_getfacts/tasks/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
cronjob_api: "{{ apis.cronjob.get(oc_version, apis.cronjob.get('default')) }}"
4242
role_api: "{{ apis.role.get(oc_version, apis.role.get('default')) }}"
4343
rolebinding_api: "{{ apis.rolebinding.get(oc_version, apis.rolebinding.get('default')) }}"
44+
deployment_api: "{{ apis.deployment.get(oc_version, apis.deployment.get('default')) }}"
4445
daemonset_api: "{{ apis.daemonset.get(oc_version, apis.daemonset.get('default')) }}"
4546
replicaset_api: "{{ apis.replicaset.get(oc_version, apis.replicaset.get('default')) }}"
4647
statefulset_api: "{{ apis.statefulset.get(oc_version, apis.statefulset.get('default')) }}"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
namespace: "ocp-29871-resquota"
2+
3+
app_name: nginxapp
4+
storage_size: 1Mi
5+
html_accessmode: ReadWriteOnce
6+
logs_accessmode: ReadWriteOnce
7+
8+
migration_sample_name: "ocp-29871-resquota"
9+
migration_plan_name: "{{ migration_sample_name }}-migplan-{{ ansible_date_time.epoch }}"
10+
migration_name: "{{ migration_sample_name }}-mig-{{ ansible_date_time.epoch }}"
11+
12+
with_deploy: true
13+
with_migrate: true
14+
with_cleanup: true
15+
with_validate: true
16+
pv: false
17+
quiesce: false
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
- name: Check namespace
2+
k8s_facts:
3+
kind: Namespace
4+
name: "{{ namespace }}"
5+
register: ns
6+
7+
- name: Create namespace
8+
shell: "{{ oc_binary }} new-project {{ namespace }} --skip-config-write=true"
9+
when: ns.resources | length == 0
10+
11+
12+
- name: Get LimitRange
13+
k8s_info:
14+
kind: LimitRange
15+
namespace: "{{ namespace }}"
16+
register: limitrange
17+
until: limitrange.resources | length > 0
18+
ignore_errors: true
19+
20+
- name: Remove LimitRanges so that default limit ranges dont interfere with the test
21+
k8s:
22+
kind: LimitRange
23+
state : absent
24+
namespace: "{{ namespace }}"
25+
name: "{{ item.metadata.name }}"
26+
loop: "{{ limitrange.resources | default([]) }}"
27+
28+
- name: Create resource quota
29+
k8s:
30+
state : present
31+
definition: "{{ lookup('template', 'resourcequota.yml.j2' )}}"
32+
33+
- name: Create nginx deployment
34+
k8s:
35+
state : present
36+
definition: "{{ lookup('template', 'nginx-deployment.yml.j2' )}}"
37+
38+
- name: Wait unti nginx is up
39+
k8s_facts:
40+
kind: Pod
41+
namespace: "{{ namespace }}"
42+
label_selectors: "app={{ app_name }}"
43+
field_selectors:
44+
- status.phase=Running
45+
register: pod
46+
until: "true in (pod | json_query('resources[].status.containerStatuses[].ready'))"
47+
retries: 30
48+
49+
- name: Upload an index html file
50+
shell: "{{ oc_binary }} -n {{ namespace }} rsh $( {{oc_binary}} get pods -n {{ namespace }} -o jsonpath='{.items[0].metadata.name}') sh -c 'echo \"<h1>HELLO WORLD</h1>\" > /usr/share/nginx/html/index.html'"
51+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
- name: Get oc facts
2+
include_role:
3+
name: migration_getfacts
4+
5+
- name: Cleanup resources
6+
include_role:
7+
name: migration_cleanup
8+
when: with_cleanup|bool
9+
10+
- name: Create resources
11+
import_tasks: deploy.yml
12+
when: with_deploy|bool
13+
14+
- name: Start migration
15+
import_tasks: migrate.yml
16+
when: with_migrate|bool
17+
18+
- name: Track migration
19+
import_tasks: track.yml
20+
when: with_migrate|bool
21+
22+
- name: Validate migration
23+
import_tasks: validate.yml
24+
when: with_validate|bool
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- name: Execute migration
2+
include_role:
3+
name: migration_run
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- name: Track migration
2+
include_role:
3+
name: migration_track
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
- name: Get Quota
2+
k8s_info:
3+
kind: ResourceQuota
4+
namespace: "{{ namespace }}"
5+
register: quota
6+
retries: 20
7+
until: quota.resources | length > 0
8+
9+
- name: Get Pods
10+
k8s_info:
11+
kind: Pod
12+
namespace: "{{ namespace }}"
13+
label_selectors: "app={{ app_name }}"
14+
register: pod
15+
retries: 20
16+
until: pod.resources | length > 0
17+
18+
#- fail:
19+
# msg: "There should be only one pod present, before and after the migration."
20+
# when: pod.resources == 1
21+
22+
- name: Scale deployment and check that no more pods are allowed
23+
k8s:
24+
api_version: "{{ deployment_api }}"
25+
kind: Deployment
26+
name: "{{ app_name }}-deployment"
27+
namespace: "{{ namespace }}"
28+
definition:
29+
spec:
30+
replicas: 2
31+
register: scale
32+
33+
- name: Get ReplicaSet
34+
k8s_info:
35+
api_version: "{{ deployment_api }}"
36+
kind: ReplicaSet
37+
namespace: "{{ namespace }}"
38+
label_selectors: "app={{ app_name }}"
39+
register: replica
40+
until: replica.resources | length > 0
41+
42+
#- fail:
43+
# msg: "ReplicaSet should not have created new pods, because resourcequota does not allow it"
44+
# when: (replica.resources | first ).status.get('conditions', {}) | list | selectattr( 'type', 'equalto', 'ReplicaFailure') | list | length == 0
45+
46+
- name: Scale down again
47+
k8s:
48+
api_version: "{{ deployment_api }}"
49+
kind: Deployment
50+
name: "{{ app_name }}-deployment"
51+
namespace: "{{ namespace }}"
52+
definition:
53+
spec:
54+
replicas: 1
55+
56+
- name: Get Pods
57+
k8s_info:
58+
kind: Pod
59+
namespace: "{{ namespace }}"
60+
label_selectors: "app={{ app_name }}"
61+
register: pod
62+
retries: 20
63+
until: pod.resources | length == 1
64+
65+
- name: Check that no LoadBalancer can be created
66+
k8s:
67+
state : present
68+
definition: "{{ lookup('template', 'service.yml.j2' ) }}"
69+
vars:
70+
service_type: 'LoadBalancer'
71+
service_app: 'balancersvc'
72+
register: lbalancer
73+
ignore_errors: true
74+
75+
- fail:
76+
msg: "FAILURE. Resource quota should not allow to create more LoadBalancers"
77+
when: lbalancer.failed != true or lbalancer.error != 403
78+
79+
- name: Check that no NodePort can be created
80+
k8s:
81+
state : present
82+
definition: "{{ lookup('template', 'service.yml.j2' )}}"
83+
vars:
84+
service_type: 'NodePort'
85+
service_app: 'podeportrsvc'
86+
register: nodeport
87+
ignore_errors: true
88+
89+
- fail:
90+
msg: "FAILURE. Resource quota should not allow to create more NodePort services"
91+
when: nodeport.failed != true or nodeport.error != 403
92+
93+
- name: Check that a ClusterIP service can be created. No resourcequota limit reached.
94+
k8s:
95+
state : present
96+
definition: "{{ lookup('template', 'service.yml.j2' )}}"
97+
vars:
98+
service_type: 'ClusterIP'
99+
service_app: 'clustersvc'
100+
register: clusterip
101+
102+
- name: Remove the created ClusterIP service
103+
k8s:
104+
state : absent
105+
definition: "{{ lookup('template', 'service.yml.j2' )}}"
106+
vars:
107+
service_type: 'ClusterIP'
108+
service_app: 'clustersvc'
109+
register: clusterip
110+
111+
- name: Check that no more PVCs can be created
112+
k8s:
113+
state : present
114+
definition: "{{ lookup('template', 'persistent-volume-claim.yml.j2' )}}"
115+
register: pvc
116+
ignore_errors: true
117+
118+
- fail:
119+
msg: "FAILURE. Resource quota should not allow to create pvcs"
120+
when: pvc.failed != true or pvc.error != 403
121+
122+
- name: Get route
123+
k8s_facts:
124+
kind: Route
125+
namespace: "{{ namespace }}"
126+
label_selectors: "app={{ app_name }}"
127+
register: nginx_route
128+
until: nginx_route.resources | length > 0
129+
retries: 30
130+
131+
- name: Wait for pods running
132+
k8s_info:
133+
kind: Pod
134+
namespace: "{{ namespace }}"
135+
label_selectors: "app={{ app_name }}"
136+
field_selectors:
137+
- status.phase=Running
138+
register: pod
139+
retries: 20
140+
until: pod.resources | length == 1
141+
142+
- name: Acces the html file
143+
uri:
144+
url: http://{{ nginx_route.resources[0].spec.host }}
145+
method: GET
146+
status_code: 200
147+
retries: 10
148+
register: req
149+
until: req.status == 200
150+
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
apiVersion: v1
2+
items:
3+
- apiVersion: v1
4+
kind: PersistentVolumeClaim
5+
metadata:
6+
labels:
7+
app: {{ app_name }}
8+
name: {{ app_name }}-logs
9+
namespace: {{ namespace }}
10+
spec:
11+
accessModes:
12+
- {{ logs_accessmode }}
13+
resources:
14+
requests:
15+
storage: {{ storage_size }}
16+
{% if storage_class is defined and storage_class != "default" %}
17+
storageClassName: {{ storage_class | quote }}
18+
{% endif %}
19+
- apiVersion: v1
20+
kind: PersistentVolumeClaim
21+
metadata:
22+
labels:
23+
app: {{ app_name }}
24+
name: {{ app_name }}-html
25+
namespace: {{ namespace }}
26+
spec:
27+
accessModes:
28+
- {{ html_accessmode }}
29+
resources:
30+
requests:
31+
storage: 50Mi
32+
{% if storage_class is defined and storage_class != "default" %}
33+
storageClassName: {{ storage_class | quote }}
34+
{% endif %}
35+
- apiVersion: {{ deployment_api }}
36+
kind: Deployment
37+
metadata:
38+
labels:
39+
app: {{ app_name }}
40+
name: {{ app_name }}-deployment
41+
namespace: {{ namespace }}
42+
spec:
43+
replicas: 1
44+
selector:
45+
matchLabels:
46+
app: {{ app_name }}
47+
template:
48+
metadata:
49+
labels:
50+
app: {{ app_name }}
51+
spec:
52+
containers:
53+
- image: docker.io/twalter/openshift-nginx
54+
resources:
55+
limits:
56+
cpu: "1"
57+
memory: 128Mi
58+
name: {{ app_name }}
59+
ports:
60+
- containerPort: 8081
61+
volumeMounts:
62+
- mountPath: /var/log/nginx
63+
name: {{ app_name }}-logs
64+
readOnly: false
65+
- mountPath: /usr/share/nginx/html
66+
name: {{ app_name }}-html
67+
readOnly: false
68+
volumes:
69+
- name: {{ app_name }}-logs
70+
persistentVolumeClaim:
71+
claimName: {{ app_name }}-logs
72+
- name: {{ app_name }}-html
73+
persistentVolumeClaim:
74+
claimName: {{ app_name }}-html
75+
- apiVersion: v1
76+
kind: Service
77+
metadata:
78+
labels:
79+
app: {{ app_name }}
80+
name: my-{{ app_name }}
81+
namespace: {{ namespace }}
82+
spec:
83+
ports:
84+
- port: 8081
85+
targetPort: 8081
86+
selector:
87+
app: {{ app_name }}
88+
type: ClusterIP
89+
- apiVersion: route.openshift.io/v1
90+
kind: Route
91+
metadata:
92+
labels:
93+
app: {{ app_name }}
94+
service: my-{{ app_name }}
95+
name: my-{{ app_name }}
96+
namespace: {{ namespace }}
97+
spec:
98+
port:
99+
targetPort: 8081
100+
to:
101+
kind: Service
102+
name: my-{{ app_name }}
103+
kind: List
104+
metadata: {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: PersistentVolumeClaim
3+
metadata:
4+
name: {{ namespace }}-test
5+
namespace: {{ namespace }}
6+
spec:
7+
storageClassName: manual
8+
accessModes:
9+
- ReadWriteOnce
10+
resources:
11+
requests:
12+
storage: 1Mi

0 commit comments

Comments
 (0)