Skip to content

Commit 062cb3d

Browse files
committed
docker-compose development environment
This adjusts the development environment to use docker-compose which allows us to spin up a "fake" three node ganeti cluster with four instances "running". The clusters are setup using a fake hypervisor so it's not a complete replacement for developing against a real cluster, but it's as close as we can get. This also provides updates for the following: - Cleaned up the Dockerfile and moved parts of the work into a script - Switched to using a volume for /opt/ganeti_webmgr which allows for easier editing - Switched to using osuosl/django-centos image which already has stuff pre-included
1 parent 25f298c commit 062cb3d

10 files changed

+196
-30
lines changed

Dockerfile

-30
This file was deleted.

Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
dockerfiles/gwm.Dockerfile

docker-compose.yml

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
version: '3'
2+
services:
3+
node3:
4+
privileged: true
5+
domainname: ganetiwebmgr_ganeti
6+
hostname: node3
7+
container_name: node3
8+
image: ganeti:${VERSION:-2.15}
9+
volumes:
10+
- /sys/fs/cgroup:/sys/fs/cgroup:ro
11+
networks:
12+
ganeti:
13+
ipv4_address: "172.169.0.103"
14+
extra_hosts:
15+
- "cluster:172.169.0.100"
16+
cap_add:
17+
- NET_ADMIN
18+
build:
19+
context: .
20+
args:
21+
- VERSION=${VERSION:-2.15}
22+
dockerfile: dockerfiles/ganeti.Dockerfile
23+
node2:
24+
privileged: true
25+
domainname: ganetiwebmgr_ganeti
26+
hostname: node2
27+
container_name: node2
28+
image: ganeti:${VERSION:-2.15}
29+
volumes:
30+
- /sys/fs/cgroup:/sys/fs/cgroup:ro
31+
networks:
32+
ganeti:
33+
ipv4_address: "172.169.0.102"
34+
extra_hosts:
35+
- "cluster:172.169.0.100"
36+
cap_add:
37+
- NET_ADMIN
38+
build:
39+
context: .
40+
args:
41+
- VERSION=${VERSION:-2.15}
42+
dockerfile: dockerfiles/ganeti.Dockerfile
43+
cluster:
44+
privileged: true
45+
domainname: ganetiwebmgr_ganeti
46+
hostname: node1
47+
container_name: node1
48+
image: ganeti:${VERSION:-2.15}
49+
volumes:
50+
- /sys/fs/cgroup:/sys/fs/cgroup:ro
51+
networks:
52+
ganeti:
53+
ipv4_address: "172.169.0.101"
54+
extra_hosts:
55+
- "cluster:172.169.0.100"
56+
cap_add:
57+
- NET_ADMIN
58+
ports:
59+
- "2222:22"
60+
depends_on:
61+
- node2
62+
- node3
63+
links:
64+
- node2
65+
- node3
66+
build:
67+
context: .
68+
args:
69+
- VERSION=${VERSION:-2.15}
70+
dockerfile: dockerfiles/ganeti.Dockerfile
71+
web:
72+
build:
73+
context: .
74+
dockerfile: dockerfiles/gwm.Dockerfile
75+
command: /opt/ganeti_webmgr/dockerfiles/startup.sh
76+
volumes:
77+
- .:/opt/ganeti_webmgr
78+
networks:
79+
ganeti:
80+
ports:
81+
- "8000:8000"
82+
links:
83+
- cluster
84+
depends_on:
85+
- cluster
86+
networks:
87+
ganeti:
88+
ipam:
89+
driver: default
90+
config:
91+
-
92+
subnet: 172.169.0.0/16

dockerfiles/cleanup.sh

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set -xe
2+
[ -d /opt/ganeti_webmgr ] && chown --reference=/opt/ganeti_webmgr -R .

dockerfiles/ganeti.Dockerfile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
ARG VERSION="latest"
2+
FROM osuosl/ganeti:${VERSION}
3+
COPY dockerfiles/ganeti.sh /etc/rc.d/rc.local
4+
COPY dockerfiles/rapi.users /var/lib/ganeti/rapi/users
5+
COPY dockerfiles/id_rsa-ganeti /root/.ssh/id_rsa
6+
COPY dockerfiles/id_rsa-ganeti.pub /root/.ssh/authorized_keys
7+
RUN chmod +x /etc/rc.d/rc.local && echo "password" | passwd root --stdin
8+
CMD ["/sbin/init"]

dockerfiles/ganeti.sh

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
set -ex
3+
if [ "$(hostname)" == "localhost.localdomain" ] ; then
4+
hostname "$(cat /etc/hostname)"
5+
fi
6+
7+
if [ "$(hostname)" == "node1" ] ; then
8+
ganeti_ver="$(gnt-cluster --version | awk '{print $NF}')"
9+
no_drbd=""
10+
no_lvm=""
11+
disk_templates=""
12+
ipolicy=""
13+
if [ "$ganeti_ver" != "$(echo -e "${ganeti_ver}\n2.7.99" | sort -V | head -n1)" ] ; then
14+
disk_templates="--enabled-disk-templates=diskless"
15+
ipolicy="--ipolicy-bounds-specs=min:disk-size=0,cpu-count=1,disk-count=0,memory-size=1,nic-count=0,spindle-use=0/max:disk-size=1048576,cpu-count=8,disk-count=16,memory-size=32768,nic-count=8,spindle-use=12"
16+
fi
17+
if [ "$ganeti_ver" = "$(echo -e "${ganeti_ver}\n2.8.2" | sort -V | head -n1)" ] ; then
18+
no_lvm="--no-lvm-storage"
19+
fi
20+
if [ "$ganeti_ver" = "$(echo -e "${ganeti_ver}\n2.9.4" | sort -V | head -n1)" ] ; then
21+
no_drbd="--no-drbd-storage"
22+
fi
23+
gnt-cluster init --no-etc-hosts \
24+
--master-netdev=eth0 -N mode=routed,link=100 ${no_drbd} ${no_lvm} \
25+
--enabled-hypervisors=fake \
26+
${disk_templates} ${ipolicy} \
27+
cluster
28+
gnt-node add --no-ssh-key-check node2
29+
gnt-node add --no-ssh-key-check node3
30+
31+
for i in 1 2 3 4 ; do
32+
gnt-instance add -t diskless --no-ip-check --no-name-check -I hail \
33+
-o image+cirros --net 0:ip=192.168.1.10${i} instance${i}
34+
done
35+
fi
36+
touch /var/lock/subsys/local

dockerfiles/gwm.Dockerfile

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM osuosl/django-centos
2+
MAINTAINER OSU Open Source Lab, [email protected]
3+
4+
ENV DJANGO_SETTINGS_MODULE ganeti_webmgr.ganeti_web.settings
5+
# allows developer to set up a volume mount by keeping config out of source dir
6+
ENV GWM_CONFIG_DIR /opt/ganeti_webmgr_config
7+
8+
RUN yum install -y python-devel python-setuptools postgresql-devel gcc curl libffi-devel openssl-devel
9+
10+
WORKDIR /opt/ganeti_webmgr
11+
VOLUME /opt/ganeti_webmgr
12+
COPY ganeti_webmgr/ganeti_web/settings/config.yml.dist /opt/ganeti_webmgr_config/config.yml
13+
14+
# Keys generated specifically for Docker
15+
# Do not use in a secure environment
16+
RUN echo "DEBUG: true" >> /opt/ganeti_webmgr_config/config.yml && \
17+
echo "SECRET_KEY: \"f4iIZ1CTjeLvL3LEhf7m2TnhmIgmeOi1ZuooQ7OOdY\"" >> /opt/ganeti_webmgr_config/config.yml && \
18+
echo "WEB_MGR_API_KEY: \"Sfi7l83bjlGyYUBF4pIp/2vumfwPA+Lwz2ztu32LQ2k\"" >> /opt/ganeti_webmgr_config/config.yml
19+
EXPOSE 8000

dockerfiles/id_rsa-ganeti

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEAxccgaL+wwd92GnciKwnyD8v+llAXUOAV12I/YkeKRXyQmp0o
3+
xo53TNzNwkqULjVI8OWz+2D8IpNjJZna+DkwmNHfvlyHPTY0W/y7azfCnCIyz9io
4+
RK0lyoLBR2k+FzZ1SXqXKkFlhTygdnNQ6+s24uQQa/pf0VEt1+SqN2VQbtZNVvfl
5+
jM38P0Gh31bJ4uuVAeACpOcIi/Zo0SGzA7Lc41Zn55kcIgYz/EC3p0OdiIO/yOTH
6+
NOfrBSP1errk5Z4wJXxvguJ8LYudsDwGjuMGHW7bFbZQ0E9zWPlxpk2wonGlgOjF
7+
KzDBJX3wb5E9/gqh/zQVbF0hwKOmEnyfbXPUbwIDAQABAoIBAQCqaZJWT10pH7du
8+
xFnvhalJzTa3I5mDeSG4rRH6R7QvfU5HusTImTbYRqUQFRyq2ATadMHpBr8Zt69F
9+
VdVj7jseYjAMoUNyDcN9wz1l++y2hY0MpB0Q17RpUtLhCiCS9byHrJaVtTWZYQzO
10+
IzyFmu13AJXZxClNfUon7QJxqt1sMbpS9mF6BIYehJ+b6Ci9K4xluLTxnHlGDjfz
11+
UnGQZCQFj2DXkakd9QIz1OGhZPmAuX+6hRqUY2LZI9zFOmmne98ZaWPPrQWS7zU1
12+
HRbC/homDSTcEEuqfSN3jF9oiNOG/O0/OCVqllujgKxhFMdrMNgjwnVllClW0DUA
13+
tvszpSoZAoGBAP5TEMhBtFiV6vKsQxiLuO87UKC/9ay0ZvJPCdVFVp9P40g5hScC
14+
O/P5rs4ExSZhaRoqMGjXfjZ+FNDSjg2yRs8fa2Q8Dhpm4f2oiWFwcu8xBmak+tAw
15+
bxcw8aTdfLd/ZxIqKeHzMz90d/31mLQtWju9o2AiZgdWh658AD3qwBaLAoGBAMcU
16+
sQhkbbiFDdAdVLoSENfv6MikzS/R2b020DX4U5RqcC4BhxKUbk5i6QC7Qe9lJP2B
17+
aiV2lAvwe0e9sKyYdlp+hd/2tLuTNEtB5s68VsKtbrF7gyXxU1Ct10BVbfnJN8FE
18+
RSAAAfB2dDuzt6TkyOIW4nIcp8JIvGg7KMxAqVotAoGANthI9TaeIsBpw118tq1i
19+
+0xKTfA3lb/tt3FuCG0EiiSbOfcVjN0BetKsbMdAkM9O8BKLEADwueWkrYfKlI+O
20+
j5oR+bKtw+nN8HrI7ZdnYcervrTzVbQsMM8gPVJ6U8QIwTUQhSaCNbvzKHQvMyPY
21+
oqt5sQCaChkR94HMN44JUJMCgYAbM9WY2vgvHWcsx8U7A5rvlqWNPQ+YeCkzdJjw
22+
tvTcs8qOTsEhJc0IwvUpl2zEBGMQjK1vXwuNshd2TxIkE1UgumcamkBJ3SxpGCEs
23+
oImOYlpcwA7EkXwb6xUdgk7bscX/j4+OdtHNBLKPMdhnHKfiVNQuWYIGxx+Pcn35
24+
ouBBJQKBgQCsWAbj5Ge0NtRUJ75xeNSW+ojg0Hln+dvBGkWll9SfKUP2nxxFTJOE
25+
aPBkNC7aYpDBjt1vfkwUQ1dJJ+mlS0Pdzv++YZF+OLPsh22egQLGtrl+VB3jpS56
26+
SSPhDDO5JH0Kqm9pFDLmShcNxYHbsNRwBrsRHCFgXIAZ5jhlwA11/Q==
27+
-----END RSA PRIVATE KEY-----

dockerfiles/id_rsa-ganeti.pub

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFxyBov7DB33YadyIrCfIPy/6WUBdQ4BXXYj9iR4pFfJCanSjGjndM3M3CSpQuNUjw5bP7YPwik2Mlmdr4OTCY0d++XIc9NjRb/LtrN8KcIjLP2KhErSXKgsFHaT4XNnVJepcqQWWFPKB2c1Dr6zbi5BBr+l/RUS3X5Ko3ZVBu1k1W9+WMzfw/QaHfVsni65UB4AKk5wiL9mjRIbMDstzjVmfnmRwiBjP8QLenQ52Ig7/I5Mc05+sFI/V6uuTlnjAlfG+C4nwti52wPAaO4wYdbtsVtlDQT3NY+XGmTbCicaWA6MUrMMElffBvkT3+CqH/NBVsXSHAo6YSfJ9tc9Rv

dockerfiles/rapi.users

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
gwm {HA1}735e1ecce8cd0fb377a905cf1b56c93e read,write

dockerfiles/startup.sh

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
set -xe
3+
trap /opt/ganeti_webmgr/dockerfiles/cleanup.sh EXIT
4+
pip install .
5+
rm -f ganeti.db
6+
django-admin.py syncdb --noinput
7+
django-admin.py syncdb --migrate --noinput
8+
echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'password')" | django-admin.py shell
9+
django-admin.py runserver 0.0.0.0:8000

0 commit comments

Comments
 (0)