From bbf3dca6fdea1bc47f121462347b14739248136d Mon Sep 17 00:00:00 2001 From: Joao M Date: Tue, 23 Aug 2022 01:06:16 +0000 Subject: [PATCH 01/45] First Kubernetes implementation --- README.md | 45 +++++++++++++++++++++-- assets/scripts/haproxy-reload.sh | 46 ++++++++++++++---------- assets/scripts/k8s.py | 50 ++++++++++++++++++++++++++ kubernetes/easyhaproxy.yml | 61 ++++++++++++++++++++++++++++++++ requirements.txt | 3 +- 5 files changed, 183 insertions(+), 22 deletions(-) create mode 100644 assets/scripts/k8s.py create mode 100644 kubernetes/easyhaproxy.yml diff --git a/README.md b/README.md index 7cbb7c3..ec14cbf 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ The environment variables will setup the HAProxy. | Environment Variable | Description | |-------------------------------|---------------------------------------------------------------------------------------------------------------| -| EASYHAPROXY_DISCOVER | How `haproxy.cfg` will be created: `static`, `docker` or `swarm` | +| EASYHAPROXY_DISCOVER | How `haproxy.cfg` will be created: `static`, `docker`, `swarm` or `kubernetes` | | EASYHAPROXY_LABEL_PREFIX | (Optional) The key will search for matching resources. Default: `easyhaproxy`. | | EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | | EASYHAPROXY_SSL_MODE | (Optional) `STRICT` supports only the most recent TLS version; `DEFAULT` good SSL integration with recent browsers; `LOOSE` supports all old SSL protocols for old browsers (not recommended). | @@ -100,7 +100,48 @@ The discovery will occur every minute. Important: easyhaproxy needs to be in the same network of the containers or otherwise will not access. -### Docker Container (Swarm or Docker) tags: +### EASYHAPROXY_DISCOVER: kubernetes (experimental and limited) + +This will query all `ingress` in the kubernetes cluster and check the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. + +e.g.: +``` +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: example-ingress + namespace: example +spec: + rules: + - host: example.org + http: + paths: + - backend: + service: + name: example-service + port: + number: 8080 + pathType: ImplementationSpecific + - host: www.example.org + http: + paths: + - backend: + service: + name: example-service + port: + number: 8080 + pathType: ImplementationSpecific +``` + +At this point the implementation is very limited and doesn't support all ingress properties nor wildcard domains. + +The system will read only `host` and `port.number` + +There is no necessary to add labels or annotations. + + +### Container (Docker or Swarm) labels: | Tag | Description | Example | |---------------------------------------|---------------------------------------------------------------------------------------------------------|--------------| diff --git a/assets/scripts/haproxy-reload.sh b/assets/scripts/haproxy-reload.sh index 20fbad8..7cd3822 100755 --- a/assets/scripts/haproxy-reload.sh +++ b/assets/scripts/haproxy-reload.sh @@ -6,11 +6,6 @@ cd /scripts RELOAD="true" -if [[ "static|docker|swarm" != *"$EASYHAPROXY_DISCOVER"* ]];then - log "error" "CONF_CHECK" "EASYHAPROXY_DISCOVER should be 'static', 'docker', or 'swarm'. I got '$EASYHAPROXY_DISCOVER' instead." - exit 1 -fi - if [[ "$EASYHAPROXY_DISCOVER" == "static" ]]; then CONTROL_FILE="/etc/haproxy/haproxy.cfg" touch ${CONTROL_FILE} @@ -22,27 +17,40 @@ else mv ${CONTROL_FILE} ${CONTROL_FILE}.old touch ${CONTROL_FILE} - if [[ "$EASYHAPROXY_DISCOVER" == "docker" ]]; then - CONTAINERS=$(docker ps -q | sort | uniq) - LABEL_PATH=".Config.Labels" + case "$EASYHAPROXY_DISCOVER" in + docker) + CONTAINERS=$(docker ps -q | sort | uniq) + LABEL_PATH=".Config.Labels" - for container in ${CONTAINERS}; do - docker inspect --format "{{ json $LABEL_PATH }}" ${container} | xargs -I % echo ${container}=% >> ${CONTROL_FILE} - done - else - CONTAINERS=$(docker node ps $(docker node ls -q) --format "{{ .Name }}" --filter desired-state=running | cut -d. -f1 | sort | uniq) - LABEL_PATH=".Spec.Labels" + for container in ${CONTAINERS}; do + docker inspect --format "{{ json $LABEL_PATH }}" ${container} | xargs -I % echo ${container}=% >> ${CONTROL_FILE} + done + ;; - for container in ${CONTAINERS}; do - docker service inspect --format "{{ json $LABEL_PATH }}" ${container} | xargs -I % echo ${container}=% >> ${CONTROL_FILE} - done - fi + swarm) + CONTAINERS=$(docker node ps $(docker node ls -q) --format "{{ .Name }}" --filter desired-state=running | cut -d. -f1 | sort | uniq) + LABEL_PATH=".Spec.Labels" + + for container in ${CONTAINERS}; do + docker service inspect --format "{{ json $LABEL_PATH }}" ${container} | xargs -I % echo ${container}=% >> ${CONTROL_FILE} + done + ;; + + kubernetes) + python3 /scripts/k8s.py > ${CONTROL_FILE} + ;; + + *) + log "error" "CONF_CHECK" "EASYHAPROXY_DISCOVER should be 'static', 'docker', 'swarm' or kubernetes. I got '$EASYHAPROXY_DISCOVER' instead." + exit 1 + ;; + esac if cmp -s ${CONTROL_FILE} ${CONTROL_FILE}.old ; then RELOAD="false" else python3 swarm.py > /etc/haproxy/haproxy.cfg - log "info" "CONF_CHECK" "New configuration found" + log "info" "CONF_CHECK" "New configuration found" fi fi diff --git a/assets/scripts/k8s.py b/assets/scripts/k8s.py new file mode 100644 index 0000000..8ebc19e --- /dev/null +++ b/assets/scripts/k8s.py @@ -0,0 +1,50 @@ +from kubernetes import client, config +from kubernetes.client.rest import ApiException +import json + +# https://github.com/kubernetes-client/python/tree/master/kubernetes/docs + +def main(): + config.load_incluster_config() + + api_instance = client.CoreV1Api() + v1 = client.NetworkingV1Api() + + ret = v1.list_ingress_for_all_namespaces(watch=False) + + discover = {} + for i in ret.items: + if i.metadata.annotations['kubernetes.io/ingress.class'] != "easyhaproxy-ingress": + continue + + data = {} + #ingress_name = i.metadata.name + data["creation_timestamp"] = i.metadata.creation_timestamp.strftime("%x %X") + data["resource_version"] = i.metadata.resource_version + data["namespace"] = i.metadata.namespace + for rule in i.spec.rules: + rule_data = {} + port_number = rule.http.paths[0].backend.service.port.number + definition = rule.host.replace(".", "-") + rule_data["easyhaproxy.%s_%s.host" % (definition, port_number)] = rule.host + rule_data["easyhaproxy.%s_%s.port" % (definition, port_number)] = "80" + rule_data["easyhaproxy.%s_%s.localport" % (definition, port_number)] = port_number + service_name = rule.http.paths[0].backend.service.name + try: + api_response = api_instance.read_namespaced_service(service_name, i.metadata.namespace) + cluster_ip = api_response.spec.cluster_ip + except ApiException as e: + cluster_ip = None + # print("Exception when calling CoreV1Api->read_namespaced_service: %s\n" % e) + + if cluster_ip is not None: + if cluster_ip not in discover.keys(): + discover[cluster_ip] = data + discover[cluster_ip].update(rule_data) + + for k in discover.keys(): + print("%s=%s" % (k, json.dumps(discover[k]))) + +if __name__ == '__main__': + main() + diff --git a/kubernetes/easyhaproxy.yml b/kubernetes/easyhaproxy.yml new file mode 100644 index 0000000..c3b3b5e --- /dev/null +++ b/kubernetes/easyhaproxy.yml @@ -0,0 +1,61 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: easyhaproxy + +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: easyhaproxy-ingress + namespace: easyhaproxy +spec: + selector: + matchLabels: + app: easyhaproxy-ingress + template: + metadata: + labels: + app: easyhaproxy-ingress + spec: + serviceAccountName: easyhaproxy-ingress + containers: + - image: byjg/easy-haproxy:kubernetes + imagePullPolicy: IfNotPresent + name: easyhaproxy-ingress + ports: + - name: http + containerPort: 80 + hostPort: 80 + - name: https + containerPort: 443 + hostPort: 443 + - name: stats + containerPort: 1943 + hostPort: 1943 + resources: + requests: + cpu: "100m" + memory: "128Mi" + #limits: + # cpu: "1" + # memory: "1Gi" + securityContext: + allowPrivilegeEscalation: true + #runAsUser: 101 #nginx + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + env: + - name: EASYHAPROXY_DISCOVER + value: kubernetes + - name: HAPROXY_USERNAME + value: admin + - name: HAPROXY_PASSWORD + value: password + - name: EASYHAPROXY_REFRESH_CONF + value: 10 + diff --git a/requirements.txt b/requirements.txt index 364b4b7..7959d6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ pyyaml docker jinja2 -pytest \ No newline at end of file +pytest +kubernetes \ No newline at end of file From d2085046f4a66b6bfb608e2b1f57333d8bcb2594 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Tue, 23 Aug 2022 01:24:23 +0000 Subject: [PATCH 02/45] Small adjsuts on k8s.yaml --- kubernetes/easyhaproxy.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/kubernetes/easyhaproxy.yml b/kubernetes/easyhaproxy.yml index c3b3b5e..3289d48 100644 --- a/kubernetes/easyhaproxy.yml +++ b/kubernetes/easyhaproxy.yml @@ -19,9 +19,9 @@ spec: labels: app: easyhaproxy-ingress spec: - serviceAccountName: easyhaproxy-ingress + #serviceAccountName: easyhaproxy-ingress containers: - - image: byjg/easy-haproxy:kubernetes + - image: byjg/easy-haproxy:test imagePullPolicy: IfNotPresent name: easyhaproxy-ingress ports: @@ -41,14 +41,14 @@ spec: #limits: # cpu: "1" # memory: "1Gi" - securityContext: - allowPrivilegeEscalation: true - #runAsUser: 101 #nginx - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE + #securityContext: + # allowPrivilegeEscalation: true + # #runAsUser: 101 #nginx + # capabilities: + # drop: + # - ALL + # add: + # - NET_BIND_SERVICE env: - name: EASYHAPROXY_DISCOVER value: kubernetes @@ -57,5 +57,5 @@ spec: - name: HAPROXY_PASSWORD value: password - name: EASYHAPROXY_REFRESH_CONF - value: 10 + value: "10" From 82ec90595eda209717de0b349dbc0d2af3fa8352 Mon Sep 17 00:00:00 2001 From: Joao M Date: Tue, 23 Aug 2022 01:56:27 +0000 Subject: [PATCH 03/45] Small adjust --- kubernetes/easyhaproxy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kubernetes/easyhaproxy.yml b/kubernetes/easyhaproxy.yml index 3289d48..cfe32dd 100644 --- a/kubernetes/easyhaproxy.yml +++ b/kubernetes/easyhaproxy.yml @@ -58,4 +58,8 @@ spec: value: password - name: EASYHAPROXY_REFRESH_CONF value: "10" + - name: HAPROXY_CUSTOMERRORS + value: true + - name: EASYHAPROXY_SSL_MODE + value: loose From cd5035602a590b381741752d6c1370fb4bc395bd Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Tue, 23 Aug 2022 02:36:44 +0000 Subject: [PATCH 04/45] Small Adjusts --- kubernetes/easyhaproxy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kubernetes/easyhaproxy.yml b/kubernetes/easyhaproxy.yml index cfe32dd..000c238 100644 --- a/kubernetes/easyhaproxy.yml +++ b/kubernetes/easyhaproxy.yml @@ -22,7 +22,7 @@ spec: #serviceAccountName: easyhaproxy-ingress containers: - image: byjg/easy-haproxy:test - imagePullPolicy: IfNotPresent + imagePullPolicy: Always name: easyhaproxy-ingress ports: - name: http @@ -59,7 +59,7 @@ spec: - name: EASYHAPROXY_REFRESH_CONF value: "10" - name: HAPROXY_CUSTOMERRORS - value: true + value: "true" - name: EASYHAPROXY_SSL_MODE value: loose From 7d959f892a2e7031d825c0361f82e7700c264a1a Mon Sep 17 00:00:00 2001 From: Joao M Date: Wed, 24 Aug 2022 01:00:26 +0000 Subject: [PATCH 05/45] Refactoring to Python --- .gitpod.yml | 2 +- Dockerfile | 18 +- README.md | 4 + assets/scripts/banner.txt | 5 - assets/scripts/k8s.py | 5 + examples/swarm/docker-compose.yml | 64 +++++++ resource-temp.yml | 79 ++++++++ src/banner.txt | 5 + {easymapping => src/easymapping}/__init__.py | 26 +-- src/functions/__init__.py | 58 ++++++ src/main.py | 49 +++++ src/processor/__init__.py | 170 ++++++++++++++++++ requirements.txt => src/requirements.txt | 3 +- {templates => src/templates}/bind.j2 | 0 .../templates}/frontend-mode-http.j2 | 0 .../templates}/frontend-mode-tcp.j2 | 0 {templates => src/templates}/haproxy.cfg.j2 | 0 {templates => src/templates}/ssl_default.j2 | 0 {templates => src/templates}/ssl_loose.j2 | 0 {templates => src/templates}/ssl_strict.j2 | 0 {tests => src/tests}/__init__.py | 0 {tests => src/tests}/context.py | 0 {tests => src/tests}/expected/no-services.txt | 0 .../tests}/expected/services-letsencrypt.txt | 0 .../expected/services-multi-containers.txt | 0 .../expected/services-multiple-hosts.txt | 0 .../tests}/expected/services-redirect-ssl.txt | 0 .../tests}/expected/services-tcp.txt | 0 {tests => src/tests}/expected/services.txt | 0 {tests => src/tests}/expected/ssl-loose.txt | 0 {tests => src/tests}/expected/ssl-strict.txt | 0 {tests => src/tests}/expected/static.txt | 0 {tests => src/tests}/fixtures/no-services | 0 {tests => src/tests}/fixtures/services | 0 .../tests}/fixtures/services-changed-label | 0 .../tests}/fixtures/services-letsencrypt | 0 .../tests}/fixtures/services-multi-containers | 0 .../tests}/fixtures/services-multiple-hosts | 0 .../tests}/fixtures/services-redirect-ssl | 0 {tests => src/tests}/fixtures/services-tcp | 0 {tests => src/tests}/fixtures/static.yml | 0 {tests => src/tests}/test_labels.py | 0 {tests => src/tests}/test_parser.py | 0 43 files changed, 454 insertions(+), 34 deletions(-) delete mode 100644 assets/scripts/banner.txt create mode 100644 examples/swarm/docker-compose.yml create mode 100644 resource-temp.yml create mode 100644 src/banner.txt rename {easymapping => src/easymapping}/__init__.py (90%) create mode 100644 src/functions/__init__.py create mode 100644 src/main.py create mode 100644 src/processor/__init__.py rename requirements.txt => src/requirements.txt (63%) rename {templates => src/templates}/bind.j2 (100%) rename {templates => src/templates}/frontend-mode-http.j2 (100%) rename {templates => src/templates}/frontend-mode-tcp.j2 (100%) rename {templates => src/templates}/haproxy.cfg.j2 (100%) rename {templates => src/templates}/ssl_default.j2 (100%) rename {templates => src/templates}/ssl_loose.j2 (100%) rename {templates => src/templates}/ssl_strict.j2 (100%) rename {tests => src/tests}/__init__.py (100%) rename {tests => src/tests}/context.py (100%) rename {tests => src/tests}/expected/no-services.txt (100%) rename {tests => src/tests}/expected/services-letsencrypt.txt (100%) rename {tests => src/tests}/expected/services-multi-containers.txt (100%) rename {tests => src/tests}/expected/services-multiple-hosts.txt (100%) rename {tests => src/tests}/expected/services-redirect-ssl.txt (100%) rename {tests => src/tests}/expected/services-tcp.txt (100%) rename {tests => src/tests}/expected/services.txt (100%) rename {tests => src/tests}/expected/ssl-loose.txt (100%) rename {tests => src/tests}/expected/ssl-strict.txt (100%) rename {tests => src/tests}/expected/static.txt (100%) rename {tests => src/tests}/fixtures/no-services (100%) rename {tests => src/tests}/fixtures/services (100%) rename {tests => src/tests}/fixtures/services-changed-label (100%) rename {tests => src/tests}/fixtures/services-letsencrypt (100%) rename {tests => src/tests}/fixtures/services-multi-containers (100%) rename {tests => src/tests}/fixtures/services-multiple-hosts (100%) rename {tests => src/tests}/fixtures/services-redirect-ssl (100%) rename {tests => src/tests}/fixtures/services-tcp (100%) rename {tests => src/tests}/fixtures/static.yml (100%) rename {tests => src/tests}/test_labels.py (100%) rename {tests => src/tests}/test_parser.py (100%) diff --git a/.gitpod.yml b/.gitpod.yml index 2b37d88..b763650 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -6,4 +6,4 @@ tasks: - command: | virtualenv -p /usr/bin/python3 venv source venv/bin/activate - pip install -r requirements.txt + pip install -r src/requirements.txt diff --git a/Dockerfile b/Dockerfile index 9cb2339..f8c8fcc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,18 +6,16 @@ ENV RELEASE_VERSION=$RELEASE_VERSION_ARG WORKDIR /scripts -COPY requirements.txt /scripts -COPY templates /scripts/templates/ -COPY easymapping /scripts/easymapping/ -COPY tests/ /scripts/tests/ +COPY src/ /scripts/ COPY assets / RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml docker certbot openssl \ && ln -s /usr/bin/python3 /usr/bin/python \ - && pip3 install --upgrade pip \ - && pip install -r requirements.txt \ - && pytest -s tests/ \ - && openssl dhparam -out /etc/haproxy/dhparam 2048 \ - && openssl dhparam -out /etc/haproxy/dhparam-1024 1024 + && pip3 install --upgrade pip +# \ +# && pip install -r requirements.txt \ +# && pytest -s tests/ \ +# && openssl dhparam -out /etc/haproxy/dhparam 2048 \ +# && openssl dhparam -out /etc/haproxy/dhparam-1024 1024 -CMD ["/bin/bash", "-c", "/scripts/haproxy.sh" ] +# CMD ["/bin/bash", "-c", "/scripts/haproxy.sh" ] diff --git a/README.md b/README.md index ec14cbf..0f457b4 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,10 @@ services: ... ``` +```bash +docker stack deploy --compose-file docker-compose.yml mystack +``` + ### Single Definition ```bash diff --git a/assets/scripts/banner.txt b/assets/scripts/banner.txt deleted file mode 100644 index f897aab..0000000 --- a/assets/scripts/banner.txt +++ /dev/null @@ -1,5 +0,0 @@ - _ - ___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _ -/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || | -\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, | - |__/ |_| |__/ diff --git a/assets/scripts/k8s.py b/assets/scripts/k8s.py index 8ebc19e..a1b2cf4 100644 --- a/assets/scripts/k8s.py +++ b/assets/scripts/k8s.py @@ -4,6 +4,11 @@ import json # https://github.com/kubernetes-client/python/tree/master/kubernetes/docs + +# Fix error: +# raise MaxRetryError(_pool, url, error or ResponseError(cause)) +# urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='10.152.183.1', port=443): Max retries exceeded with url: /api/v1/namespaces/parking/services/parking-valida-me (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)'))) + def main(): config.load_incluster_config() diff --git a/examples/swarm/docker-compose.yml b/examples/swarm/docker-compose.yml new file mode 100644 index 0000000..5c9627c --- /dev/null +++ b/examples/swarm/docker-compose.yml @@ -0,0 +1,64 @@ +# To test: +# curl -k -H "Host: host1.local" https://127.0.0.1/ +# curl -k -H "Host: host2.local" https://127.0.0.1/ +# +# curl -I -H Host:host1.local http://127.0.0.1 +# HTTP/1.1 301 Moved Permanently +# content-length: 0 +# location: https://host1.local/ +# +# curl -I -H Host:host2.local http://127.0.0.1 +# HTTP/1.1 301 Moved Permanently +# content-length: 0 +# location: https://host1.local/ +# +# Test SSL: +# openssl s_client -showcerts -connect 127.0.0.1:443 --servername host1.local + +version: "3" + +services: + haproxy: + image: byjg/easy-haproxy + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./host2.local.pem:/certs/haproxy/host2.local.pem + environment: + EASYHAPROXY_DISCOVER: docker + EASYHAPROXY_SSL_MODE: "loose" + HAPROXY_CUSTOMERRORS: "true" + HAPROXY_USERNAME: admin + HAPROXY_PASSWORD: password + HAPROXY_STATS_PORT: 1936 + + ports: + - "80:80/tcp" + - "443:443/tcp" + - "1936:1936/tcp" + + container: + image: byjg/static-httpserver + deploy: + labels: + easyhaproxy.http.redirect_ssl: "true" + easyhaproxy.http.host: host1.local + easyhaproxy.http.port: 80 + + easyhaproxy.https.port: 443 + easyhaproxy.https.localport: 8080 + easyhaproxy.https.host: host1.local + easyhaproxy.https.sslcert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZEVENDQXZXZ0F3SUJBZ0lVUmkrdzFaVmdlZWRUbE5JQXdxUUJNSnY2ZFhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZqRVVNQklHQTFVRUF3d0xhRzl6ZERFdWJHOWpZV3d3SGhjTk1qRXdPREV3TVRnME9UQTJXaGNOTXpFdwpPREE0TVRnME9UQTJXakFXTVJRd0VnWURWUVFEREF0b2IzTjBNUzVzYjJOaGJEQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNQkRBaExBeWdKdWFXNnc2ZmZpZ3pUQUFHWHBtRXowdEl4bjFrNFoKeDV3TjVycHYvcXUwUU1ZeitBdjJ1MWVPS0VLWmVhRlJWcFQwcjkzZFg3SXZiRVpIdDI1R1BpQnZsTEdxaGpLUgpQblNrLzdVOFhtc250dFVBVjdyVkVLMVVyZEZ3OC9Jd3JpUUMrZGhyMG1uWWZTRE1rdkJvTUZwZGhWTlRyYkFaCjFUQjZyUWpFN0FyME10OG15OTZYSm13cmNqSzJUaitFMnJnUElVejFlNWNla0ZZSURTQmF0bXcrMyt2citUNXgKRk5Ga0oybzMwVzVvOFpmbENKSnpyVmFpaHFRaWNzNlpLRGdwZjdpcVhNRml3V0lsaGRRcEd2eDVHZi9LRlRLOQpVYU9uUlp6L1grMkNlYkFGYVRIUjNrL1BZcHBXVGdCQkJ1UnZscEN3K3dkbmttdGVDMFNRUkY5MVFXVnI3ZWpvCjdLYU9sR0k1VnR2TVVzV3ZUZUFabXBheW1JYUFURVR1T0phWTBKVTExT21MZUQ5RE9qNUUyU1E3cUlYL3BGY3AKeHB6RzVqNGMrTWxndnhQMlZBa05UZUFYQ2FZaVBCUUg1WlpnMEhFMlduQjFLaExSRmxIZDRpSFFEMkdKNXlOLwo2ZkNGQmZaZktTZUs4SmF1d3hnV2tyYTUzT2NEcS9tS2QrREEvZEsrL3J1Rzd0cXdWZ0lhMDRIT3Bsek03TFlSCkdCMElyczkrbHI1L1BKYlFabVUwNzNNZG42Y1hBZzNwKzZ3dndGbERrUzV2MTNnQkRZTkh0RjYyYmM1NTFlZEYKWjZrR3pKN3dtR1JvODRhQlA3TXVSWmVSZUxPclNTNjdhMXdMZHpac01uUDFUSjd4OUxmcjlNS2wydURuUWRuWQpleDhEQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJTUS9tdFpkNmg4ZW45WVFWSDZITzFQbFdXaXF6QWZCZ05WCkhTTUVHREFXZ0JTUS9tdFpkNmg4ZW45WVFWSDZITzFQbFdXaXF6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUNoUVlOdWFoMyttVHBJQkRZeEdyalRKTnVPVElNYVd6TXlpMXRrZitMMApzRUd3cGJtQU8ybVdXUVlGN1dWTHNpOThQVUxoM2FkanQyaml1ZDlWbGFhQzZnbnduNVpvMStQaWxvOXNOTExXCjZpajArck40a3dJbS9wTnFpK2pEdXUyY3ZBdUhJd1pXZWg4YkVlLzVVQ3hvNGlobVdGUU44ZUo2VFVLQ3BoUkMKNkVvci9TU1paQlFIZ1BsMEJjaHpIT2t3dTdSM0xDbmRScXhqaEFvVmI5eVFPVitac21UZUpYdWx3TnpKMXVMdApUOE9JZ0lpRHBtQm83SFNOMkgwazNjaHgwMEFzalV5SjltbUFXUGVqRmUvS1hMUlBjVlpSMTdqaHpnZklCRXpzCk01V3RXRm0xYUhEalZ2Nk02aXRlVm02MUU5VCtrL00xMXJ1MWUyWXdzeFREdmI2eDA0bWNyTnU5c29xZGRCYnIKVmZwbHV1b1EvaEVBYlh0Rk5Qb1R5U3B6MGN3T3djSENvd1ZPTG1kS2d2SW1zelppTXlISEc4VkdHbVBoODhuNwp3VnhiMGdWMFA0Uk1yY01MZGVUZG41NVlRcjFDcUJyMzRlQjZvbDZBc2JUbTNWekJIUlZtRk5rc2wxbzVKQjV0CnRYTGdGL0c4L3J6Si80bTFQYVZ1eHJCN0R4VW1JazhFUGJTSVZrdlp2ZDdMQnpLd1E2SWZWYXVjZXdIZkVhalEKVklpZXhTTWlGYzdsdzNLbnhqT0haamY2Rk05VllnM05vKytHZEM5OXM3TGtJdUp3QU1MTnFUUTdIdmhuN1l2UAo0RmxTSWdjNnhqMFlrR1pFUWxiNW8vNW5hdUVxUVUwQUJndzZqdEk0TnhyTkxUNmNwN0NPNE0weElERWcvM1lECmFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJSlF3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NDUzB3Z2drcEFnRUFBb0lDQVFEQVF3SVN3TW9DYm1sdQpzT24zNG9NMHdBQmw2WmhNOUxTTVo5Wk9HY2VjRGVhNmIvNnJ0RURHTS9nTDlydFhqaWhDbVhtaFVWYVU5Sy9kCjNWK3lMMnhHUjdkdVJqNGdiNVN4cW9ZeWtUNTBwUCsxUEY1cko3YlZBRmU2MVJDdFZLM1JjUFB5TUs0a0F2blkKYTlKcDJIMGd6Skx3YURCYVhZVlRVNjJ3R2RVd2VxMEl4T3dLOURMZkpzdmVseVpzSzNJeXRrNC9oTnE0RHlGTQo5WHVYSHBCV0NBMGdXclpzUHQvcjYvaytjUlRSWkNkcU45RnVhUEdYNVFpU2M2MVdvb2FrSW5MT21TZzRLWCs0CnFsekJZc0ZpSllYVUtScjhlUm4veWhVeXZWR2pwMFdjLzEvdGdubXdCV2t4MGQ1UHoyS2FWazRBUVFia2I1YVEKc1BzSFo1SnJYZ3RFa0VSZmRVRmxhKzNvNk95bWpwUmlPVmJiekZMRnIwM2dHWnFXc3BpR2dFeEU3amlXbU5DVgpOZFRwaTNnL1F6bytSTmtrTzZpRi82UlhLY2FjeHVZK0hQakpZTDhUOWxRSkRVM2dGd21tSWp3VUIrV1dZTkJ4Ck5scHdkU29TMFJaUjNlSWgwQTloaWVjamYrbndoUVgyWHlrbml2Q1dyc01ZRnBLMnVkem5BNnY1aW5mZ3dQM1MKdnY2N2h1N2FzRllDR3RPQnpxWmN6T3kyRVJnZENLN1BmcGErZnp5VzBHWmxOTzl6SForbkZ3SU42ZnVzTDhCWgpRNUV1YjlkNEFRMkRSN1JldG0zT2VkWG5SV2VwQnN5ZThKaGthUE9HZ1QrekxrV1hrWGl6cTBrdXUydGNDM2MyCmJESno5VXllOGZTMzYvVENwZHJnNTBIWjJIc2ZBd0lEQVFBQkFvSUNBUUMveFpiWjBjY3RxYWdzcXZhVk5URWUKZXExcStoZmFHdlBFWVFhWUhJcklFKzJpNVhjbkdjTEtjS2ZvZHhEakFuOFIvemdkT3A2Y01YMENWbi9Qb2hIawpBRUR0RTgrQVZ3d0FNMUZzT3dnTEhWR2FHejhxcnhCbFlkUWdIY3BtdWVJdTJQWGJDOGVIVUJpYVVPSXVoYXc1Ci9SUk1EQUMvQWkyc3NmaTdnT2p2VkU0b1F4UVcwUUcxS0dPT0FVSm4vdVlIdzJSRlkyVXUxcGlteE8ya0RPNTMKZ2N4bUMxV09ueUNIbUhhaVcvVWg3ejZKYW1mU000ZFh0VEpac2x5aDM3ZGhIS05iZzlWa1A3Q1FLQTRoTHpvcApoYmY1cVk2cmFyZ09OaW55MUhnTVB4cm13S3VVb3VKeU90TjB5QnR4akRDVU5hWFVCd2l5N3NOR1MrSDR2c3lCCjVQOUhoSUhTdHUrRlp0M0hHN0VJcUNuZGlhU0tEUzRqV2FWUUFiYm80bloyWnMyQkQreERlUFJDUlVxWDdyTTQKNFh6UElSV1dYbW1XZi83SWcyOUhicnA0YTlMY09tUTJsZUNKdGJhVEZTTjk2T0xVSjVFK2hRMHVsQ1pnQlZtUQpSQ1VZa0pQNGxPemJhS2R6anhnSE1ySHptNDVlVUZmOExpck94aTJ1eXhYSFFtRE51NGIzWDE4a3QzUGdVbVVtCjNkWHBsM2ZxU3lKYTdTQ1Y4Wk5CcnNyRHExRSt0aFl0dTkxUWJWU0d4SGQ5SHJOVmUzWGRMYk9DZFU5Q3VDNjkKTmdsem5hYTdzWkxxbXlLZWpUZkdzWTd4cldkTmNNUGw0cDRmY0lEL080RXBBU1pmb3JwVGVLTlQwWklmWlpldwpiMG1BUWVZWnFRTThpL3FNWU4vdUFRS0NBUUVBNXFnMXNSTk1jNlZkTS90UmdsYXNHWW94amdSQzJPcUFEWmdzCm1BWE1VSjNrRXJweXh0K2VDaW15OGlidVlwelJUSVE4ZkJUV1JrQ3RSWlhKNytLY0xWdGs5UVpJb0xiaHlOd2QKNEl4RVFaRnVVbGpEYnZTalRMU3ljc0h2bzY1aWJXSWZUTDdiZ1dsTEdnR3EvVU96ZkdzZ0g2Uzl3THA1RzMwRwo4RUx5akk1ZVRJWUlDcmZUbVZMK2M0NU1ScEVNS28rY3Z6OFB5c2lhT0ZUbjNjeXN3UFZkWWFlRUVxTVFqVTh3CklHTnNHWkx5dFk3QkFCQmNZMGxkcnRiYS9PK0Z2LytSSDd1VXR6UDd4cENJd0ZDeDgwWnpOK1dSeTlOdkk2M1UKenEzeUlCb1c5R3lBcEQyK1BMYVBOeGY3UUxUVUNoWTFaei9kWVJsdEtPeHYyQWE1Z1FLQ0FRRUExV0xXTnFwMApmaEIvWnRmU0VTaHhGTU04OWNqTjZBYXoxV0tMN3VUQm91OW9TSm54amtoa2FWNzZhY25UL2lxWHR4TU5nSGkxCmZJbURwVTNQdk0wWTRVZDJUNDdvSGM2UDFCclpQTi9HbVh5L3M2QkFFZFB3TGU3Sis0blRJU0hBZEdtcmgrYS8KNXBrdHUzMmc5bFdxZnR4ZWNGSVZTTFBXa3hUMFhLaU14cDFmZmtMK09hdnBNZ01GWks0MWlLczNkTlNoS1BvZwpMOEdTUGNQOXgveW43OFAyZUszTitQR2psQTZwUHpyQU55V1U3TjAvYm1IY0I5VEtQK3VkWVdjalZocnU3TVlOCndOckU0a0tkQzh2OGk3eDd0RGJ2Yjc5VCtGbzZQSWg1M3AwT3NuWnpBOFVSMFFOUit2RFF1ZlF1eWFqOFJFQysKWkc4WXlDS3N2azh5Z3dLQ0FRQS9mc1N4QjBmL2VlRXJZeDZ3QzUzNnRlRW9ZQ0hxeHJzVGd2V2JyOVRyeUZzMQprSi95QVRMblIwMWNmYjBYNW1WemM5K1dwTUhMdXhnMzFLRXZhU2xuRHdhK3NNa2pmTlN3ejI5bUZoYmdHZUhOCngyT2RVcmoxYjdURUJJRXNoTi9SanJaaEVSVXFEY3MvMEgrNmtuMkJYWmdOUGZPQ2I1TFJMMXpPblE5YUJBTVAKZThJUStVUEZyR1FoZVdXajgxL3ZBM081N2VreUFJRDd5dHU5WWcrWVdyTW5JODhtdGo3ak40NWZEQitBOXNQYgptUDJtUDlxKzlqNVUyQTZXbkhVc1FuVTMwQktEVUVzYUFVV3o4MExaWG1adlY4SUg0eDl3S2ZVd0pCQklLQVp6CnFMN005N1k3em1Ha1gvU3BmbDMwbk9KOGxzY2hhTGQxRVlsRVphMkJBb0lCQVFDeWUyNVQ0VFY1TUpGdjB6dVoKTUd1TmcxU2MvTzRGa24yZkVVT2NlV2pod1VCSDRjUGpUL2YxRHdXRHNOYUo5TlJieENyNTkzMU9BclBEYzVjOApBNDA0K1k0ak01UkJRa0tabGk5NHRIQW9kK2pjOVVCQjZUVXZKbGw1OVNsTXdDOTY3OXdTMjFaT0tuZlBLR0NYClNzWkdRRXNaeGY2Wmhoc0hnWEozZ2wvbHpVSlBtUGVPQTVZVlIrT2Q5LzA5S0lGRlRvalNmb3luaFZDdUt4NDkKeGI0dVZZbjJIT0o0eEowZlBUZ2hkQ0hNdnJtWGVlUVJqdmI4OGVhTm1xVlVFSEhGRnRnYjRma2xBNWZFN1JUeApCaGxpUkRCd1o3YlVrSU5LNnlWazluNkJUbnM1bU12UkxtZ2RuSnBZdkU3S0MwMkxUYlpiM0krajhDMFpVYStOCnF5N0RBb0lCQUFpZXJpYlM3V1VjbDJhQmxrbTUrVzdxTm0vSU5tNXp2bm9TUG82VjN3YTVoczZmOStDL2tiZEYKODdqUVBBL1lGZTN1UjJzQUo3c2xYNWV1Wks4V21mcEZtZ3psdTBzRXo4MU1MUS9XeXBadFp5dHlWdFd6QjJQdQpYQ1cxdGRTSDllSTJCbWhYZ29rSE5UTTQ4TmsveE9FTnJQL3NlWHJJeDVMSzBobkRIWm90dS96NitZU2tCOWhGCmNtMmZaeWdEMWRNTFg2bGlSaW14eUZZK2RJQ0pOQjk1SmlmVExXWW5XZUdkZGt3UHRYVWVHWEUxb2x6dk5rTEQKek16RTA5dWhreC9sUkpudGVPQkVaYWY4ME9CLzA5T2k5YjkvcnhZNTlkd3NINkdheExvVGZFS3VQbnZCVk1OUgpZa1UxNFd6UUtsZUZraUJKSTlsVnZuZmdHbk9sZ2cwPQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t + + container2: + image: byjg/static-httpserver + deploy: + labels: + easyhaproxy.http.host: host2.local + easyhaproxy.http.port: 80 + easyhaproxy.http.redirect_ssl: "true" + + easyhaproxy.https.port: 443 + easyhaproxy.https.localport: 8080 + easyhaproxy.https.host: host2.local + easyhaproxy.https.ssl: "true" + diff --git a/resource-temp.yml b/resource-temp.yml new file mode 100644 index 0000000..2954285 --- /dev/null +++ b/resource-temp.yml @@ -0,0 +1,79 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: parking + +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: parking-valida-me + namespace: parking + annotations: + kubernetes.io/ingress.class: easyhaproxy +spec: + rules: + - host: valida.me + http: + paths: + - backend: + serviceName: parking-valida-me + servicePort: 80 + - host: www.valida.me + http: + paths: + - backend: + serviceName: parking-valida-me + servicePort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: parking-valida-me + namespace: parking +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8080 + name: http + selector: + app: parking-valida-me +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: parking-valida-me + namespace: parking +spec: + replicas: 1 + revisionHistoryLimit: 10 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app: parking-valida-me + template: + metadata: + labels: + app: parking-valida-me + spec: + containers: + - name: parking-valida-me + image: byjg/static-httpserver + ports: + - containerPort: 8080 + resources: + limits: + cpu: '0.05' + memory: '20Mi' + requests: + cpu: '0.05' + memory: '20Mi' + env: + - name: TITLE + value: "valida.me" diff --git a/src/banner.txt b/src/banner.txt new file mode 100644 index 0000000..8f09599 --- /dev/null +++ b/src/banner.txt @@ -0,0 +1,5 @@ +" _ " +" ___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _ " +"/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || |" +"\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |" +" |__/ |_| |__/ " diff --git a/easymapping/__init__.py b/src/easymapping/__init__.py similarity index 90% rename from easymapping/__init__.py rename to src/easymapping/__init__.py index a10fa2f..fe4e145 100644 --- a/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -55,15 +55,13 @@ class HaproxyConfigGenerator: self.ssl_cert_haproxy = ssl_cert_folder + "/haproxy" self.ssl_cert_letsecncrypt = ssl_cert_folder + "/letsencrypt" self.letsencrypt_hosts = [] - os.makedirs(self.ssl_cert_haproxy, exist_ok=True) - os.makedirs(self.ssl_cert_letsecncrypt, exist_ok=True) + self.certs = {} - def generate(self, line_list = []): + def generate(self, container_metadata = None): self.mapping.setdefault("easymapping", []) - # static? - if len(line_list) > 0: - self.mapping["easymapping"] = self.parse(line_list) + if container_metadata is not None: + self.mapping["easymapping"] = self.parse(container_metadata) file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) @@ -74,15 +72,11 @@ class HaproxyConfigGenerator: return template.render(data=self.mapping) - def parse(self, line_list): + def parse(self, container_metadata): easymapping = dict() - for line in line_list: - line = line.strip() - i = line.find("=") - container = line[:i] - json_str = line[i+1:] - d = json.loads(json_str) + for container in container_metadata: + d = container_metadata[container] # Extract the definitions dynamically definitions = {} @@ -176,10 +170,8 @@ class HaproxyConfigGenerator: self.ssl_cert_haproxy, d[host_label] ) easymapping[port]["ssl"] = True - with open(filename, 'wb') as file: - file.write( - base64.b64decode(d[ssl_label]) - ) + self.certs[filename] = base64.b64decode(d[ssl_label]) + if self.label.get_bool(self.label.create([definition, "ssl"])): easymapping[port]["ssl"] = True diff --git a/src/functions/__init__.py b/src/functions/__init__.py new file mode 100644 index 0000000..e14e8b5 --- /dev/null +++ b/src/functions/__init__.py @@ -0,0 +1,58 @@ +from datetime import datetime +import subprocess +import shlex +import numpy as np + +class Functions: + @staticmethod + def load(filename): + with open(filename, 'r') as content_file: + return content_file.read() + + @staticmethod + def save(filename, contents): + with open(filename, 'w') as file: + file.write(contents) + + @staticmethod + def log(source, level, message): + if message is None or message == "": + return + + if not isinstance(message, (list, tuple, np.ndarray)): + message = [message] + + for line in message: + print("[%s] %s [%s]: %s" % (source, datetime.now().strftime("%x %X"), level, line.rstrip())) + + @staticmethod + def run_bash(source, command, log_output=True, return_result=True): + if not isinstance(command, (list, tuple, np.ndarray)): + command = shlex.split(command) + + try: + process = subprocess.Popen(command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True) + + output = [] + + while True: + line = process.stdout.readline().rstrip() + output.append(line) if return_result else None + Functions.log(source, "info", line) if log_output else None + Functions.log(source, "error", process.stderr.readline()) + return_code = process.poll() + if return_code is not None: + lines = [] + for line in process.stdout.readlines(): + output.append(line.rstrip()) if return_result else None + lines.append(line.rstrip()) + Functions.log(source, "info", lines) if log_output else None + Functions.log(source, "error", process.stderr.readlines()) + break + + return output + except Exception as e: + Functions.log(source, 'error', "%s" % (e)) diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..a06a3fa --- /dev/null +++ b/src/main.py @@ -0,0 +1,49 @@ +from functions import Functions +from processor import ProcessorInterface +import os +import time +from threading import Thread + +easyhaproxy_config = "/etc/haproxy/easyconfig.yml" +haproxy_config = "/etc/haproxy/haproxy.cfg" +certs_letsencrypt = "/certs/letsencrypt" +certs_haproxy = "/certs/haproxy" + +def start(): + processor_obj = ProcessorInterface.factory(os.getenv("EASYHAPROXY_DISCOVER")) + if processor_obj is None: + exit(1) + + os.makedirs(certs_letsencrypt, exist_ok=True) + os.makedirs(certs_haproxy, exist_ok=True) + + Functions.save(haproxy_config, processor_obj.get_haproxy_conf()) + for cert in processor_obj.get_certs(): + Functions.save(certs_haproxy, processor_obj.get_certs(cert)) + + #configs = Functions.run_bash('HAPROXY', 'ls /etc/haproxy/conf.d/*.cfg', log_output=False) + x = Thread(target=Functions.run_bash, args=("HAPROXY", "/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /var/run/haproxy.sock", True, False)) + x.start() + + while True: + time.sleep(10) + + +def main(): + Functions.run_bash('INIT', '/usr/sbin/haproxy -v') + + Functions.log('INIT', 'info', " _ ") + Functions.log('INIT', 'info', " ___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _ ") + Functions.log('INIT', 'info', "/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || |") + Functions.log('INIT', 'info', "\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |") + Functions.log('INIT', 'info', " |__/ |_| |__/ ") + + Functions.log('INIT', 'INFO', os.getenv("RELEASE_VERSION")) + Functions.log('INIT', 'INFO', "") + Functions.log('INIT', 'INFO', 'Environment:') + for name, value in os.environ.items(): + if "HAPROXY" in name: + print("- {0}: {1}".format(name, value)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/processor/__init__.py b/src/processor/__init__.py new file mode 100644 index 0000000..db95bb0 --- /dev/null +++ b/src/processor/__init__.py @@ -0,0 +1,170 @@ +from easymapping import HaproxyConfigGenerator +from functions import Functions +import yaml +import sys +import os +import json +from kubernetes import client, config +from kubernetes.client.rest import ApiException + +class ContainerEnv: + @staticmethod + def read(): + env_vars = { + "customerrors": True if os.getenv("HAPROXY_CUSTOMERRORS") == "true" else False, + "ssl_mode": os.getenv("EASYHAPROXY_SSL_MODE", "default") + } + + if os.getenv("HAPROXY_PASSWORD"): + env_vars["stats"] = { + "username": os.getenv("HAPROXY_USERNAME") if os.getenv("HAPROXY_USERNAME") else "admin", + "password": os.getenv("HAPROXY_PASSWORD"), + "port": os.getenv("HAPROXY_STATS_PORT") if os.getenv("HAPROXY_STATS_PORT") else "1936", + } + + env_vars["lookup_label"] = os.getenv("EASYHAPROXY_LABEL_PREFIX") if os.getenv("EASYHAPROXY_LABEL_PREFIX") else "easyhaproxy" + if (os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL")): + env_vars["letsencrypt"] = { + "email": os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL") + } + + return env_vars + + +class ProcessorInterface: + def __init__(self, filename = None): + self.filename = filename + self.letsencrypt_hosts = None + self.parsed_object = None + self.cfg = None + self.inspect_network() + self.parse() + + @staticmethod + def factory(mode): + if mode == "static": + return Static("/etc/haproxy/easyconfig.yml") + elif mode == "docker": + return Docker() + elif mode == "swarm": + return Swarm() + elif mode == "kubernetes": + return Swarm() + else: + Functions.log("FACTORY", "error", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got " + mode) + return None + + def inspect_network(self): + #Abstract + pass + + def parse(self): + # Abstract + pass + + def get_letsencrypt_hosts(self): + return self.letsencrypt_hosts + + def get_parsed_object(self): + return self.parsed_object + + def get_certs(self, key = None): + if key is None: + return self.cfg.certs + else: + return None if key not in self.cfg.certs else self.cfg.certs[key] + + def get_haproxy_conf(self): + conf = self.cfg.generate(self.parsed_object) + self.letsencrypt_hosts = self.cfg.letsencrypt_hosts + return conf + + + +class Static(ProcessorInterface): + def inspect_network(self): + self.parsed_object = {} + + def parse(self): + static_content = yaml.load(Functions.load(self.filename), Loader=yaml.FullLoader) + self.cfg = HaproxyConfigGenerator(static_content) + + +class Docker(ProcessorInterface): + def inspect_network(self): + docker = "/usr/bin/docker" + + containers_list = Functions.run_bash('DOCKER_PROCESSOR', docker + " ps -q", log_output=False) + containers_list.sort() + containers = list(set(containers_list)) + self.parsed_object = {} + for container in containers: + self.parsed_object[container] = json.loads(''.join(Functions.run_bash('DOCKER_PROCESSOR', docker + ' inspect --format "{{ json .Config.Labels }}" ' + container, log_output=False))) + + def parse(self): + self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) + + +class Swarm(ProcessorInterface): + def inspect_network(self): + docker = "/usr/bin/docker" + + node_list = ' '.join(Functions.run_bash('SWARM_PROCESSOR', docker + ' node ls -q', False)) + containers_list_raw = Functions.run_bash('SWARM_PROCESSOR', docker + ' node ps ' + node_list + ' --format "{{ .Name }}" --filter desired-state=running', log_output=False) + containers_list = [] + for container in containers_list_raw: + containers_list.append(container.split('.')[0]) + containers_list.sort() + containers = list(set(containers_list)) + self.parsed_object = {} + for container in containers: + self.parsed_object[container] = json.loads(''.join(Functions.run_bash('SWARM_PROCESSOR', docker + ' service inspect --format "{{ json .Spec.Labels }}" ' + container, log_output=False))) + + def parse(self): + self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) + + +class Kubernetes(ProcessorInterface): + def inspect_network(self): + config.load_incluster_config() + + api_instance = client.CoreV1Api() + v1 = client.NetworkingV1Api() + + ret = v1.list_ingress_for_all_namespaces(watch=False) + + self.parsed_object = {} + for i in ret.items: + if i.metadata.annotations['kubernetes.io/ingress.class'] != "easyhaproxy-ingress": + continue + + data = {} + #ingress_name = i.metadata.name + data["creation_timestamp"] = i.metadata.creation_timestamp.strftime("%x %X") + data["resource_version"] = i.metadata.resource_version + data["namespace"] = i.metadata.namespace + for rule in i.spec.rules: + rule_data = {} + port_number = rule.http.paths[0].backend.service.port.number + definition = rule.host.replace(".", "-") + rule_data["easyhaproxy.%s_%s.host" % (definition, port_number)] = rule.host + rule_data["easyhaproxy.%s_%s.port" % (definition, port_number)] = "80" + rule_data["easyhaproxy.%s_%s.localport" % (definition, port_number)] = port_number + service_name = rule.http.paths[0].backend.service.name + try: + api_response = api_instance.read_namespaced_service(service_name, i.metadata.namespace) + cluster_ip = api_response.spec.cluster_ip + except ApiException as e: + cluster_ip = None + # print("Exception when calling CoreV1Api->read_namespaced_service: %s\n" % e) + + if cluster_ip is not None: + if cluster_ip not in self.parsed_object.keys(): + self.parsed_object[cluster_ip] = data + self.parsed_object[cluster_ip].update(rule_data) + + def parse(self): + self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) + + + diff --git a/requirements.txt b/src/requirements.txt similarity index 63% rename from requirements.txt rename to src/requirements.txt index 7959d6f..1709aa1 100644 --- a/requirements.txt +++ b/src/requirements.txt @@ -2,4 +2,5 @@ pyyaml docker jinja2 pytest -kubernetes \ No newline at end of file +kubernetes +numpy \ No newline at end of file diff --git a/templates/bind.j2 b/src/templates/bind.j2 similarity index 100% rename from templates/bind.j2 rename to src/templates/bind.j2 diff --git a/templates/frontend-mode-http.j2 b/src/templates/frontend-mode-http.j2 similarity index 100% rename from templates/frontend-mode-http.j2 rename to src/templates/frontend-mode-http.j2 diff --git a/templates/frontend-mode-tcp.j2 b/src/templates/frontend-mode-tcp.j2 similarity index 100% rename from templates/frontend-mode-tcp.j2 rename to src/templates/frontend-mode-tcp.j2 diff --git a/templates/haproxy.cfg.j2 b/src/templates/haproxy.cfg.j2 similarity index 100% rename from templates/haproxy.cfg.j2 rename to src/templates/haproxy.cfg.j2 diff --git a/templates/ssl_default.j2 b/src/templates/ssl_default.j2 similarity index 100% rename from templates/ssl_default.j2 rename to src/templates/ssl_default.j2 diff --git a/templates/ssl_loose.j2 b/src/templates/ssl_loose.j2 similarity index 100% rename from templates/ssl_loose.j2 rename to src/templates/ssl_loose.j2 diff --git a/templates/ssl_strict.j2 b/src/templates/ssl_strict.j2 similarity index 100% rename from templates/ssl_strict.j2 rename to src/templates/ssl_strict.j2 diff --git a/tests/__init__.py b/src/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to src/tests/__init__.py diff --git a/tests/context.py b/src/tests/context.py similarity index 100% rename from tests/context.py rename to src/tests/context.py diff --git a/tests/expected/no-services.txt b/src/tests/expected/no-services.txt similarity index 100% rename from tests/expected/no-services.txt rename to src/tests/expected/no-services.txt diff --git a/tests/expected/services-letsencrypt.txt b/src/tests/expected/services-letsencrypt.txt similarity index 100% rename from tests/expected/services-letsencrypt.txt rename to src/tests/expected/services-letsencrypt.txt diff --git a/tests/expected/services-multi-containers.txt b/src/tests/expected/services-multi-containers.txt similarity index 100% rename from tests/expected/services-multi-containers.txt rename to src/tests/expected/services-multi-containers.txt diff --git a/tests/expected/services-multiple-hosts.txt b/src/tests/expected/services-multiple-hosts.txt similarity index 100% rename from tests/expected/services-multiple-hosts.txt rename to src/tests/expected/services-multiple-hosts.txt diff --git a/tests/expected/services-redirect-ssl.txt b/src/tests/expected/services-redirect-ssl.txt similarity index 100% rename from tests/expected/services-redirect-ssl.txt rename to src/tests/expected/services-redirect-ssl.txt diff --git a/tests/expected/services-tcp.txt b/src/tests/expected/services-tcp.txt similarity index 100% rename from tests/expected/services-tcp.txt rename to src/tests/expected/services-tcp.txt diff --git a/tests/expected/services.txt b/src/tests/expected/services.txt similarity index 100% rename from tests/expected/services.txt rename to src/tests/expected/services.txt diff --git a/tests/expected/ssl-loose.txt b/src/tests/expected/ssl-loose.txt similarity index 100% rename from tests/expected/ssl-loose.txt rename to src/tests/expected/ssl-loose.txt diff --git a/tests/expected/ssl-strict.txt b/src/tests/expected/ssl-strict.txt similarity index 100% rename from tests/expected/ssl-strict.txt rename to src/tests/expected/ssl-strict.txt diff --git a/tests/expected/static.txt b/src/tests/expected/static.txt similarity index 100% rename from tests/expected/static.txt rename to src/tests/expected/static.txt diff --git a/tests/fixtures/no-services b/src/tests/fixtures/no-services similarity index 100% rename from tests/fixtures/no-services rename to src/tests/fixtures/no-services diff --git a/tests/fixtures/services b/src/tests/fixtures/services similarity index 100% rename from tests/fixtures/services rename to src/tests/fixtures/services diff --git a/tests/fixtures/services-changed-label b/src/tests/fixtures/services-changed-label similarity index 100% rename from tests/fixtures/services-changed-label rename to src/tests/fixtures/services-changed-label diff --git a/tests/fixtures/services-letsencrypt b/src/tests/fixtures/services-letsencrypt similarity index 100% rename from tests/fixtures/services-letsencrypt rename to src/tests/fixtures/services-letsencrypt diff --git a/tests/fixtures/services-multi-containers b/src/tests/fixtures/services-multi-containers similarity index 100% rename from tests/fixtures/services-multi-containers rename to src/tests/fixtures/services-multi-containers diff --git a/tests/fixtures/services-multiple-hosts b/src/tests/fixtures/services-multiple-hosts similarity index 100% rename from tests/fixtures/services-multiple-hosts rename to src/tests/fixtures/services-multiple-hosts diff --git a/tests/fixtures/services-redirect-ssl b/src/tests/fixtures/services-redirect-ssl similarity index 100% rename from tests/fixtures/services-redirect-ssl rename to src/tests/fixtures/services-redirect-ssl diff --git a/tests/fixtures/services-tcp b/src/tests/fixtures/services-tcp similarity index 100% rename from tests/fixtures/services-tcp rename to src/tests/fixtures/services-tcp diff --git a/tests/fixtures/static.yml b/src/tests/fixtures/static.yml similarity index 100% rename from tests/fixtures/static.yml rename to src/tests/fixtures/static.yml diff --git a/tests/test_labels.py b/src/tests/test_labels.py similarity index 100% rename from tests/test_labels.py rename to src/tests/test_labels.py diff --git a/tests/test_parser.py b/src/tests/test_parser.py similarity index 100% rename from tests/test_parser.py rename to src/tests/test_parser.py From 877a4b3383f4fe0f6747f7d8f2fe1132b504a2ad Mon Sep 17 00:00:00 2001 From: Joao M Date: Wed, 24 Aug 2022 02:33:21 +0000 Subject: [PATCH 06/45] More adjustmemts --- Dockerfile | 14 ++++++------ src/easymapping/__init__.py | 10 ++++----- src/functions/__init__.py | 5 ++--- src/main.py | 32 ++++++++++++++++++++++------ src/processor/__init__.py | 41 +++++++++++++++++++++++++----------- src/requirements.txt | 2 +- src/templates/haproxy.cfg.j2 | 1 + 7 files changed, 69 insertions(+), 36 deletions(-) diff --git a/Dockerfile b/Dockerfile index f8c8fcc..3fa515e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,11 +11,11 @@ COPY assets / RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml docker certbot openssl \ && ln -s /usr/bin/python3 /usr/bin/python \ - && pip3 install --upgrade pip -# \ -# && pip install -r requirements.txt \ -# && pytest -s tests/ \ -# && openssl dhparam -out /etc/haproxy/dhparam 2048 \ -# && openssl dhparam -out /etc/haproxy/dhparam-1024 1024 + && pip3 install --upgrade pip \ + && pip install -r requirements.txt \ + && openssl dhparam -out /etc/haproxy/dhparam 2048 \ + && openssl dhparam -out /etc/haproxy/dhparam-1024 1024 -# CMD ["/bin/bash", "-c", "/scripts/haproxy.sh" ] +# && pytest -s tests/ \ + +CMD ["/usr/bin/python", "-u", "/scripts/main.py" ] diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index fe4e145..95649a4 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -52,9 +52,8 @@ class HaproxyConfigGenerator: self.mapping.setdefault("letsencrypt", {"email": ""}) self.mapping["ssl_mode"] = self.mapping["ssl_mode"].lower() self.label = DockerLabelHandler(mapping['lookup_label'] if 'lookup_label' in mapping else "easyhaproxy") - self.ssl_cert_haproxy = ssl_cert_folder + "/haproxy" - self.ssl_cert_letsecncrypt = ssl_cert_folder + "/letsencrypt" self.letsencrypt_hosts = [] + self.serving_hosts = [] self.certs = {} def generate(self, container_metadata = None): @@ -134,6 +133,7 @@ class HaproxyConfigGenerator: for hostname in d[host_label].split(","): hostname = hostname.strip() + self.serving_hosts.append("%s:%s" % (hostname, port)) easymapping[port]["hosts"].setdefault(hostname, {}) easymapping[port]["hosts"][hostname].setdefault("containers", []) easymapping[port]["hosts"][hostname].setdefault("letsencrypt", False) @@ -166,11 +166,9 @@ class HaproxyConfigGenerator: # handle SSL ssl_label = self.label.create([definition, "sslcert"]) if self.label.has_label(ssl_label): - filename = "{}/{}.pem".format( - self.ssl_cert_haproxy, d[host_label] - ) + filename = "{}.pem".format(d[host_label]) easymapping[port]["ssl"] = True - self.certs[filename] = base64.b64decode(d[ssl_label]) + self.certs[filename] = base64.b64decode(d[ssl_label]).decode('ascii') if self.label.get_bool(self.label.create([definition, "ssl"])): easymapping[port]["ssl"] = True diff --git a/src/functions/__init__.py b/src/functions/__init__.py index e14e8b5..b0614a8 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -1,7 +1,6 @@ from datetime import datetime import subprocess import shlex -import numpy as np class Functions: @staticmethod @@ -19,7 +18,7 @@ class Functions: if message is None or message == "": return - if not isinstance(message, (list, tuple, np.ndarray)): + if not isinstance(message, (list, tuple)): message = [message] for line in message: @@ -27,7 +26,7 @@ class Functions: @staticmethod def run_bash(source, command, log_output=True, return_result=True): - if not isinstance(command, (list, tuple, np.ndarray)): + if not isinstance(command, (list, tuple)): command = shlex.split(command) try: diff --git a/src/main.py b/src/main.py index a06a3fa..c1e9b0c 100644 --- a/src/main.py +++ b/src/main.py @@ -3,6 +3,7 @@ from processor import ProcessorInterface import os import time from threading import Thread +from deepdiff import DeepDiff easyhaproxy_config = "/etc/haproxy/easyconfig.yml" haproxy_config = "/etc/haproxy/haproxy.cfg" @@ -17,9 +18,9 @@ def start(): os.makedirs(certs_letsencrypt, exist_ok=True) os.makedirs(certs_haproxy, exist_ok=True) - Functions.save(haproxy_config, processor_obj.get_haproxy_conf()) - for cert in processor_obj.get_certs(): - Functions.save(certs_haproxy, processor_obj.get_certs(cert)) + processor_obj.save_config(haproxy_config) + processor_obj.save_certs(certs_haproxy) + Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config #configs = Functions.run_bash('HAPROXY', 'ls /etc/haproxy/conf.d/*.cfg', log_output=False) x = Thread(target=Functions.run_bash, args=("HAPROXY", "/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /var/run/haproxy.sock", True, False)) @@ -27,6 +28,22 @@ def start(): while True: time.sleep(10) + try: + old_parsed = processor_obj.get_parsed_object() + processor_obj.refresh() + if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not x.is_alive(): + Functions.log('EASYHAPROXY', 'info', 'New configuration found. Reloading...') + processor_obj.save_config(haproxy_config) + processor_obj.save_certs(certs_haproxy) + Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config + pid = "".join(Functions().run_bash("HAPROXY", "cat /run/haproxy.pid", log_output=False)) + x = Thread(target=Functions.run_bash, args=("HAPROXY", "/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -x /var/run/haproxy.sock -sf %s" % (pid), True, False)) + x.start() + except Exception as e: + Functions.log('EASYHAPROXY', 'error', "Err: %s" % (e)) + Functions.log('EASYHAPROXY', 'info', 'Heartbeat') + + def main(): @@ -38,12 +55,13 @@ def main(): Functions.log('INIT', 'info', "\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |") Functions.log('INIT', 'info', " |__/ |_| |__/ ") - Functions.log('INIT', 'INFO', os.getenv("RELEASE_VERSION")) - Functions.log('INIT', 'INFO', "") - Functions.log('INIT', 'INFO', 'Environment:') + Functions.log('INIT', 'info', "Release: %s" % (os.getenv("RELEASE_VERSION"))) + Functions.log('INIT', 'info', 'Environment:') for name, value in os.environ.items(): if "HAPROXY" in name: - print("- {0}: {1}".format(name, value)) + Functions.log('INIT', 'info', "- {0}: {1}".format(name, value)) + + start() if __name__ == '__main__': main() \ No newline at end of file diff --git a/src/processor/__init__.py b/src/processor/__init__.py index db95bb0..386f05d 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -34,11 +34,7 @@ class ContainerEnv: class ProcessorInterface: def __init__(self, filename = None): self.filename = filename - self.letsencrypt_hosts = None - self.parsed_object = None - self.cfg = None - self.inspect_network() - self.parse() + self.refresh() @staticmethod def factory(mode): @@ -51,9 +47,17 @@ class ProcessorInterface: elif mode == "kubernetes": return Swarm() else: - Functions.log("FACTORY", "error", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got " + mode) + Functions.log("FACTORY", "error", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got '%s'" % (mode)) return None + def refresh(self): + self.letsencrypt_hosts = None + self.parsed_object = None + self.cfg = None + self.hosts = None + self.inspect_network() + self.parse() + def inspect_network(self): #Abstract pass @@ -65,6 +69,9 @@ class ProcessorInterface: def get_letsencrypt_hosts(self): return self.letsencrypt_hosts + def get_hosts(self): + return self.hosts + def get_parsed_object(self): return self.parsed_object @@ -77,8 +84,16 @@ class ProcessorInterface: def get_haproxy_conf(self): conf = self.cfg.generate(self.parsed_object) self.letsencrypt_hosts = self.cfg.letsencrypt_hosts + self.hosts = self.cfg.serving_hosts return conf + def save_config(self, filename): + Functions.save(filename, self.get_haproxy_conf()) + + def save_certs(self, path): + for cert in self.get_certs(): + Functions.save("{0}/{1}".format(path, cert), self.get_certs(cert)) + class Static(ProcessorInterface): @@ -125,13 +140,15 @@ class Swarm(ProcessorInterface): class Kubernetes(ProcessorInterface): - def inspect_network(self): + def __init__(self, filename = None): config.load_incluster_config() - - api_instance = client.CoreV1Api() - v1 = client.NetworkingV1Api() + self.api_instance = client.CoreV1Api() + self.v1 = client.NetworkingV1Api() + super().__init__() - ret = v1.list_ingress_for_all_namespaces(watch=False) + def inspect_network(self): + + ret = self.v1.list_ingress_for_all_namespaces(watch=False) self.parsed_object = {} for i in ret.items: @@ -152,7 +169,7 @@ class Kubernetes(ProcessorInterface): rule_data["easyhaproxy.%s_%s.localport" % (definition, port_number)] = port_number service_name = rule.http.paths[0].backend.service.name try: - api_response = api_instance.read_namespaced_service(service_name, i.metadata.namespace) + api_response = self.api_instance.read_namespaced_service(service_name, i.metadata.namespace) cluster_ip = api_response.spec.cluster_ip except ApiException as e: cluster_ip = None diff --git a/src/requirements.txt b/src/requirements.txt index 1709aa1..8327169 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -3,4 +3,4 @@ docker jinja2 pytest kubernetes -numpy \ No newline at end of file +deepdiff \ No newline at end of file diff --git a/src/templates/haproxy.cfg.j2 b/src/templates/haproxy.cfg.j2 index eda4b8a..a1842b1 100644 --- a/src/templates/haproxy.cfg.j2 +++ b/src/templates/haproxy.cfg.j2 @@ -78,3 +78,4 @@ backend srv_{{ host }} backend letsencrypt_backend mode http server certbot 127.0.0.1:2080 + From 303d8181f858c272948ff2bb33659e98a23436a7 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Date: Wed, 24 Aug 2022 03:02:12 +0000 Subject: [PATCH 07/45] Fix factory --- src/processor/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 386f05d..aea754f 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -45,7 +45,7 @@ class ProcessorInterface: elif mode == "swarm": return Swarm() elif mode == "kubernetes": - return Swarm() + return Kubernetes() else: Functions.log("FACTORY", "error", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got '%s'" % (mode)) return None From 5c5f01df2b90adcf3a71bcd4e597af314a47f690 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Tue, 23 Aug 2022 23:01:07 -0500 Subject: [PATCH 08/45] Using docker python --- Dockerfile | 2 +- .../kubernetes}/easyhaproxy.yml | 12 +-- examples/kubernetes/service.yml | 80 +++++++++++++++++++ examples/swarm/docker-compose.yml | 7 +- examples/swarm/host2.local.pem | 50 ++++++++++++ src/processor/__init__.py | 31 +++---- src/requirements.txt | 1 + 7 files changed, 151 insertions(+), 32 deletions(-) rename {kubernetes => examples/kubernetes}/easyhaproxy.yml (80%) create mode 100644 examples/kubernetes/service.yml create mode 100644 examples/swarm/host2.local.pem diff --git a/Dockerfile b/Dockerfile index 3fa515e..225c00a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /scripts COPY src/ /scripts/ COPY assets / -RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml docker certbot openssl \ +RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml certbot openssl \ && ln -s /usr/bin/python3 /usr/bin/python \ && pip3 install --upgrade pip \ && pip install -r requirements.txt \ diff --git a/kubernetes/easyhaproxy.yml b/examples/kubernetes/easyhaproxy.yml similarity index 80% rename from kubernetes/easyhaproxy.yml rename to examples/kubernetes/easyhaproxy.yml index 000c238..2aba608 100644 --- a/kubernetes/easyhaproxy.yml +++ b/examples/kubernetes/easyhaproxy.yml @@ -38,17 +38,7 @@ spec: requests: cpu: "100m" memory: "128Mi" - #limits: - # cpu: "1" - # memory: "1Gi" - #securityContext: - # allowPrivilegeEscalation: true - # #runAsUser: 101 #nginx - # capabilities: - # drop: - # - ALL - # add: - # - NET_BIND_SERVICE + env: - name: EASYHAPROXY_DISCOVER value: kubernetes diff --git a/examples/kubernetes/service.yml b/examples/kubernetes/service.yml new file mode 100644 index 0000000..d98399f --- /dev/null +++ b/examples/kubernetes/service.yml @@ -0,0 +1,80 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: container-example + namespace: parking +spec: + rules: + - host: example.org + http: + paths: + - backend: + service: + name: container-example + port: + number: 8080 + pathType: ImplementationSpecific + - host: www.example.org + http: + paths: + - backend: + service: + name: container-example + port: + number: 8080 + pathType: ImplementationSpecific + +--- +apiVersion: v1 +kind: Service +metadata: + name: container-example + namespace: parking +spec: + ports: + - name: http + port: 8080 + selector: + app: container-example + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: container-example + namespace: parking +spec: + replicas: 1 + revisionHistoryLimit: 10 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app: container-example + template: + metadata: + labels: + app: container-example + spec: + containers: + - name: container-example + image: byjg/static-httpserver + ports: + - containerPort: 8080 + resources: + limits: + cpu: '0.05' + memory: '20Mi' + requests: + cpu: '0.05' + memory: '20Mi' + env: + - name: TITLE + value: "My Host Example" diff --git a/examples/swarm/docker-compose.yml b/examples/swarm/docker-compose.yml index 5c9627c..d9000bf 100644 --- a/examples/swarm/docker-compose.yml +++ b/examples/swarm/docker-compose.yml @@ -23,14 +23,15 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock - ./host2.local.pem:/certs/haproxy/host2.local.pem + deploy: + replicas: 1 environment: - EASYHAPROXY_DISCOVER: docker + EASYHAPROXY_DISCOVER: swarm EASYHAPROXY_SSL_MODE: "loose" HAPROXY_CUSTOMERRORS: "true" HAPROXY_USERNAME: admin HAPROXY_PASSWORD: password HAPROXY_STATS_PORT: 1936 - ports: - "80:80/tcp" - "443:443/tcp" @@ -39,6 +40,7 @@ services: container: image: byjg/static-httpserver deploy: + replicas: 1 labels: easyhaproxy.http.redirect_ssl: "true" easyhaproxy.http.host: host1.local @@ -52,6 +54,7 @@ services: container2: image: byjg/static-httpserver deploy: + replicas: 1 labels: easyhaproxy.http.host: host2.local easyhaproxy.http.port: 80 diff --git a/examples/swarm/host2.local.pem b/examples/swarm/host2.local.pem new file mode 100644 index 0000000..917062a --- /dev/null +++ b/examples/swarm/host2.local.pem @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIIDqTCCApGgAwIBAgIUId5b9t9uqH78g02EzbWF6FKVw3gwDQYJKoZIhvcNAQEL +BQAwZDELMAkGA1UEBhMCQlIxFzAVBgNVBAgMDlJpbyBkZSBKYW5laXJvMRcwFQYD +VQQHDA5SaW8gZGUgSmFuZWlybzENMAsGA1UECgwEQUNNRTEUMBIGA1UEAwwLaG9z +dDIubG9jYWwwHhcNMjIwODE1MDQyNzA1WhcNMjMwODE1MDQyNzA1WjBkMQswCQYD +VQQGEwJCUjEXMBUGA1UECAwOUmlvIGRlIEphbmVpcm8xFzAVBgNVBAcMDlJpbyBk +ZSBKYW5laXJvMQ0wCwYDVQQKDARBQ01FMRQwEgYDVQQDDAtob3N0Mi5sb2NhbDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMSKvrOahavCXnvSF5131hpo +6k65C57jgRQ84FaDj5MbJOVlYQVFtMG0XOk7a+hh5v1fe4wH0R7I6FDo0V9sS+ss +ko5bsElc1xYlg5HbuKq89vRSKg6EDlztx3BKbi912Pmt5vFGNJ16zcw77DUrQIXo +4I/b4a3pmBiWj43NoTIrmSWHtsGwwOj3iDvSweqdYXJIr3hpHH5u6pohjDoQvqDz +K6Mu8p6mhCUKNs7KFJnNInNG25oQT6O0n4OGtmgRjLWopdEnOhMkKsfIoI1XtlXB +LBDv7huICk3t5ywtfCQyO09kX7lFIgd5rn7+MjwH5WNeqbQJxuaqjoXQnNZUgUsC +AwEAAaNTMFEwHQYDVR0OBBYEFNhMBG8q6a+iK2nECwVTn6B9EXZOMB8GA1UdIwQY +MBaAFNhMBG8q6a+iK2nECwVTn6B9EXZOMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJmudvx8+p5iIUsT8fm/fbVM0DA6qWALDYUJnTn3j6Lq4vpf +PFC+q1LmuWfBQMyqKrHrP3e493EctXoiSKZO6iN5dVJIur02OjGuiAEcsYuY1nLn +s9piiI+UEwxH6ux1NaHUnzsWauoBvRhzjXvO6SAVSZJYa9dY5mizXklDyDNuG5U0 +lXv9egMGBsy0dG6eFXkU5CPdxWU540yI2sCtSAj7z+WRUD5k7gJ7tVoY3//jHQZG +5STTmm5t9kpIZTWkptyJos9oZJFYMIXqW2Fc6tyLZpRp31R78tDs6ETIkToDc0RR +jz66th6HI+ZlgIBQhw09+hYAhBDe9+Dmd/SzQZc= +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDEir6zmoWrwl57 +0hedd9YaaOpOuQue44EUPOBWg4+TGyTlZWEFRbTBtFzpO2voYeb9X3uMB9EeyOhQ +6NFfbEvrLJKOW7BJXNcWJYOR27iqvPb0UioOhA5c7cdwSm4vddj5rebxRjSdes3M +O+w1K0CF6OCP2+Gt6ZgYlo+NzaEyK5klh7bBsMDo94g70sHqnWFySK94aRx+buqa +IYw6EL6g8yujLvKepoQlCjbOyhSZzSJzRtuaEE+jtJ+DhrZoEYy1qKXRJzoTJCrH +yKCNV7ZVwSwQ7+4biApN7ecsLXwkMjtPZF+5RSIHea5+/jI8B+VjXqm0Ccbmqo6F +0JzWVIFLAgMBAAECggEBAKceitVROQQ5e/mxRR9CfK1sNH/H3Ne3/1PkB6XIrFab +qB3evEatZOuon7A6NKEeTjl37Se+pdSVZOUXcqC/BzbraZre3+EhrkpIj72ApV+Y +2iwZiWVaaJQgI4uZ3mNAw8RaWJsj5S1a9I8LDOiQ5IZ45CmvABDPJeMScvJSvRRY +e5N0L6stqS7Z+IoyGVKUfp1iNO0YyywOUiSkIRXgscuRXZGYpiGPomsJ+Js1ejzW +jyStlZJEr4L1285rGPrmHqjTwFd+hG80Wc4179xL+WRE6HBEUZSiy95fe6kcPHXX +BgiVYtcFKmiBi2dTbxl4e94ut239i0HtlJ1ZJtLh+BECgYEA8a298K2zXkHosxhN +tRrH7XfMPTkHDDd3rxM21LT+fIXqinGUp9LYaDcbjuTPs8e33uKMd7R6Q40x89yW +IXNka/VL0PXUeV67aCVLLqgXDLGudluJinH0XvmI0CmBecFSMqIFmQlgqERoGGs3 +UMac0p876T4XkGQQJdf62bFpE4UCgYEA0DBH0PDlOpwXccDgXrMfayr8HAhI+G5R +yWQ//9iirtU83chwIWwkh53eLLMzLgdqJnPiWyaUW5BqzmYuD23nhxcQ7PNdIqOO +H1sE6zqLNshv46t5QKlh1Q4qjd7UqtgrSrY63RXJCMWTwnNMeDLtj8gaKbjkrG3R +BM2ildt6Uo8CgYBX7NDUli1SloH1XlsvD047S8FHaM7yl994F3J0UmDfpszcj1P4 +9pF64Mmq4/3Yt0li0mMuTb/Jgb3xrYgFJXkcecKahEVH3ropup+umsLAAIirUMQq +VSkFwJ0Qtnj/deDUwPNuaOX8cd65O5CFV6zIR9xBEDD8fBsP2ZLOzmefDQKBgQDF +m24vVthd/1cJdCgD+0VxNYXDHeIVXLFo1S0iLYCNLn3tjZlRQBKUXzZJe3ay0/rf +sNND7aSYHMYkTzydDJbc1PoNzxmyDUiTXpOWqyUExM/fbB1VUPE5h47AxqdZ2oGN +EtdgjpMZLmCIC2SkGsL+3NJok8UKHdpuErmmQIMk5QKBgQCgEWcYtLXC3YDYMFdI +UgcTebFqSs3mLYgub1xekW3IXR2yom4V5fQTLiF7Yfn2dpDW4IcMU0UJFYVsUlhK +aGtet4Vm5Nn8+Mghot5yAjqO9yAUaub7wgifKIe99tQKd8uZyCvJ0hhvmDDSfx4m +B/TEiFAO99yF49iSxEVSAS6pqQ== +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/src/processor/__init__.py b/src/processor/__init__.py index aea754f..c7ab3be 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -4,6 +4,7 @@ import yaml import sys import os import json +import docker from kubernetes import client, config from kubernetes.client.rest import ApiException @@ -106,34 +107,28 @@ class Static(ProcessorInterface): class Docker(ProcessorInterface): + def __init__(self, filename = None): + self.client = docker.from_env() + super().__init__() + def inspect_network(self): - docker = "/usr/bin/docker" - - containers_list = Functions.run_bash('DOCKER_PROCESSOR', docker + " ps -q", log_output=False) - containers_list.sort() - containers = list(set(containers_list)) self.parsed_object = {} - for container in containers: - self.parsed_object[container] = json.loads(''.join(Functions.run_bash('DOCKER_PROCESSOR', docker + ' inspect --format "{{ json .Config.Labels }}" ' + container, log_output=False))) + for container in self.client.containers.list(): + self.parsed_object[container.name] = container.labels def parse(self): self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) class Swarm(ProcessorInterface): - def inspect_network(self): - docker = "/usr/bin/docker" + def __init__(self, filename = None): + self.client = docker.from_env() + super().__init__() - node_list = ' '.join(Functions.run_bash('SWARM_PROCESSOR', docker + ' node ls -q', False)) - containers_list_raw = Functions.run_bash('SWARM_PROCESSOR', docker + ' node ps ' + node_list + ' --format "{{ .Name }}" --filter desired-state=running', log_output=False) - containers_list = [] - for container in containers_list_raw: - containers_list.append(container.split('.')[0]) - containers_list.sort() - containers = list(set(containers_list)) + def inspect_network(self): self.parsed_object = {} - for container in containers: - self.parsed_object[container] = json.loads(''.join(Functions.run_bash('SWARM_PROCESSOR', docker + ' service inspect --format "{{ json .Spec.Labels }}" ' + container, log_output=False))) + for container in self.client.services.list(): + self.parsed_object[container.attrs["Spec"]["Name"]] = container.attrs["Spec"]["Labels"] def parse(self): self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) diff --git a/src/requirements.txt b/src/requirements.txt index 8327169..5c4ba98 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -2,5 +2,6 @@ pyyaml docker jinja2 pytest +docker kubernetes deepdiff \ No newline at end of file From 50fae1c6590a1c34dbf835356254bff2020eebc1 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Tue, 23 Aug 2022 23:04:20 -0500 Subject: [PATCH 09/45] Adjust method parse --- src/processor/__init__.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/processor/__init__.py b/src/processor/__init__.py index c7ab3be..726b14b 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -64,8 +64,7 @@ class ProcessorInterface: pass def parse(self): - # Abstract - pass + self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) def get_letsencrypt_hosts(self): return self.letsencrypt_hosts @@ -116,9 +115,6 @@ class Docker(ProcessorInterface): for container in self.client.containers.list(): self.parsed_object[container.name] = container.labels - def parse(self): - self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) - class Swarm(ProcessorInterface): def __init__(self, filename = None): @@ -130,9 +126,6 @@ class Swarm(ProcessorInterface): for container in self.client.services.list(): self.parsed_object[container.attrs["Spec"]["Name"]] = container.attrs["Spec"]["Labels"] - def parse(self): - self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) - class Kubernetes(ProcessorInterface): def __init__(self, filename = None): @@ -175,8 +168,6 @@ class Kubernetes(ProcessorInterface): self.parsed_object[cluster_ip] = data self.parsed_object[cluster_ip].update(rule_data) - def parse(self): - self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) From 0687ba60a22ba4e2a451fc0828482212eee0bc55 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Wed, 24 Aug 2022 17:38:06 -0500 Subject: [PATCH 10/45] Fixing multithread issue --- src/functions/__init__.py | 107 +++++++++++++++++++++++++++++++++++++- src/main.py | 21 ++++---- 2 files changed, 117 insertions(+), 11 deletions(-) diff --git a/src/functions/__init__.py b/src/functions/__init__.py index b0614a8..154a035 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -1,4 +1,5 @@ from datetime import datetime +from multiprocessing import Process, Lock import subprocess import shlex @@ -41,7 +42,7 @@ class Functions: line = process.stdout.readline().rstrip() output.append(line) if return_result else None Functions.log(source, "info", line) if log_output else None - Functions.log(source, "error", process.stderr.readline()) + Functions.log(source, "warning", process.stderr.readline()) return_code = process.poll() if return_code is not None: lines = [] @@ -49,9 +50,111 @@ class Functions: output.append(line.rstrip()) if return_result else None lines.append(line.rstrip()) Functions.log(source, "info", lines) if log_output else None - Functions.log(source, "error", process.stderr.readlines()) + Functions.log(source, "warning", process.stderr.readlines()) break return output except Exception as e: Functions.log(source, 'error', "%s" % (e)) + + + + @staticmethod + def log_ts(source, level, message, lock): + if message is None or message == "": + return + + if not isinstance(message, (list, tuple)): + message = [message] + + lock.acquire() + try: + for line in message: + print("[%s] %s [%s]: %s" % (source, datetime.now().strftime("%x %X"), level, line.rstrip())) + finally: + lock.release() + + @staticmethod + def run_bash_ts(source, command, lock): + if not isinstance(command, (list, tuple)): + command = shlex.split(command) + + try: + process = subprocess.Popen(command, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + bufsize=-1, + universal_newlines=True) + + with process.stdout: + for line in iter(process.stdout.readline, b''): + Functions.log(source, "info", line) + + returncode = process.wait() + Functions.log(source, "info", "Return code %s" % (returncode)) + + except Exception as e: + Functions.log_ts(source, 'error', "%s" % (e), lock) + + +class DaemonizeHAProxy: + def __init__(self): + self.process = None + self.thread = None + + def haproxy(self, action): + if action == "start": + self.__prepare("/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /var/run/haproxy.sock") + else: + pid = "".join(Functions().run_bash("HAPROXY", "cat /run/haproxy.pid", log_output=False)) + self.__prepare("/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -x /var/run/haproxy.sock -sf %s" % (pid)) + + if self.process is None: + return + + self.thread = Process(target=self.__start, args=()) + self.thread.start() + + def __prepare(self, command): + source = "HAPROXY" + if not isinstance(command, (list, tuple)): + command = shlex.split(command) + + try: + self.process = subprocess.Popen(command, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + bufsize=-1, + universal_newlines=True) + + except Exception as e: + Functions.log_ts(source, 'error', "%s" % (e), lock) + + + def __start(self): + source = "HAPROXY" + try: + with self.process.stdout: + for line in iter(self.process.stdout.readline, b''): + Functions.log(source, "info", line) + + returncode = self.process.wait() + Functions.log(source, "info", "Return code %s" % (returncode)) + + except Exception as e: + Functions.log_ts(source, 'error', "%s" % (e), lock) + + def is_alive(self): + return self.thread.is_alive() + + def kill(self): + self.process.kill() + self.thread.kill() + + def terminate(self): + self.process.terminate() + self.thread.terminate() + + \ No newline at end of file diff --git a/src/main.py b/src/main.py index c1e9b0c..c2749f9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,8 +1,7 @@ -from functions import Functions +from functions import Functions, DaemonizeHAProxy from processor import ProcessorInterface import os import time -from threading import Thread from deepdiff import DeepDiff easyhaproxy_config = "/etc/haproxy/easyconfig.yml" @@ -22,23 +21,27 @@ def start(): processor_obj.save_certs(certs_haproxy) Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config - #configs = Functions.run_bash('HAPROXY', 'ls /etc/haproxy/conf.d/*.cfg', log_output=False) - x = Thread(target=Functions.run_bash, args=("HAPROXY", "/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /var/run/haproxy.sock", True, False)) - x.start() + old_haproxy = None + haproxy = DaemonizeHAProxy() + haproxy.haproxy("start") while True: time.sleep(10) + if old_haproxy is not None: + old_haproxy.kill() + old_haproxy = None try: old_parsed = processor_obj.get_parsed_object() processor_obj.refresh() - if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not x.is_alive(): + if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not haproxy.is_alive(): Functions.log('EASYHAPROXY', 'info', 'New configuration found. Reloading...') processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config - pid = "".join(Functions().run_bash("HAPROXY", "cat /run/haproxy.pid", log_output=False)) - x = Thread(target=Functions.run_bash, args=("HAPROXY", "/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -x /var/run/haproxy.sock -sf %s" % (pid), True, False)) - x.start() + old_haproxy = haproxy + haproxy = DaemonizeHAProxy() + haproxy.haproxy("reload") + old_haproxy.terminate() except Exception as e: Functions.log('EASYHAPROXY', 'error', "Err: %s" % (e)) Functions.log('EASYHAPROXY', 'info', 'Heartbeat') From 3a0b33041c507c9a1c108377167b91c21d00a390 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 00:35:16 +0000 Subject: [PATCH 11/45] Fix unit tests --- .vscode/launch.json | 4 +- Dockerfile | 3 +- src/easymapping/__init__.py | 2 +- src/tests/expected/no-services.txt | 2 +- src/tests/expected/services-letsencrypt.txt | 2 +- .../expected/services-multi-containers.txt | 2 +- .../expected/services-multiple-hosts.txt | 2 +- src/tests/expected/services-redirect-ssl.txt | 2 +- src/tests/expected/services-tcp.txt | 2 +- src/tests/expected/services.txt | 2 +- src/tests/expected/ssl-loose.txt | 2 +- src/tests/expected/ssl-strict.txt | 2 +- src/tests/expected/static.txt | 2 +- src/tests/fixtures/no-services | 10 ++--- src/tests/fixtures/services | 12 +++--- src/tests/fixtures/services-changed-label | 12 +++--- src/tests/fixtures/services-letsencrypt | 8 ++-- src/tests/fixtures/services-multi-containers | 4 +- src/tests/fixtures/services-multiple-hosts | 6 +-- src/tests/fixtures/services-redirect-ssl | 6 +-- src/tests/fixtures/services-tcp | 4 +- src/tests/test_parser.py | 39 +++++++++---------- 22 files changed, 63 insertions(+), 67 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 428608e..01d56c1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,9 +10,9 @@ "request": "launch", "program": "${file}", "console": "integratedTerminal", - "cwd": "${workspaceFolder}", + "cwd": "${workspaceFolder}/src", "env": { - "PYTHONPATH": "${cwd}" + "=": "${cwd}/src" } } ] diff --git a/Dockerfile b/Dockerfile index 225c00a..fb29e07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,9 +13,8 @@ RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml certbot openssl \ && ln -s /usr/bin/python3 /usr/bin/python \ && pip3 install --upgrade pip \ && pip install -r requirements.txt \ + && pytest -s -vv tests/ \ && openssl dhparam -out /etc/haproxy/dhparam 2048 \ && openssl dhparam -out /etc/haproxy/dhparam-1024 1024 -# && pytest -s tests/ \ - CMD ["/usr/bin/python", "-u", "/scripts/main.py" ] diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index 95649a4..042ca61 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -46,7 +46,7 @@ class DockerLabelHandler: class HaproxyConfigGenerator: - def __init__(self, mapping, ssl_cert_folder="/certs"): + def __init__(self, mapping): self.mapping = mapping self.mapping.setdefault("ssl_mode", 'default') self.mapping.setdefault("letsencrypt", {"email": ""}) diff --git a/src/tests/expected/no-services.txt b/src/tests/expected/no-services.txt index 428cbca..a95c434 100644 --- a/src/tests/expected/no-services.txt +++ b/src/tests/expected/no-services.txt @@ -25,4 +25,4 @@ defaults backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/services-letsencrypt.txt b/src/tests/expected/services-letsencrypt.txt index e0093d1..3e2eafb 100644 --- a/src/tests/expected/services-letsencrypt.txt +++ b/src/tests/expected/services-letsencrypt.txt @@ -92,4 +92,4 @@ backend srv_test_example_org_443 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/services-multi-containers.txt b/src/tests/expected/services-multi-containers.txt index 00e9196..5910691 100644 --- a/src/tests/expected/services-multi-containers.txt +++ b/src/tests/expected/services-multi-containers.txt @@ -42,4 +42,4 @@ backend srv_www_helloworld_com_19901 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/services-multiple-hosts.txt b/src/tests/expected/services-multiple-hosts.txt index cc9c39e..8c356cd 100644 --- a/src/tests/expected/services-multiple-hosts.txt +++ b/src/tests/expected/services-multiple-hosts.txt @@ -75,4 +75,4 @@ backend srv_www_helloworld_com_19901 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/services-redirect-ssl.txt b/src/tests/expected/services-redirect-ssl.txt index d0dbb07..077123b 100644 --- a/src/tests/expected/services-redirect-ssl.txt +++ b/src/tests/expected/services-redirect-ssl.txt @@ -77,4 +77,4 @@ backend srv_host1_local_443 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/services-tcp.txt b/src/tests/expected/services-tcp.txt index 6df1a26..fa8fd7a 100644 --- a/src/tests/expected/services-tcp.txt +++ b/src/tests/expected/services-tcp.txt @@ -39,4 +39,4 @@ backend srv_agent_quantum_local_31339 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/services.txt b/src/tests/expected/services.txt index 43765e6..bf2cecd 100644 --- a/src/tests/expected/services.txt +++ b/src/tests/expected/services.txt @@ -121,4 +121,4 @@ backend srv_www_somehost_com_br_80 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/ssl-loose.txt b/src/tests/expected/ssl-loose.txt index 674c9c6..45ac853 100644 --- a/src/tests/expected/ssl-loose.txt +++ b/src/tests/expected/ssl-loose.txt @@ -35,4 +35,4 @@ backend srv_stats backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/ssl-strict.txt b/src/tests/expected/ssl-strict.txt index 815fd2f..f4e00b4 100644 --- a/src/tests/expected/ssl-strict.txt +++ b/src/tests/expected/ssl-strict.txt @@ -20,4 +20,4 @@ defaults backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/expected/static.txt b/src/tests/expected/static.txt index f3cd653..ea0362f 100644 --- a/src/tests/expected/static.txt +++ b/src/tests/expected/static.txt @@ -107,4 +107,4 @@ backend srv_host3_com_br_8080 backend letsencrypt_backend mode http - server certbot 127.0.0.1:2080 \ No newline at end of file + server certbot 127.0.0.1:2080 diff --git a/src/tests/fixtures/no-services b/src/tests/fixtures/no-services index a0f782d..9e1b3c9 100644 --- a/src/tests/fixtures/no-services +++ b/src/tests/fixtures/no-services @@ -1,5 +1,5 @@ -swarm-prom_caddy={"com.docker.stack.image":"stefanprodan/caddy","com.docker.stack.namespace":"swarm-prom"} -swarm-prom_cadvisor={"com.docker.stack.image":"google/cadvisor","com.docker.stack.namespace":"swarm-prom"} -swarm-prom_dockerd-exporter={"com.docker.stack.image":"stefanprodan/caddy","com.docker.stack.namespace":"swarm-prom"} -swarm-prom_unsee={"com.docker.stack.image":"cloudflare/unsee:v0.8.0","com.docker.stack.namespace":"swarm-prom"} -test_proxy={"com.docker.stack.image":"byjg/easy-haproxy","com.docker.stack.namespace":"test"} +{"swarm-prom_caddy": {"com.docker.stack.image":"stefanprodan/caddy","com.docker.stack.namespace":"swarm-prom"}, +"swarm-prom_cadvisor": {"com.docker.stack.image":"google/cadvisor","com.docker.stack.namespace":"swarm-prom"}, +"swarm-prom_dockerd-exporter": {"com.docker.stack.image":"stefanprodan/caddy","com.docker.stack.namespace":"swarm-prom"}, +"swarm-prom_unsee": {"com.docker.stack.image":"cloudflare/unsee:v0.8.0","com.docker.stack.namespace":"swarm-prom"}, +"test_proxy": {"com.docker.stack.image":"byjg/easy-haproxy","com.docker.stack.namespace":"test"}} diff --git a/src/tests/fixtures/services b/src/tests/fixtures/services index c77af21..56ef60a 100644 --- a/src/tests/fixtures/services +++ b/src/tests/fixtures/services @@ -1,6 +1,6 @@ -portainer-agent_agent={"com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"portainer-agent"} -my-stack_agent={"easyhaproxy.agent.host":"agent.quantum.example.org","easyhaproxy.agent.localport":"9001","easyhaproxy.agent.mode":"tcp","easyhaproxy.agent.port":"31339","com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"} -my-stack_cadvisor={"easyhaproxy.cadvisor.host":"cadvisor.quantum.example.org","easyhaproxy.cadvisor.localport":"8080","easyhaproxy.cadvisor.port":"31337","com.docker.stack.image":"gcr.io/google-containers/cadvisor:v0.34.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"} -my-stack_node-exporter={"easyhaproxy.exp.host":"node-exporter.quantum.example.org","easyhaproxy.exp.localport":"9100","easyhaproxy.exp.port":"31337","com.docker.stack.image":"stefanprodan/swarmprom-node-exporter:v0.16.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring","easyhaproxy.exp.letsencrypt":"true"} -my-stack_reverse-proxy={"com.docker.stack.image":"quay.io/pngmbh/easy-haproxy:tcp-mode","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"} -some-service={"easyhaproxy.http.port":"80","easyhaproxy.http.host":"www.somehost.com.br","easyhaproxy.http.localport":"80","easyhaproxy.http.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","easyhaproxy.https.port":"443","easyhaproxy.https.host":"www.somehost.com.br","easyhaproxy.https.localport":"80","easyhaproxy.https.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","easyhaproxy.https.sslcert":"U29tZSBQRU0gQ2VydGlmaWNhdGU="} \ No newline at end of file +{"portainer-agent_agent": {"com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"portainer-agent"}, +"my-stack_agent": {"easyhaproxy.agent.host":"agent.quantum.example.org","easyhaproxy.agent.localport":"9001","easyhaproxy.agent.mode":"tcp","easyhaproxy.agent.port":"31339","com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"}, +"my-stack_cadvisor": {"easyhaproxy.cadvisor.host":"cadvisor.quantum.example.org","easyhaproxy.cadvisor.localport":"8080","easyhaproxy.cadvisor.port":"31337","com.docker.stack.image":"gcr.io/google-containers/cadvisor:v0.34.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"}, +"my-stack_node-exporter": {"easyhaproxy.exp.host":"node-exporter.quantum.example.org","easyhaproxy.exp.localport":"9100","easyhaproxy.exp.port":"31337","com.docker.stack.image":"stefanprodan/swarmprom-node-exporter:v0.16.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring","easyhaproxy.exp.letsencrypt":"true"}, +"my-stack_reverse-proxy": {"com.docker.stack.image":"quay.io/pngmbh/easy-haproxy:tcp-mode","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"}, +"some-service": {"easyhaproxy.http.port":"80","easyhaproxy.http.host":"www.somehost.com.br","easyhaproxy.http.localport":"80","easyhaproxy.http.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","easyhaproxy.https.port":"443","easyhaproxy.https.host":"www.somehost.com.br","easyhaproxy.https.localport":"80","easyhaproxy.https.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","easyhaproxy.https.sslcert":"U29tZSBQRU0gQ2VydGlmaWNhdGU="}} \ No newline at end of file diff --git a/src/tests/fixtures/services-changed-label b/src/tests/fixtures/services-changed-label index f4b0b14..2a23c24 100644 --- a/src/tests/fixtures/services-changed-label +++ b/src/tests/fixtures/services-changed-label @@ -1,6 +1,6 @@ -portainer-agent_agent={"com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"portainer-agent"} -my-stack_agent={"haproxy.agent.host":"agent.quantum.example.org","haproxy.agent.localport":"9001","haproxy.agent.mode":"tcp","haproxy.agent.port":"31339","com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"} -my-stack_cadvisor={"haproxy.cadvisor.host":"cadvisor.quantum.example.org","haproxy.cadvisor.localport":"8080","haproxy.cadvisor.port":"31337","com.docker.stack.image":"gcr.io/google-containers/cadvisor:v0.34.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"} -my-stack_node-exporter={"haproxy.exp.host":"node-exporter.quantum.example.org","haproxy.exp.localport":"9100","haproxy.exp.port":"31337","com.docker.stack.image":"stefanprodan/swarmprom-node-exporter:v0.16.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring","haproxy.exp.letsencrypt":"yes"} -my-stack_reverse-proxy={"com.docker.stack.image":"quay.io/pngmbh/easy-haproxy:tcp-mode","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"} -some-service={"haproxy.http.port":"80","haproxy.http.host":"www.somehost.com.br","haproxy.http.localport":"80","haproxy.http.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","haproxy.https.port":"443","haproxy.https.host":"www.somehost.com.br","haproxy.https.localport":"80","haproxy.https.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","haproxy.https.sslcert":"U29tZSBQRU0gQ2VydGlmaWNhdGU="} \ No newline at end of file +{"portainer-agent_agent": {"com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"portainer-agent"}, +"my-stack_agent": {"haproxy.agent.host":"agent.quantum.example.org","haproxy.agent.localport":"9001","haproxy.agent.mode":"tcp","haproxy.agent.port":"31339","com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"}, +"my-stack_cadvisor": {"haproxy.cadvisor.host":"cadvisor.quantum.example.org","haproxy.cadvisor.localport":"8080","haproxy.cadvisor.port":"31337","com.docker.stack.image":"gcr.io/google-containers/cadvisor:v0.34.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"}, +"my-stack_node-exporter": {"haproxy.exp.host":"node-exporter.quantum.example.org","haproxy.exp.localport":"9100","haproxy.exp.port":"31337","com.docker.stack.image":"stefanprodan/swarmprom-node-exporter:v0.16.0","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring","haproxy.exp.letsencrypt":"yes"}, +"my-stack_reverse-proxy": {"com.docker.stack.image":"quay.io/pngmbh/easy-haproxy:tcp-mode","com.docker.stack.namespace":"my-stack","com.planetary-quantum":"monitoring"}, +"some-service": {"haproxy.http.port":"80","haproxy.http.host":"www.somehost.com.br","haproxy.http.localport":"80","haproxy.http.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","haproxy.https.port":"443","haproxy.https.host":"www.somehost.com.br","haproxy.https.localport":"80","haproxy.https.redirect":"{\"somehost.com.br\":\"https://www.somehost.com.br\",\"somehost.com\":\"https://www.somehost.com.br\",\"www.somehost.com\":\"https://www.somehost.com.br\",\"byjg.ca\":\"https://www.somehost.com.br\",\"www.byjg.ca\":\"https://www.somehost.com.br\"}","haproxy.https.sslcert":"U29tZSBQRU0gQ2VydGlmaWNhdGU="}} \ No newline at end of file diff --git a/src/tests/fixtures/services-letsencrypt b/src/tests/fixtures/services-letsencrypt index 2d616ff..9c83781 100644 --- a/src/tests/fixtures/services-letsencrypt +++ b/src/tests/fixtures/services-letsencrypt @@ -1,4 +1,4 @@ -f5c645a0dfc6={"com.docker.compose.config-hash":"b95ebc27d0e61caa418cdfa632e05a656da9bbc3ea0d4603651971015f10a1f0","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"test.example.org","easyhaproxy.http.letsencrypt":"true","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"80","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}","easyhaproxy.http.redirect_ssl":"true"} -bbd4d1854155={"com.docker.compose.config-hash":"3dc790bf2bea944359c75a40c45655bd868f1d85beb599d1ca797e8ea2c95ee4","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:0fd95b1512c207048ab3fcc74032354f38143fbb8235ac2a47da903c98a58205","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"haproxy","com.docker.compose.version":"2.8.0"} -b63438410b6a={"com.docker.compose.config-hash":"b95ebc27d0e61caa418cdfa632e05a656da9bbc3ea0d4603651971015f10a1f0","com.docker.compose.container-number":"2","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"test.example.org","easyhaproxy.http.letsencrypt":"true","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"80","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}","easyhaproxy.http.redirect_ssl":"true"} -83d57d592e26={"com.docker.compose.config-hash":"8c5871144f1e8a3aeca037207c02f011ab2c6e6c311a3773602b63541762dab5","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:c4232396c715f3d568816c666e6d9b4a68ef6c36f6243b4007c4ee1d8335fd65","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"static","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"test2.example.org","easyhaproxy.http.localport":"8080","easyhaproxy.http.port":"80","io.buildah.version":"1.21.0"} +{"f5c645a0dfc6": {"com.docker.compose.config-hash":"b95ebc27d0e61caa418cdfa632e05a656da9bbc3ea0d4603651971015f10a1f0","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"test.example.org","easyhaproxy.http.letsencrypt":"true","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"80","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}","easyhaproxy.http.redirect_ssl":"true"}, +"bbd4d1854155": {"com.docker.compose.config-hash":"3dc790bf2bea944359c75a40c45655bd868f1d85beb599d1ca797e8ea2c95ee4","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:0fd95b1512c207048ab3fcc74032354f38143fbb8235ac2a47da903c98a58205","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"haproxy","com.docker.compose.version":"2.8.0"}, +"b63438410b6a": {"com.docker.compose.config-hash":"b95ebc27d0e61caa418cdfa632e05a656da9bbc3ea0d4603651971015f10a1f0","com.docker.compose.container-number":"2","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"test.example.org","easyhaproxy.http.letsencrypt":"true","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"80","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}","easyhaproxy.http.redirect_ssl":"true"}, +"83d57d592e26": {"com.docker.compose.config-hash":"8c5871144f1e8a3aeca037207c02f011ab2c6e6c311a3773602b63541762dab5","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:c4232396c715f3d568816c666e6d9b4a68ef6c36f6243b4007c4ee1d8335fd65","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-test.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"static","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"test2.example.org","easyhaproxy.http.localport":"8080","easyhaproxy.http.port":"80","io.buildah.version":"1.21.0"}} \ No newline at end of file diff --git a/src/tests/fixtures/services-multi-containers b/src/tests/fixtures/services-multi-containers index 7e58c70..4257caa 100644 --- a/src/tests/fixtures/services-multi-containers +++ b/src/tests/fixtures/services-multi-containers @@ -1,2 +1,2 @@ -test_nginx.2.t5r94mjlced7m3t5orfjbowmm={"easyhaproxy.http.host":"www.helloworld.com","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","com.docker.stack.image":"stenote/nginx-hostname","com.docker.stack.namespace":"test"} -test_nginx.1.p552hqxkdx88narjrp5kouwb2={"easyhaproxy.http.host":"www.helloworld.com","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","com.docker.stack.image":"stenote/nginx-hostname","com.docker.stack.namespace":"test"} \ No newline at end of file +{"test_nginx.2.t5r94mjlced7m3t5orfjbowmm": {"easyhaproxy.http.host":"www.helloworld.com","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","com.docker.stack.image":"stenote/nginx-hostname","com.docker.stack.namespace":"test"}, +"test_nginx.1.p552hqxkdx88narjrp5kouwb2": {"easyhaproxy.http.host":"www.helloworld.com","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","com.docker.stack.image":"stenote/nginx-hostname","com.docker.stack.namespace":"test"}} \ No newline at end of file diff --git a/src/tests/fixtures/services-multiple-hosts b/src/tests/fixtures/services-multiple-hosts index c04b29a..66db013 100644 --- a/src/tests/fixtures/services-multiple-hosts +++ b/src/tests/fixtures/services-multiple-hosts @@ -1,3 +1,3 @@ -db79d3a910f4={"com.docker.compose.config-hash":"5bde40f52451521ad201e70de1291397376a0498a7c955624a609da3b60e7e8e","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:ea39067705590557dd0cd951664a10970ceefcb725a3c1f43690d6d6d4ed5fce","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-multi-containers.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"haproxy","com.docker.compose.version":"2.8.0"} -3e63154954b0={"com.docker.compose.config-hash":"4e0cbdd8372c6779863799e5021ed8178f74b55bd8e070abcdffaf87eb7baa36","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-multi-containers.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"hello.com\n, www.helloworld.com\n","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}"} -eb294c110eb1={"com.docker.compose.config-hash":"4e0cbdd8372c6779863799e5021ed8178f74b55bd8e070abcdffaf87eb7baa36","com.docker.compose.container-number":"2","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-multi-containers.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"hello.com\n, www.helloworld.com\n","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}"} \ No newline at end of file +{"db79d3a910f4": {"com.docker.compose.config-hash":"5bde40f52451521ad201e70de1291397376a0498a7c955624a609da3b60e7e8e","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:ea39067705590557dd0cd951664a10970ceefcb725a3c1f43690d6d6d4ed5fce","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-multi-containers.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"haproxy","com.docker.compose.version":"2.8.0"}, +"3e63154954b0": {"com.docker.compose.config-hash":"4e0cbdd8372c6779863799e5021ed8178f74b55bd8e070abcdffaf87eb7baa36","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-multi-containers.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"hello.com\n, www.helloworld.com\n","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}"}, +"eb294c110eb1": {"com.docker.compose.config-hash":"4e0cbdd8372c6779863799e5021ed8178f74b55bd8e070abcdffaf87eb7baa36","com.docker.compose.container-number":"2","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:bea3509d6fdc8d7f9ec95563a5a226dc977ee74fb3e980e0de70e892c2d38dde","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose-multi-containers.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"nginx","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"hello.com\n, www.helloworld.com\n","easyhaproxy.http.localport":"80","easyhaproxy.http.port":"19901","easyhaproxy.http.redirect":"{\"google.helloworld.com\": \"www.google.com\"}"}} \ No newline at end of file diff --git a/src/tests/fixtures/services-redirect-ssl b/src/tests/fixtures/services-redirect-ssl index 718450b..1e4a539 100644 --- a/src/tests/fixtures/services-redirect-ssl +++ b/src/tests/fixtures/services-redirect-ssl @@ -1,3 +1,3 @@ -3571640c480a={"com.docker.compose.config-hash":"b3089bebef089144accf08bc189c2dbd527cb2ff2b44f0fd57f031b3258d9389","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:c4232396c715f3d568816c666e6d9b4a68ef6c36f6243b4007c4ee1d8335fd65","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"container2","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"host2.local","easyhaproxy.http.port":"80","easyhaproxy.http.redirect_ssl":"true","easyhaproxy.https.host":"host2.local","easyhaproxy.https.localport":"8080","easyhaproxy.https.port":"443","easyhaproxy.https.ssl":"true","io.buildah.version":"1.21.0"} -5b69bc7fea1b={"com.docker.compose.config-hash":"e2e9424b6ef2adfa33f750e3894446c9200f24674f5cf601ad60a87430e14314","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:c4232396c715f3d568816c666e6d9b4a68ef6c36f6243b4007c4ee1d8335fd65","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"container","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"host1.local","easyhaproxy.http.port":"80","easyhaproxy.http.redirect_ssl":"true","easyhaproxy.https.host":"host1.local","easyhaproxy.https.localport":"8080","easyhaproxy.https.port":"443","easyhaproxy.https.sslcert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZEVENDQXZXZ0F3SUJBZ0lVUmkrdzFaVmdlZWRUbE5JQXdxUUJNSnY2ZFhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZqRVVNQklHQTFVRUF3d0xhRzl6ZERFdWJHOWpZV3d3SGhjTk1qRXdPREV3TVRnME9UQTJXaGNOTXpFdwpPREE0TVRnME9UQTJXakFXTVJRd0VnWURWUVFEREF0b2IzTjBNUzVzYjJOaGJEQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNQkRBaExBeWdKdWFXNnc2ZmZpZ3pUQUFHWHBtRXowdEl4bjFrNFoKeDV3TjVycHYvcXUwUU1ZeitBdjJ1MWVPS0VLWmVhRlJWcFQwcjkzZFg3SXZiRVpIdDI1R1BpQnZsTEdxaGpLUgpQblNrLzdVOFhtc250dFVBVjdyVkVLMVVyZEZ3OC9Jd3JpUUMrZGhyMG1uWWZTRE1rdkJvTUZwZGhWTlRyYkFaCjFUQjZyUWpFN0FyME10OG15OTZYSm13cmNqSzJUaitFMnJnUElVejFlNWNla0ZZSURTQmF0bXcrMyt2citUNXgKRk5Ga0oybzMwVzVvOFpmbENKSnpyVmFpaHFRaWNzNlpLRGdwZjdpcVhNRml3V0lsaGRRcEd2eDVHZi9LRlRLOQpVYU9uUlp6L1grMkNlYkFGYVRIUjNrL1BZcHBXVGdCQkJ1UnZscEN3K3dkbmttdGVDMFNRUkY5MVFXVnI3ZWpvCjdLYU9sR0k1VnR2TVVzV3ZUZUFabXBheW1JYUFURVR1T0phWTBKVTExT21MZUQ5RE9qNUUyU1E3cUlYL3BGY3AKeHB6RzVqNGMrTWxndnhQMlZBa05UZUFYQ2FZaVBCUUg1WlpnMEhFMlduQjFLaExSRmxIZDRpSFFEMkdKNXlOLwo2ZkNGQmZaZktTZUs4SmF1d3hnV2tyYTUzT2NEcS9tS2QrREEvZEsrL3J1Rzd0cXdWZ0lhMDRIT3Bsek03TFlSCkdCMElyczkrbHI1L1BKYlFabVUwNzNNZG42Y1hBZzNwKzZ3dndGbERrUzV2MTNnQkRZTkh0RjYyYmM1NTFlZEYKWjZrR3pKN3dtR1JvODRhQlA3TXVSWmVSZUxPclNTNjdhMXdMZHpac01uUDFUSjd4OUxmcjlNS2wydURuUWRuWQpleDhEQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJTUS9tdFpkNmg4ZW45WVFWSDZITzFQbFdXaXF6QWZCZ05WCkhTTUVHREFXZ0JTUS9tdFpkNmg4ZW45WVFWSDZITzFQbFdXaXF6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUNoUVlOdWFoMyttVHBJQkRZeEdyalRKTnVPVElNYVd6TXlpMXRrZitMMApzRUd3cGJtQU8ybVdXUVlGN1dWTHNpOThQVUxoM2FkanQyaml1ZDlWbGFhQzZnbnduNVpvMStQaWxvOXNOTExXCjZpajArck40a3dJbS9wTnFpK2pEdXUyY3ZBdUhJd1pXZWg4YkVlLzVVQ3hvNGlobVdGUU44ZUo2VFVLQ3BoUkMKNkVvci9TU1paQlFIZ1BsMEJjaHpIT2t3dTdSM0xDbmRScXhqaEFvVmI5eVFPVitac21UZUpYdWx3TnpKMXVMdApUOE9JZ0lpRHBtQm83SFNOMkgwazNjaHgwMEFzalV5SjltbUFXUGVqRmUvS1hMUlBjVlpSMTdqaHpnZklCRXpzCk01V3RXRm0xYUhEalZ2Nk02aXRlVm02MUU5VCtrL00xMXJ1MWUyWXdzeFREdmI2eDA0bWNyTnU5c29xZGRCYnIKVmZwbHV1b1EvaEVBYlh0Rk5Qb1R5U3B6MGN3T3djSENvd1ZPTG1kS2d2SW1zelppTXlISEc4VkdHbVBoODhuNwp3VnhiMGdWMFA0Uk1yY01MZGVUZG41NVlRcjFDcUJyMzRlQjZvbDZBc2JUbTNWekJIUlZtRk5rc2wxbzVKQjV0CnRYTGdGL0c4L3J6Si80bTFQYVZ1eHJCN0R4VW1JazhFUGJTSVZrdlp2ZDdMQnpLd1E2SWZWYXVjZXdIZkVhalEKVklpZXhTTWlGYzdsdzNLbnhqT0haamY2Rk05VllnM05vKytHZEM5OXM3TGtJdUp3QU1MTnFUUTdIdmhuN1l2UAo0RmxTSWdjNnhqMFlrR1pFUWxiNW8vNW5hdUVxUVUwQUJndzZqdEk0TnhyTkxUNmNwN0NPNE0weElERWcvM1lECmFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJSlF3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NDUzB3Z2drcEFnRUFBb0lDQVFEQVF3SVN3TW9DYm1sdQpzT24zNG9NMHdBQmw2WmhNOUxTTVo5Wk9HY2VjRGVhNmIvNnJ0RURHTS9nTDlydFhqaWhDbVhtaFVWYVU5Sy9kCjNWK3lMMnhHUjdkdVJqNGdiNVN4cW9ZeWtUNTBwUCsxUEY1cko3YlZBRmU2MVJDdFZLM1JjUFB5TUs0a0F2blkKYTlKcDJIMGd6Skx3YURCYVhZVlRVNjJ3R2RVd2VxMEl4T3dLOURMZkpzdmVseVpzSzNJeXRrNC9oTnE0RHlGTQo5WHVYSHBCV0NBMGdXclpzUHQvcjYvaytjUlRSWkNkcU45RnVhUEdYNVFpU2M2MVdvb2FrSW5MT21TZzRLWCs0CnFsekJZc0ZpSllYVUtScjhlUm4veWhVeXZWR2pwMFdjLzEvdGdubXdCV2t4MGQ1UHoyS2FWazRBUVFia2I1YVEKc1BzSFo1SnJYZ3RFa0VSZmRVRmxhKzNvNk95bWpwUmlPVmJiekZMRnIwM2dHWnFXc3BpR2dFeEU3amlXbU5DVgpOZFRwaTNnL1F6bytSTmtrTzZpRi82UlhLY2FjeHVZK0hQakpZTDhUOWxRSkRVM2dGd21tSWp3VUIrV1dZTkJ4Ck5scHdkU29TMFJaUjNlSWgwQTloaWVjamYrbndoUVgyWHlrbml2Q1dyc01ZRnBLMnVkem5BNnY1aW5mZ3dQM1MKdnY2N2h1N2FzRllDR3RPQnpxWmN6T3kyRVJnZENLN1BmcGErZnp5VzBHWmxOTzl6SForbkZ3SU42ZnVzTDhCWgpRNUV1YjlkNEFRMkRSN1JldG0zT2VkWG5SV2VwQnN5ZThKaGthUE9HZ1QrekxrV1hrWGl6cTBrdXUydGNDM2MyCmJESno5VXllOGZTMzYvVENwZHJnNTBIWjJIc2ZBd0lEQVFBQkFvSUNBUUMveFpiWjBjY3RxYWdzcXZhVk5URWUKZXExcStoZmFHdlBFWVFhWUhJcklFKzJpNVhjbkdjTEtjS2ZvZHhEakFuOFIvemdkT3A2Y01YMENWbi9Qb2hIawpBRUR0RTgrQVZ3d0FNMUZzT3dnTEhWR2FHejhxcnhCbFlkUWdIY3BtdWVJdTJQWGJDOGVIVUJpYVVPSXVoYXc1Ci9SUk1EQUMvQWkyc3NmaTdnT2p2VkU0b1F4UVcwUUcxS0dPT0FVSm4vdVlIdzJSRlkyVXUxcGlteE8ya0RPNTMKZ2N4bUMxV09ueUNIbUhhaVcvVWg3ejZKYW1mU000ZFh0VEpac2x5aDM3ZGhIS05iZzlWa1A3Q1FLQTRoTHpvcApoYmY1cVk2cmFyZ09OaW55MUhnTVB4cm13S3VVb3VKeU90TjB5QnR4akRDVU5hWFVCd2l5N3NOR1MrSDR2c3lCCjVQOUhoSUhTdHUrRlp0M0hHN0VJcUNuZGlhU0tEUzRqV2FWUUFiYm80bloyWnMyQkQreERlUFJDUlVxWDdyTTQKNFh6UElSV1dYbW1XZi83SWcyOUhicnA0YTlMY09tUTJsZUNKdGJhVEZTTjk2T0xVSjVFK2hRMHVsQ1pnQlZtUQpSQ1VZa0pQNGxPemJhS2R6anhnSE1ySHptNDVlVUZmOExpck94aTJ1eXhYSFFtRE51NGIzWDE4a3QzUGdVbVVtCjNkWHBsM2ZxU3lKYTdTQ1Y4Wk5CcnNyRHExRSt0aFl0dTkxUWJWU0d4SGQ5SHJOVmUzWGRMYk9DZFU5Q3VDNjkKTmdsem5hYTdzWkxxbXlLZWpUZkdzWTd4cldkTmNNUGw0cDRmY0lEL080RXBBU1pmb3JwVGVLTlQwWklmWlpldwpiMG1BUWVZWnFRTThpL3FNWU4vdUFRS0NBUUVBNXFnMXNSTk1jNlZkTS90UmdsYXNHWW94amdSQzJPcUFEWmdzCm1BWE1VSjNrRXJweXh0K2VDaW15OGlidVlwelJUSVE4ZkJUV1JrQ3RSWlhKNytLY0xWdGs5UVpJb0xiaHlOd2QKNEl4RVFaRnVVbGpEYnZTalRMU3ljc0h2bzY1aWJXSWZUTDdiZ1dsTEdnR3EvVU96ZkdzZ0g2Uzl3THA1RzMwRwo4RUx5akk1ZVRJWUlDcmZUbVZMK2M0NU1ScEVNS28rY3Z6OFB5c2lhT0ZUbjNjeXN3UFZkWWFlRUVxTVFqVTh3CklHTnNHWkx5dFk3QkFCQmNZMGxkcnRiYS9PK0Z2LytSSDd1VXR6UDd4cENJd0ZDeDgwWnpOK1dSeTlOdkk2M1UKenEzeUlCb1c5R3lBcEQyK1BMYVBOeGY3UUxUVUNoWTFaei9kWVJsdEtPeHYyQWE1Z1FLQ0FRRUExV0xXTnFwMApmaEIvWnRmU0VTaHhGTU04OWNqTjZBYXoxV0tMN3VUQm91OW9TSm54amtoa2FWNzZhY25UL2lxWHR4TU5nSGkxCmZJbURwVTNQdk0wWTRVZDJUNDdvSGM2UDFCclpQTi9HbVh5L3M2QkFFZFB3TGU3Sis0blRJU0hBZEdtcmgrYS8KNXBrdHUzMmc5bFdxZnR4ZWNGSVZTTFBXa3hUMFhLaU14cDFmZmtMK09hdnBNZ01GWks0MWlLczNkTlNoS1BvZwpMOEdTUGNQOXgveW43OFAyZUszTitQR2psQTZwUHpyQU55V1U3TjAvYm1IY0I5VEtQK3VkWVdjalZocnU3TVlOCndOckU0a0tkQzh2OGk3eDd0RGJ2Yjc5VCtGbzZQSWg1M3AwT3NuWnpBOFVSMFFOUit2RFF1ZlF1eWFqOFJFQysKWkc4WXlDS3N2azh5Z3dLQ0FRQS9mc1N4QjBmL2VlRXJZeDZ3QzUzNnRlRW9ZQ0hxeHJzVGd2V2JyOVRyeUZzMQprSi95QVRMblIwMWNmYjBYNW1WemM5K1dwTUhMdXhnMzFLRXZhU2xuRHdhK3NNa2pmTlN3ejI5bUZoYmdHZUhOCngyT2RVcmoxYjdURUJJRXNoTi9SanJaaEVSVXFEY3MvMEgrNmtuMkJYWmdOUGZPQ2I1TFJMMXpPblE5YUJBTVAKZThJUStVUEZyR1FoZVdXajgxL3ZBM081N2VreUFJRDd5dHU5WWcrWVdyTW5JODhtdGo3ak40NWZEQitBOXNQYgptUDJtUDlxKzlqNVUyQTZXbkhVc1FuVTMwQktEVUVzYUFVV3o4MExaWG1adlY4SUg0eDl3S2ZVd0pCQklLQVp6CnFMN005N1k3em1Ha1gvU3BmbDMwbk9KOGxzY2hhTGQxRVlsRVphMkJBb0lCQVFDeWUyNVQ0VFY1TUpGdjB6dVoKTUd1TmcxU2MvTzRGa24yZkVVT2NlV2pod1VCSDRjUGpUL2YxRHdXRHNOYUo5TlJieENyNTkzMU9BclBEYzVjOApBNDA0K1k0ak01UkJRa0tabGk5NHRIQW9kK2pjOVVCQjZUVXZKbGw1OVNsTXdDOTY3OXdTMjFaT0tuZlBLR0NYClNzWkdRRXNaeGY2Wmhoc0hnWEozZ2wvbHpVSlBtUGVPQTVZVlIrT2Q5LzA5S0lGRlRvalNmb3luaFZDdUt4NDkKeGI0dVZZbjJIT0o0eEowZlBUZ2hkQ0hNdnJtWGVlUVJqdmI4OGVhTm1xVlVFSEhGRnRnYjRma2xBNWZFN1JUeApCaGxpUkRCd1o3YlVrSU5LNnlWazluNkJUbnM1bU12UkxtZ2RuSnBZdkU3S0MwMkxUYlpiM0krajhDMFpVYStOCnF5N0RBb0lCQUFpZXJpYlM3V1VjbDJhQmxrbTUrVzdxTm0vSU5tNXp2bm9TUG82VjN3YTVoczZmOStDL2tiZEYKODdqUVBBL1lGZTN1UjJzQUo3c2xYNWV1Wks4V21mcEZtZ3psdTBzRXo4MU1MUS9XeXBadFp5dHlWdFd6QjJQdQpYQ1cxdGRTSDllSTJCbWhYZ29rSE5UTTQ4TmsveE9FTnJQL3NlWHJJeDVMSzBobkRIWm90dS96NitZU2tCOWhGCmNtMmZaeWdEMWRNTFg2bGlSaW14eUZZK2RJQ0pOQjk1SmlmVExXWW5XZUdkZGt3UHRYVWVHWEUxb2x6dk5rTEQKek16RTA5dWhreC9sUkpudGVPQkVaYWY4ME9CLzA5T2k5YjkvcnhZNTlkd3NINkdheExvVGZFS3VQbnZCVk1OUgpZa1UxNFd6UUtsZUZraUJKSTlsVnZuZmdHbk9sZ2cwPQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t","io.buildah.version":"1.21.0"} -77094604be33={"com.docker.compose.config-hash":"b671dd783e367918c604400fe83cd2450c845a555bda6769bd1351bdcce3c565","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:4e24fb65b607dc3b105ab5ec5945707ccbf50ac32605e7f4935440b453b7c45c","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"haproxy","com.docker.compose.version":"2.8.0"} +{"3571640c480a": {"com.docker.compose.config-hash":"b3089bebef089144accf08bc189c2dbd527cb2ff2b44f0fd57f031b3258d9389","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:c4232396c715f3d568816c666e6d9b4a68ef6c36f6243b4007c4ee1d8335fd65","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"container2","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"host2.local","easyhaproxy.http.port":"80","easyhaproxy.http.redirect_ssl":"true","easyhaproxy.https.host":"host2.local","easyhaproxy.https.localport":"8080","easyhaproxy.https.port":"443","easyhaproxy.https.ssl":"true","io.buildah.version":"1.21.0"}, +"5b69bc7fea1b": {"com.docker.compose.config-hash":"e2e9424b6ef2adfa33f750e3894446c9200f24674f5cf601ad60a87430e14314","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:c4232396c715f3d568816c666e6d9b4a68ef6c36f6243b4007c4ee1d8335fd65","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"container","com.docker.compose.version":"2.8.0","easyhaproxy.http.host":"host1.local","easyhaproxy.http.port":"80","easyhaproxy.http.redirect_ssl":"true","easyhaproxy.https.host":"host1.local","easyhaproxy.https.localport":"8080","easyhaproxy.https.port":"443","easyhaproxy.https.sslcert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZEVENDQXZXZ0F3SUJBZ0lVUmkrdzFaVmdlZWRUbE5JQXdxUUJNSnY2ZFhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZqRVVNQklHQTFVRUF3d0xhRzl6ZERFdWJHOWpZV3d3SGhjTk1qRXdPREV3TVRnME9UQTJXaGNOTXpFdwpPREE0TVRnME9UQTJXakFXTVJRd0VnWURWUVFEREF0b2IzTjBNUzVzYjJOaGJEQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNQkRBaExBeWdKdWFXNnc2ZmZpZ3pUQUFHWHBtRXowdEl4bjFrNFoKeDV3TjVycHYvcXUwUU1ZeitBdjJ1MWVPS0VLWmVhRlJWcFQwcjkzZFg3SXZiRVpIdDI1R1BpQnZsTEdxaGpLUgpQblNrLzdVOFhtc250dFVBVjdyVkVLMVVyZEZ3OC9Jd3JpUUMrZGhyMG1uWWZTRE1rdkJvTUZwZGhWTlRyYkFaCjFUQjZyUWpFN0FyME10OG15OTZYSm13cmNqSzJUaitFMnJnUElVejFlNWNla0ZZSURTQmF0bXcrMyt2citUNXgKRk5Ga0oybzMwVzVvOFpmbENKSnpyVmFpaHFRaWNzNlpLRGdwZjdpcVhNRml3V0lsaGRRcEd2eDVHZi9LRlRLOQpVYU9uUlp6L1grMkNlYkFGYVRIUjNrL1BZcHBXVGdCQkJ1UnZscEN3K3dkbmttdGVDMFNRUkY5MVFXVnI3ZWpvCjdLYU9sR0k1VnR2TVVzV3ZUZUFabXBheW1JYUFURVR1T0phWTBKVTExT21MZUQ5RE9qNUUyU1E3cUlYL3BGY3AKeHB6RzVqNGMrTWxndnhQMlZBa05UZUFYQ2FZaVBCUUg1WlpnMEhFMlduQjFLaExSRmxIZDRpSFFEMkdKNXlOLwo2ZkNGQmZaZktTZUs4SmF1d3hnV2tyYTUzT2NEcS9tS2QrREEvZEsrL3J1Rzd0cXdWZ0lhMDRIT3Bsek03TFlSCkdCMElyczkrbHI1L1BKYlFabVUwNzNNZG42Y1hBZzNwKzZ3dndGbERrUzV2MTNnQkRZTkh0RjYyYmM1NTFlZEYKWjZrR3pKN3dtR1JvODRhQlA3TXVSWmVSZUxPclNTNjdhMXdMZHpac01uUDFUSjd4OUxmcjlNS2wydURuUWRuWQpleDhEQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJTUS9tdFpkNmg4ZW45WVFWSDZITzFQbFdXaXF6QWZCZ05WCkhTTUVHREFXZ0JTUS9tdFpkNmg4ZW45WVFWSDZITzFQbFdXaXF6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUNoUVlOdWFoMyttVHBJQkRZeEdyalRKTnVPVElNYVd6TXlpMXRrZitMMApzRUd3cGJtQU8ybVdXUVlGN1dWTHNpOThQVUxoM2FkanQyaml1ZDlWbGFhQzZnbnduNVpvMStQaWxvOXNOTExXCjZpajArck40a3dJbS9wTnFpK2pEdXUyY3ZBdUhJd1pXZWg4YkVlLzVVQ3hvNGlobVdGUU44ZUo2VFVLQ3BoUkMKNkVvci9TU1paQlFIZ1BsMEJjaHpIT2t3dTdSM0xDbmRScXhqaEFvVmI5eVFPVitac21UZUpYdWx3TnpKMXVMdApUOE9JZ0lpRHBtQm83SFNOMkgwazNjaHgwMEFzalV5SjltbUFXUGVqRmUvS1hMUlBjVlpSMTdqaHpnZklCRXpzCk01V3RXRm0xYUhEalZ2Nk02aXRlVm02MUU5VCtrL00xMXJ1MWUyWXdzeFREdmI2eDA0bWNyTnU5c29xZGRCYnIKVmZwbHV1b1EvaEVBYlh0Rk5Qb1R5U3B6MGN3T3djSENvd1ZPTG1kS2d2SW1zelppTXlISEc4VkdHbVBoODhuNwp3VnhiMGdWMFA0Uk1yY01MZGVUZG41NVlRcjFDcUJyMzRlQjZvbDZBc2JUbTNWekJIUlZtRk5rc2wxbzVKQjV0CnRYTGdGL0c4L3J6Si80bTFQYVZ1eHJCN0R4VW1JazhFUGJTSVZrdlp2ZDdMQnpLd1E2SWZWYXVjZXdIZkVhalEKVklpZXhTTWlGYzdsdzNLbnhqT0haamY2Rk05VllnM05vKytHZEM5OXM3TGtJdUp3QU1MTnFUUTdIdmhuN1l2UAo0RmxTSWdjNnhqMFlrR1pFUWxiNW8vNW5hdUVxUVUwQUJndzZqdEk0TnhyTkxUNmNwN0NPNE0weElERWcvM1lECmFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJSlF3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NDUzB3Z2drcEFnRUFBb0lDQVFEQVF3SVN3TW9DYm1sdQpzT24zNG9NMHdBQmw2WmhNOUxTTVo5Wk9HY2VjRGVhNmIvNnJ0RURHTS9nTDlydFhqaWhDbVhtaFVWYVU5Sy9kCjNWK3lMMnhHUjdkdVJqNGdiNVN4cW9ZeWtUNTBwUCsxUEY1cko3YlZBRmU2MVJDdFZLM1JjUFB5TUs0a0F2blkKYTlKcDJIMGd6Skx3YURCYVhZVlRVNjJ3R2RVd2VxMEl4T3dLOURMZkpzdmVseVpzSzNJeXRrNC9oTnE0RHlGTQo5WHVYSHBCV0NBMGdXclpzUHQvcjYvaytjUlRSWkNkcU45RnVhUEdYNVFpU2M2MVdvb2FrSW5MT21TZzRLWCs0CnFsekJZc0ZpSllYVUtScjhlUm4veWhVeXZWR2pwMFdjLzEvdGdubXdCV2t4MGQ1UHoyS2FWazRBUVFia2I1YVEKc1BzSFo1SnJYZ3RFa0VSZmRVRmxhKzNvNk95bWpwUmlPVmJiekZMRnIwM2dHWnFXc3BpR2dFeEU3amlXbU5DVgpOZFRwaTNnL1F6bytSTmtrTzZpRi82UlhLY2FjeHVZK0hQakpZTDhUOWxRSkRVM2dGd21tSWp3VUIrV1dZTkJ4Ck5scHdkU29TMFJaUjNlSWgwQTloaWVjamYrbndoUVgyWHlrbml2Q1dyc01ZRnBLMnVkem5BNnY1aW5mZ3dQM1MKdnY2N2h1N2FzRllDR3RPQnpxWmN6T3kyRVJnZENLN1BmcGErZnp5VzBHWmxOTzl6SForbkZ3SU42ZnVzTDhCWgpRNUV1YjlkNEFRMkRSN1JldG0zT2VkWG5SV2VwQnN5ZThKaGthUE9HZ1QrekxrV1hrWGl6cTBrdXUydGNDM2MyCmJESno5VXllOGZTMzYvVENwZHJnNTBIWjJIc2ZBd0lEQVFBQkFvSUNBUUMveFpiWjBjY3RxYWdzcXZhVk5URWUKZXExcStoZmFHdlBFWVFhWUhJcklFKzJpNVhjbkdjTEtjS2ZvZHhEakFuOFIvemdkT3A2Y01YMENWbi9Qb2hIawpBRUR0RTgrQVZ3d0FNMUZzT3dnTEhWR2FHejhxcnhCbFlkUWdIY3BtdWVJdTJQWGJDOGVIVUJpYVVPSXVoYXc1Ci9SUk1EQUMvQWkyc3NmaTdnT2p2VkU0b1F4UVcwUUcxS0dPT0FVSm4vdVlIdzJSRlkyVXUxcGlteE8ya0RPNTMKZ2N4bUMxV09ueUNIbUhhaVcvVWg3ejZKYW1mU000ZFh0VEpac2x5aDM3ZGhIS05iZzlWa1A3Q1FLQTRoTHpvcApoYmY1cVk2cmFyZ09OaW55MUhnTVB4cm13S3VVb3VKeU90TjB5QnR4akRDVU5hWFVCd2l5N3NOR1MrSDR2c3lCCjVQOUhoSUhTdHUrRlp0M0hHN0VJcUNuZGlhU0tEUzRqV2FWUUFiYm80bloyWnMyQkQreERlUFJDUlVxWDdyTTQKNFh6UElSV1dYbW1XZi83SWcyOUhicnA0YTlMY09tUTJsZUNKdGJhVEZTTjk2T0xVSjVFK2hRMHVsQ1pnQlZtUQpSQ1VZa0pQNGxPemJhS2R6anhnSE1ySHptNDVlVUZmOExpck94aTJ1eXhYSFFtRE51NGIzWDE4a3QzUGdVbVVtCjNkWHBsM2ZxU3lKYTdTQ1Y4Wk5CcnNyRHExRSt0aFl0dTkxUWJWU0d4SGQ5SHJOVmUzWGRMYk9DZFU5Q3VDNjkKTmdsem5hYTdzWkxxbXlLZWpUZkdzWTd4cldkTmNNUGw0cDRmY0lEL080RXBBU1pmb3JwVGVLTlQwWklmWlpldwpiMG1BUWVZWnFRTThpL3FNWU4vdUFRS0NBUUVBNXFnMXNSTk1jNlZkTS90UmdsYXNHWW94amdSQzJPcUFEWmdzCm1BWE1VSjNrRXJweXh0K2VDaW15OGlidVlwelJUSVE4ZkJUV1JrQ3RSWlhKNytLY0xWdGs5UVpJb0xiaHlOd2QKNEl4RVFaRnVVbGpEYnZTalRMU3ljc0h2bzY1aWJXSWZUTDdiZ1dsTEdnR3EvVU96ZkdzZ0g2Uzl3THA1RzMwRwo4RUx5akk1ZVRJWUlDcmZUbVZMK2M0NU1ScEVNS28rY3Z6OFB5c2lhT0ZUbjNjeXN3UFZkWWFlRUVxTVFqVTh3CklHTnNHWkx5dFk3QkFCQmNZMGxkcnRiYS9PK0Z2LytSSDd1VXR6UDd4cENJd0ZDeDgwWnpOK1dSeTlOdkk2M1UKenEzeUlCb1c5R3lBcEQyK1BMYVBOeGY3UUxUVUNoWTFaei9kWVJsdEtPeHYyQWE1Z1FLQ0FRRUExV0xXTnFwMApmaEIvWnRmU0VTaHhGTU04OWNqTjZBYXoxV0tMN3VUQm91OW9TSm54amtoa2FWNzZhY25UL2lxWHR4TU5nSGkxCmZJbURwVTNQdk0wWTRVZDJUNDdvSGM2UDFCclpQTi9HbVh5L3M2QkFFZFB3TGU3Sis0blRJU0hBZEdtcmgrYS8KNXBrdHUzMmc5bFdxZnR4ZWNGSVZTTFBXa3hUMFhLaU14cDFmZmtMK09hdnBNZ01GWks0MWlLczNkTlNoS1BvZwpMOEdTUGNQOXgveW43OFAyZUszTitQR2psQTZwUHpyQU55V1U3TjAvYm1IY0I5VEtQK3VkWVdjalZocnU3TVlOCndOckU0a0tkQzh2OGk3eDd0RGJ2Yjc5VCtGbzZQSWg1M3AwT3NuWnpBOFVSMFFOUit2RFF1ZlF1eWFqOFJFQysKWkc4WXlDS3N2azh5Z3dLQ0FRQS9mc1N4QjBmL2VlRXJZeDZ3QzUzNnRlRW9ZQ0hxeHJzVGd2V2JyOVRyeUZzMQprSi95QVRMblIwMWNmYjBYNW1WemM5K1dwTUhMdXhnMzFLRXZhU2xuRHdhK3NNa2pmTlN3ejI5bUZoYmdHZUhOCngyT2RVcmoxYjdURUJJRXNoTi9SanJaaEVSVXFEY3MvMEgrNmtuMkJYWmdOUGZPQ2I1TFJMMXpPblE5YUJBTVAKZThJUStVUEZyR1FoZVdXajgxL3ZBM081N2VreUFJRDd5dHU5WWcrWVdyTW5JODhtdGo3ak40NWZEQitBOXNQYgptUDJtUDlxKzlqNVUyQTZXbkhVc1FuVTMwQktEVUVzYUFVV3o4MExaWG1adlY4SUg0eDl3S2ZVd0pCQklLQVp6CnFMN005N1k3em1Ha1gvU3BmbDMwbk9KOGxzY2hhTGQxRVlsRVphMkJBb0lCQVFDeWUyNVQ0VFY1TUpGdjB6dVoKTUd1TmcxU2MvTzRGa24yZkVVT2NlV2pod1VCSDRjUGpUL2YxRHdXRHNOYUo5TlJieENyNTkzMU9BclBEYzVjOApBNDA0K1k0ak01UkJRa0tabGk5NHRIQW9kK2pjOVVCQjZUVXZKbGw1OVNsTXdDOTY3OXdTMjFaT0tuZlBLR0NYClNzWkdRRXNaeGY2Wmhoc0hnWEozZ2wvbHpVSlBtUGVPQTVZVlIrT2Q5LzA5S0lGRlRvalNmb3luaFZDdUt4NDkKeGI0dVZZbjJIT0o0eEowZlBUZ2hkQ0hNdnJtWGVlUVJqdmI4OGVhTm1xVlVFSEhGRnRnYjRma2xBNWZFN1JUeApCaGxpUkRCd1o3YlVrSU5LNnlWazluNkJUbnM1bU12UkxtZ2RuSnBZdkU3S0MwMkxUYlpiM0krajhDMFpVYStOCnF5N0RBb0lCQUFpZXJpYlM3V1VjbDJhQmxrbTUrVzdxTm0vSU5tNXp2bm9TUG82VjN3YTVoczZmOStDL2tiZEYKODdqUVBBL1lGZTN1UjJzQUo3c2xYNWV1Wks4V21mcEZtZ3psdTBzRXo4MU1MUS9XeXBadFp5dHlWdFd6QjJQdQpYQ1cxdGRTSDllSTJCbWhYZ29rSE5UTTQ4TmsveE9FTnJQL3NlWHJJeDVMSzBobkRIWm90dS96NitZU2tCOWhGCmNtMmZaeWdEMWRNTFg2bGlSaW14eUZZK2RJQ0pOQjk1SmlmVExXWW5XZUdkZGt3UHRYVWVHWEUxb2x6dk5rTEQKek16RTA5dWhreC9sUkpudGVPQkVaYWY4ME9CLzA5T2k5YjkvcnhZNTlkd3NINkdheExvVGZFS3VQbnZCVk1OUgpZa1UxNFd6UUtsZUZraUJKSTlsVnZuZmdHbk9sZ2cwPQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t","io.buildah.version":"1.21.0"}, +"77094604be33": {"com.docker.compose.config-hash":"b671dd783e367918c604400fe83cd2450c845a555bda6769bd1351bdcce3c565","com.docker.compose.container-number":"1","com.docker.compose.depends_on":"","com.docker.compose.image":"sha256:4e24fb65b607dc3b105ab5ec5945707ccbf50ac32605e7f4935440b453b7c45c","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"/workspace/docker-easy-haproxy/examples/docker/docker-compose.yml","com.docker.compose.project.working_dir":"/workspace/docker-easy-haproxy/examples/docker","com.docker.compose.service":"haproxy","com.docker.compose.version":"2.8.0"}} \ No newline at end of file diff --git a/src/tests/fixtures/services-tcp b/src/tests/fixtures/services-tcp index 41f7410..5b5c2b0 100644 --- a/src/tests/fixtures/services-tcp +++ b/src/tests/fixtures/services-tcp @@ -1,2 +1,2 @@ -test_agent={"easyhaproxy.agent.host":"agent.quantum.local","easyhaproxy.agent.localport":"9001","easyhaproxy.agent.mode":"tcp","easyhaproxy.agent.port":"31339","com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"test", "easyhaproxy.agent.health-check":"ssl"} -test_proxy={"com.docker.stack.image":"byjg/easy-haproxy:local","com.docker.stack.namespace":"test"} +{"test_agent": {"easyhaproxy.agent.host":"agent.quantum.local","easyhaproxy.agent.localport":"9001","easyhaproxy.agent.mode":"tcp","easyhaproxy.agent.port":"31339","com.docker.stack.image":"portainer/agent:1.5.1","com.docker.stack.namespace":"test", "easyhaproxy.agent.health-check":"ssl"}, +"test_proxy": {"com.docker.stack.image":"byjg/easy-haproxy:local","com.docker.stack.namespace":"test"}} \ No newline at end of file diff --git a/src/tests/test_parser.py b/src/tests/test_parser.py index 81b4dfc..f46e6bf 100644 --- a/src/tests/test_parser.py +++ b/src/tests/test_parser.py @@ -2,6 +2,7 @@ import easymapping import pytest import os import yaml +import json CERTS_FOLDER="/tmp/certs" CERT_FILE="/tmp/certs/haproxy/www.somehost.com.br.pem" @@ -10,7 +11,7 @@ LETSENCRYPT_EMAIL="some@email.com" def load_fixture(file): path = os.path.dirname(os.path.realpath(__file__)) with open(path + "/fixtures/" + file, 'r') as content_file: - line_list = content_file.readlines() + line_list = json.loads("".join(content_file.readlines())) return line_list @@ -25,7 +26,7 @@ def test_parser_doesnt_crash(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -47,10 +48,7 @@ def test_parser_finds_services(): } } - if os.path.exists(CERT_FILE): - os.remove(CERT_FILE) - - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -58,8 +56,7 @@ def test_parser_finds_services(): with open(path + "/expected/services.txt", 'r') as expected_file: assert expected_file.read() == haproxy_config - with open(CERT_FILE, 'r') as expected_file: - assert expected_file.read() == "Some PEM Certificate" + assert {"www.somehost.com.br.pem":"Some PEM Certificate"} == cfg.certs assert ['node-exporter.quantum.example.org'] == cfg.letsencrypt_hosts @@ -80,7 +77,7 @@ def test_parser_finds_services_changed_label(): if os.path.exists(CERT_FILE): os.remove(CERT_FILE) - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -88,8 +85,7 @@ def test_parser_finds_services_changed_label(): with open(path + "/expected/services.txt", 'r') as expected_file: assert expected_file.read() == haproxy_config - with open(CERT_FILE, 'r') as expected_file: - assert expected_file.read() == "Some PEM Certificate" + assert {"www.somehost.com.br.pem":"Some PEM Certificate"} == cfg.certs assert ['node-exporter.quantum.example.org'] == cfg.letsencrypt_hosts @@ -109,7 +105,7 @@ def test_parser_finds_services_raw(): if os.path.exists(CERT_FILE): os.remove(CERT_FILE) - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) parsed_object = [ { @@ -217,7 +213,7 @@ def test_parser_static(): with open(path + "/fixtures/static.yml", 'r') as content_file: parsed = yaml.load(content_file.read(), Loader=yaml.FullLoader) - cfg = easymapping.HaproxyConfigGenerator(parsed, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(parsed) haproxy_config = cfg.generate() assert len(haproxy_config) > 0 @@ -295,7 +291,7 @@ def test_parser_tcp(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) # print(haproxy_config) @@ -315,7 +311,7 @@ def test_parser_multi_containers(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -337,7 +333,7 @@ def test_parser_multiple_hosts(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -358,7 +354,7 @@ def test_parser_redirect_ssl(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -379,7 +375,7 @@ def test_parser_ssl_strict(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -396,7 +392,7 @@ def test_parser_ssl_loose(): "ssl_mode": "loose", } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -418,7 +414,7 @@ def test_parser_ssl_letsencrypt(): } } - cfg = easymapping.HaproxyConfigGenerator(result, CERTS_FOLDER) + cfg = easymapping.HaproxyConfigGenerator(result) haproxy_config = cfg.generate(line_list) assert len(haproxy_config) > 0 @@ -430,4 +426,5 @@ def test_parser_ssl_letsencrypt(): #test_parser_finds_services_raw() #test_parser_tcp() #test_parser_multiple_hosts() -#test_parser_ssl_letsencrypt() \ No newline at end of file +#test_parser_ssl_letsencrypt() +#test_parser_finds_services() \ No newline at end of file From d8f1931f193492cec7a84dc84cdcd497780e0db4 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 00:40:54 +0000 Subject: [PATCH 12/45] Remove obsolete files --- assets/scripts/functions.sh | 9 ---- assets/scripts/haproxy-reload.sh | 81 -------------------------------- assets/scripts/haproxy.sh | 29 ------------ assets/scripts/k8s.py | 55 ---------------------- assets/scripts/static.py | 22 --------- assets/scripts/swarm.py | 34 -------------- 6 files changed, 230 deletions(-) delete mode 100644 assets/scripts/functions.sh delete mode 100755 assets/scripts/haproxy-reload.sh delete mode 100755 assets/scripts/haproxy.sh delete mode 100644 assets/scripts/k8s.py delete mode 100644 assets/scripts/static.py delete mode 100644 assets/scripts/swarm.py diff --git a/assets/scripts/functions.sh b/assets/scripts/functions.sh deleted file mode 100644 index e90e730..0000000 --- a/assets/scripts/functions.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -function log() { - # ARGS: - # - loglevel - # - app - # - message - echo [$2] $(date +"$EASYHAPROXY_DATEFORMAT") [$1]: $3 -} diff --git a/assets/scripts/haproxy-reload.sh b/assets/scripts/haproxy-reload.sh deleted file mode 100755 index 7cd3822..0000000 --- a/assets/scripts/haproxy-reload.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash - -source /scripts/functions.sh - -cd /scripts - -RELOAD="true" - -if [[ "$EASYHAPROXY_DISCOVER" == "static" ]]; then - CONTROL_FILE="/etc/haproxy/haproxy.cfg" - touch ${CONTROL_FILE} - cp ${CONTROL_FILE} ${CONTROL_FILE}.old - python3 static.py /etc/haproxy/easyconfig.yml > ${CONTROL_FILE} -else - CONTROL_FILE="/tmp/.docker_data" - touch ${CONTROL_FILE} - mv ${CONTROL_FILE} ${CONTROL_FILE}.old - touch ${CONTROL_FILE} - - case "$EASYHAPROXY_DISCOVER" in - docker) - CONTAINERS=$(docker ps -q | sort | uniq) - LABEL_PATH=".Config.Labels" - - for container in ${CONTAINERS}; do - docker inspect --format "{{ json $LABEL_PATH }}" ${container} | xargs -I % echo ${container}=% >> ${CONTROL_FILE} - done - ;; - - swarm) - CONTAINERS=$(docker node ps $(docker node ls -q) --format "{{ .Name }}" --filter desired-state=running | cut -d. -f1 | sort | uniq) - LABEL_PATH=".Spec.Labels" - - for container in ${CONTAINERS}; do - docker service inspect --format "{{ json $LABEL_PATH }}" ${container} | xargs -I % echo ${container}=% >> ${CONTROL_FILE} - done - ;; - - kubernetes) - python3 /scripts/k8s.py > ${CONTROL_FILE} - ;; - - *) - log "error" "CONF_CHECK" "EASYHAPROXY_DISCOVER should be 'static', 'docker', 'swarm' or kubernetes. I got '$EASYHAPROXY_DISCOVER' instead." - exit 1 - ;; - esac - - if cmp -s ${CONTROL_FILE} ${CONTROL_FILE}.old ; then - RELOAD="false" - else - python3 swarm.py > /etc/haproxy/haproxy.cfg - log "info" "CONF_CHECK" "New configuration found" - fi -fi - -if cmp -s ${CONTROL_FILE} ${CONTROL_FILE}.old ; then - RELOAD="false" -fi - -if [[ ! -z "$1" ]]; then - log "info" "CONF_CHECK" "Initial configuration. Skip certbot." -else - /scripts/certbot.sh -fi - -# If Certbot reloads successfully will create the file /tmp/force-reload -if [ -f /tmp/force-reload ]; then - log "info" "CONF_CHECK" "New certificates found..." - RELOAD="true" - rm /tmp/force-reload -fi - -if [[ ! -z "$1" ]]; then - log "info" "CONF_CHECK" "Starting haproxy..." - /usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg $(ls /etc/haproxy/conf.d/*.cfg 2>/dev/null | xargs -I{} echo -f {}) -p /run/haproxy.pid -S /var/run/haproxy.sock & - -elif [[ "$RELOAD" == "true" ]]; then - log "info" "CONF_CHECK" "Reloading..." - /usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg $(ls /etc/haproxy/conf.d/*.cfg 2>/dev/null | xargs -I{} echo -f {}) -p /run/haproxy.pid -x /var/run/haproxy.sock -sf $(cat /run/haproxy.pid) & -fi diff --git a/assets/scripts/haproxy.sh b/assets/scripts/haproxy.sh deleted file mode 100755 index 92c15e5..0000000 --- a/assets/scripts/haproxy.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash - -source /scripts/functions.sh - -/usr/sbin/haproxy -v - -if [ -z "$EASYHAPROXY_DATEFORMAT" ]; then - export EASYHAPROXY_DATEFORMAT="%Y-%m-%d %H:%M:%S %Z" -fi - -if [ -z "$EASYHAPROXY_REFRESH_CONF" ]; then - export EASYHAPROXY_REFRESH_CONF=10 -fi - - -cat banner.txt -echo Release: $RELEASE_VERSION -echo -echo "Environment" -env | sort | grep 'HAPROXY' | xargs -I{} echo " - {} " -echo - -/scripts/haproxy-reload.sh initial - -while true; do - sleep $EASYHAPROXY_REFRESH_CONF - log "info" "CONF_CHECK" "Heartbeat." - /scripts/haproxy-reload.sh -done diff --git a/assets/scripts/k8s.py b/assets/scripts/k8s.py deleted file mode 100644 index a1b2cf4..0000000 --- a/assets/scripts/k8s.py +++ /dev/null @@ -1,55 +0,0 @@ -from kubernetes import client, config -from kubernetes.client.rest import ApiException -import json - -# https://github.com/kubernetes-client/python/tree/master/kubernetes/docs - - -# Fix error: -# raise MaxRetryError(_pool, url, error or ResponseError(cause)) -# urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='10.152.183.1', port=443): Max retries exceeded with url: /api/v1/namespaces/parking/services/parking-valida-me (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)'))) - -def main(): - config.load_incluster_config() - - api_instance = client.CoreV1Api() - v1 = client.NetworkingV1Api() - - ret = v1.list_ingress_for_all_namespaces(watch=False) - - discover = {} - for i in ret.items: - if i.metadata.annotations['kubernetes.io/ingress.class'] != "easyhaproxy-ingress": - continue - - data = {} - #ingress_name = i.metadata.name - data["creation_timestamp"] = i.metadata.creation_timestamp.strftime("%x %X") - data["resource_version"] = i.metadata.resource_version - data["namespace"] = i.metadata.namespace - for rule in i.spec.rules: - rule_data = {} - port_number = rule.http.paths[0].backend.service.port.number - definition = rule.host.replace(".", "-") - rule_data["easyhaproxy.%s_%s.host" % (definition, port_number)] = rule.host - rule_data["easyhaproxy.%s_%s.port" % (definition, port_number)] = "80" - rule_data["easyhaproxy.%s_%s.localport" % (definition, port_number)] = port_number - service_name = rule.http.paths[0].backend.service.name - try: - api_response = api_instance.read_namespaced_service(service_name, i.metadata.namespace) - cluster_ip = api_response.spec.cluster_ip - except ApiException as e: - cluster_ip = None - # print("Exception when calling CoreV1Api->read_namespaced_service: %s\n" % e) - - if cluster_ip is not None: - if cluster_ip not in discover.keys(): - discover[cluster_ip] = data - discover[cluster_ip].update(rule_data) - - for k in discover.keys(): - print("%s=%s" % (k, json.dumps(discover[k]))) - -if __name__ == '__main__': - main() - diff --git a/assets/scripts/static.py b/assets/scripts/static.py deleted file mode 100644 index 2e36cc6..0000000 --- a/assets/scripts/static.py +++ /dev/null @@ -1,22 +0,0 @@ -import yaml -import sys -import os - -from easymapping import HaproxyConfigGenerator - -if len(sys.argv) != 2: - print("You need to pass the easyconfig.yml path") - exit(1) - - -with open(sys.argv[1], 'r') as content_file: - parsed = yaml.load(content_file.read(), Loader=yaml.FullLoader) - -cfg = HaproxyConfigGenerator(parsed) -print(cfg.generate()) - -path = os.path.dirname(os.path.realpath(__file__)) -with open(path + "/letsencrypt_hosts.txt", 'w') as fp: - fp.write('\n'.join(cfg.letsencrypt_hosts)) - -exit(0) diff --git a/assets/scripts/swarm.py b/assets/scripts/swarm.py deleted file mode 100644 index 52c1a73..0000000 --- a/assets/scripts/swarm.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -from easymapping import HaproxyConfigGenerator - -with open("/tmp/.docker_data", 'r') as content_file: - line_list = content_file.readlines() - -result = { - "customerrors": True if os.getenv("HAPROXY_CUSTOMERRORS") == "true" else False, - "ssl_mode": os.getenv("EASYHAPROXY_SSL_MODE", "default") -} - -if os.getenv("HAPROXY_PASSWORD"): - result["stats"] = { - "username": os.getenv("HAPROXY_USERNAME") if os.getenv("HAPROXY_USERNAME") else "admin", - "password": os.getenv("HAPROXY_PASSWORD"), - "port": os.getenv("HAPROXY_STATS_PORT") if os.getenv("HAPROXY_STATS_PORT") else "1936", - } - -result["lookup_label"] = os.getenv("EASYHAPROXY_LABEL_PREFIX") if os.getenv("EASYHAPROXY_LABEL_PREFIX") else "easyhaproxy" -if (os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL")): - result["letsencrypt"] = { - "email": os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL") - } - - -cfg = HaproxyConfigGenerator(result) -print(cfg.generate(line_list)) - -path = os.path.dirname(os.path.realpath(__file__)) -with open(path + "/letsencrypt_hosts.txt", 'w') as fp: - fp.write('\n'.join(cfg.letsencrypt_hosts)) -# print(jsonStr) - - From 96f344118b9950f886fa4f651d90cb6718da0ee0 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 00:47:22 +0000 Subject: [PATCH 13/45] Remove more obsolete files --- .travis.yml | 26 ------------ _config.yml | 66 ------------------------------ resource-temp.yml | 79 ------------------------------------ pytest.ini => src/pytest.ini | 0 4 files changed, 171 deletions(-) delete mode 100644 .travis.yml delete mode 100644 _config.yml delete mode 100644 resource-temp.yml rename pytest.ini => src/pytest.ini (100%) diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ed1f6e6..0000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: python - -services: - - docker - - -jobs: - include: - - stage: test - if: (type IN (pull_request)) - install: - - pip install -r requirements.txt - script: - - pytest -s tests/ - - - stage: build docker - if: (branch = master) AND (NOT (type IN (pull_request))) - install: - - docker pull byjg/k8s-ci - script: - - docker run --privileged -v /tmp/z:/var/lib/containers -it --rm -v $PWD:/work -w /work -e DOCKER_USERNAME=$DOCKER_USERNAME -e DOCKER_PASSWORD=$DOCKER_PASSWORD -e DOCKER_REGISTRY=$DOCKER_REGISTRY byjg/k8s-ci /work/build-multiarch.sh - - - stage: documentation - if: (branch = master) AND (NOT (type IN (pull_request))) - install: skip - script: "curl https://opensource.byjg.com/add-doc.sh | bash /dev/stdin devops docker-easy-haproxy" diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 3935400..0000000 --- a/_config.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: docker-easy-haproxy - -project: - version: 1.0.0 - download_url: https://github.com/byjg/docker-easy-haproxy/releases - -license: - software: MIT - software_url: https://opensource.org/licenses/MIT - - docs: MIT - docs_url: https://opensource.org/licenses/MIT - -git_edit_address: https://github.com/byjg/docker-easy-haproxy/blob/master/ - -links: - header: - - title: GitHub - url: https://github.com/byjg/docker-easy-haproxy - - title: ByJG - url: https://opensource.byjg.com/ - footer: - - title: GitHub - url: https://github.com/byjg/docker-easy-haproxy - - title: Issues - url: https://github.com/byjg/docker-easy-haproxy/issues - -ui: - header: - color1: "#080331" - color2: "#0033cc" - trianglify: true - -social: - github: - user: byjg - repo: docker-easy-haproxy - twitter: - enabled: false - via: - hash: opensourcebyjg - account: - facebook: - enabled: true - url: https://opensource.byjg.com/ - profileUrl: - -author: - twitter: byjg - -twitter: - card: summary - username: byjg - -logo: https://opensource.byjg.com/images/logo_byjg.png - -analytics: - google: UA-130014324-1 - -plugins: - - jekyll-seo-tag - -# Build settings -markdown: kramdown -remote_theme: byjg/jekyll-docs-theme - diff --git a/resource-temp.yml b/resource-temp.yml deleted file mode 100644 index 2954285..0000000 --- a/resource-temp.yml +++ /dev/null @@ -1,79 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: parking - ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: parking-valida-me - namespace: parking - annotations: - kubernetes.io/ingress.class: easyhaproxy -spec: - rules: - - host: valida.me - http: - paths: - - backend: - serviceName: parking-valida-me - servicePort: 80 - - host: www.valida.me - http: - paths: - - backend: - serviceName: parking-valida-me - servicePort: 80 ---- -apiVersion: v1 -kind: Service -metadata: - name: parking-valida-me - namespace: parking -spec: - type: ClusterIP - ports: - - port: 80 - targetPort: 8080 - name: http - selector: - app: parking-valida-me ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: parking-valida-me - namespace: parking -spec: - replicas: 1 - revisionHistoryLimit: 10 - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - selector: - matchLabels: - app: parking-valida-me - template: - metadata: - labels: - app: parking-valida-me - spec: - containers: - - name: parking-valida-me - image: byjg/static-httpserver - ports: - - containerPort: 8080 - resources: - limits: - cpu: '0.05' - memory: '20Mi' - requests: - cpu: '0.05' - memory: '20Mi' - env: - - name: TITLE - value: "valida.me" diff --git a/pytest.ini b/src/pytest.ini similarity index 100% rename from pytest.ini rename to src/pytest.ini From 3259a1b66a92405e17d55185b3e031dcccb21396 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 01:52:13 +0000 Subject: [PATCH 14/45] Add python certbot --- src/functions/__init__.py | 118 ++++++++++++++++++++++++-------------- src/main.py | 6 +- 2 files changed, 80 insertions(+), 44 deletions(-) diff --git a/src/functions/__init__.py b/src/functions/__init__.py index 154a035..c33c161 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -2,6 +2,8 @@ from datetime import datetime from multiprocessing import Process, Lock import subprocess import shlex +import time +import os class Functions: @staticmethod @@ -58,46 +60,6 @@ class Functions: Functions.log(source, 'error', "%s" % (e)) - - @staticmethod - def log_ts(source, level, message, lock): - if message is None or message == "": - return - - if not isinstance(message, (list, tuple)): - message = [message] - - lock.acquire() - try: - for line in message: - print("[%s] %s [%s]: %s" % (source, datetime.now().strftime("%x %X"), level, line.rstrip())) - finally: - lock.release() - - @staticmethod - def run_bash_ts(source, command, lock): - if not isinstance(command, (list, tuple)): - command = shlex.split(command) - - try: - process = subprocess.Popen(command, - shell=False, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - bufsize=-1, - universal_newlines=True) - - with process.stdout: - for line in iter(process.stdout.readline, b''): - Functions.log(source, "info", line) - - returncode = process.wait() - Functions.log(source, "info", "Return code %s" % (returncode)) - - except Exception as e: - Functions.log_ts(source, 'error', "%s" % (e), lock) - - class DaemonizeHAProxy: def __init__(self): self.process = None @@ -130,7 +92,7 @@ class DaemonizeHAProxy: universal_newlines=True) except Exception as e: - Functions.log_ts(source, 'error', "%s" % (e), lock) + Functions.log(source, 'error', "%s" % (e)) def __start(self): @@ -144,7 +106,7 @@ class DaemonizeHAProxy: Functions.log(source, "info", "Return code %s" % (returncode)) except Exception as e: - Functions.log_ts(source, 'error', "%s" % (e), lock) + Functions.log(source, 'error', "%s" % (e)) def is_alive(self): return self.thread.is_alive() @@ -157,4 +119,74 @@ class DaemonizeHAProxy: self.process.terminate() self.thread.terminate() - \ No newline at end of file + +class Certbot: + def __init__(self, certs, email): + self.certs = certs + self.email = email + + def check_certificates(self, hosts): + if self.email == "" or len(hosts) == 0: + return False + + try: + request_certs = [] + renew_certs = [] + current_time = time.time() + for host in hosts: + filename = "%s/%s.pem" % (self.certs, host) + host_arg = '-d %s' % (host) + if not os.path.exists(filename): + Functions.log("CERTBOT", "info", "Request new certificate for %s" % (host)) + request_certs.append(host_arg) + else: + creation_time = os.path.getctime(filename) + if (current_time - creation_time) // (24 * 3600) > 90: + Functions.log("CERTBOT", "info", "Request expired certificate for %s" % (host)) + request_certs.append(host_arg) + if (current_time - creation_time) // (24 * 3600) >= 45: + Functions.log("CERTBOT", "info", "Renew certificate for %s" % (host)) + renew_certs.append(host_arg) + + certbot_certonly = ('/usr/bin/certbot certonly ' + ' --standalone' + ' --preferred-challenges http' + ' --http-01-port 2080' + ' --agree-tos' + ' --issuance-timeout 90' + ' --no-eff-email' + ' --non-interactive' + ' --max-log-backups=0' + ' --post-hook "/scripts/certbot_to_haproxy.sh"' + ' %s --email %s' % (' '.join(request_certs), self.email) + ) + + ret_reload = False + if len(request_certs) > 0: + Functions.run_bash("CERTBOT", certbot_certonly, return_result=False) + ret_reload = true + + if len(renew_certs) > 0: + Functions.run_bash("CERTBOT", "/usb/bin/certbot renew", return_result=False) + ret_reload = true + + if ret_reload: + self.find_live_certificates() + + return ret_reload + except Excepton as e: + Functions.log("CERTBOT", "error", "%s" % (e)) + return False + + def merge_certificate(self, cert, key, filename): + Functions.save(filename, cert + key) + + def find_live_certificates(self): + letsencrypt_certs = "/etc/letsencrypt/live/" + for item in os.listdir(letsencrypt_certs): + path = os.path.join(letsencrypt_certs, item) + if os.path.isdir(path): + cert = Functions.load(os.path.join(path, "fullchain.pem")) + key = Functions.load(os.path.join(path, "privkey.pem")) + filename = "%s/%s.pem" % (self.certs, item) + self.merge_certificate(cert, key, filename) diff --git a/src/main.py b/src/main.py index c2749f9..17e1130 100644 --- a/src/main.py +++ b/src/main.py @@ -1,4 +1,4 @@ -from functions import Functions, DaemonizeHAProxy +from functions import Functions, DaemonizeHAProxy, Certbot from processor import ProcessorInterface import os import time @@ -25,6 +25,8 @@ def start(): haproxy = DaemonizeHAProxy() haproxy.haproxy("start") + certbot = Certbot(certs_letsencrypt, os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL")) + while True: time.sleep(10) if old_haproxy is not None: @@ -42,6 +44,8 @@ def start(): haproxy = DaemonizeHAProxy() haproxy.haproxy("reload") old_haproxy.terminate() + + certbot.check_certificates(processor_obj.get_letsencrypt_hosts()) except Exception as e: Functions.log('EASYHAPROXY', 'error', "Err: %s" % (e)) Functions.log('EASYHAPROXY', 'info', 'Heartbeat') From 28342cdc211744b582f7c1e3a95edb6445ccb031 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 02:03:47 +0000 Subject: [PATCH 15/45] Lets encrypt --- src/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.py b/src/main.py index 17e1130..69bd1c3 100644 --- a/src/main.py +++ b/src/main.py @@ -19,6 +19,7 @@ def start(): processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) + letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = None @@ -39,13 +40,14 @@ def start(): Functions.log('EASYHAPROXY', 'info', 'New configuration found. Reloading...') processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) + letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = haproxy haproxy = DaemonizeHAProxy() haproxy.haproxy("reload") old_haproxy.terminate() - certbot.check_certificates(processor_obj.get_letsencrypt_hosts()) + certbot.check_certificates(letsencrypt_certs_found) except Exception as e: Functions.log('EASYHAPROXY', 'error', "Err: %s" % (e)) Functions.log('EASYHAPROXY', 'info', 'Heartbeat') From 2442b25440b2a13d1498fd937d0affeb0724dda2 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 02:10:14 +0000 Subject: [PATCH 16/45] Fix typo --- src/functions/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functions/__init__.py b/src/functions/__init__.py index c33c161..0464cfa 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -174,7 +174,7 @@ class Certbot: self.find_live_certificates() return ret_reload - except Excepton as e: + except Exception as e: Functions.log("CERTBOT", "error", "%s" % (e)) return False From bcb62513770c2e69e0b1335e0f98d278499c3f72 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 02:15:49 +0000 Subject: [PATCH 17/45] Fix typo --- src/functions/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/functions/__init__.py b/src/functions/__init__.py index 0464cfa..e9525e6 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -164,11 +164,11 @@ class Certbot: ret_reload = False if len(request_certs) > 0: Functions.run_bash("CERTBOT", certbot_certonly, return_result=False) - ret_reload = true + ret_reload = True if len(renew_certs) > 0: - Functions.run_bash("CERTBOT", "/usb/bin/certbot renew", return_result=False) - ret_reload = true + Functions.run_bash("CERTBOT", "/usb/bin/certbot renew --post-hook /scripts/certbot_to_haproxy.sh", return_result=False) + ret_reload = True if ret_reload: self.find_live_certificates() From 91a02166f12be226a974d1bc9f2dafad9711460b Mon Sep 17 00:00:00 2001 From: Joao Magalhaes Date: Thu, 25 Aug 2022 02:26:02 +0000 Subject: [PATCH 18/45] Removing last bash --- assets/scripts/certbot.sh | 55 ---------------------------- assets/scripts/certbot_to_haproxy.sh | 14 ------- src/functions/__init__.py | 3 +- 3 files changed, 1 insertion(+), 71 deletions(-) delete mode 100755 assets/scripts/certbot.sh delete mode 100755 assets/scripts/certbot_to_haproxy.sh diff --git a/assets/scripts/certbot.sh b/assets/scripts/certbot.sh deleted file mode 100755 index 8678231..0000000 --- a/assets/scripts/certbot.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash - -source /scripts/functions.sh - -if [ ! -f /scripts/letsencrypt_hosts.txt ]; then - exit 0 -fi - -# Semaphore -if [ -f /tmp/certbot-lock ]; then - log "notice" "CERTBOT_JOB" "Another process is running" - exit 0 -fi - -touch /tmp/certbot-lock - -mkdir -p /var/log/letsencrypt -ln -sf /dev/stdout /var/log/letsencrypt/letsencrypt.log - -REQUEST_CERTS="" -RENEW_CERTS="" - -for domain in $(cat /scripts/letsencrypt_hosts.txt); do - if [ ! -f "/certs/letsencrypt/$domain.pem" ]; then - REQUEST_CERTS="$REQUES_CERTS -d $domain" - continue - fi - - if [[ $(find "/certs/letsencrypt/$domain.pem" -mtime +30 -print) ]]; then - RENEW_CERTS="$RENEW_CERTS -d $domain" - fi -done - -if [ -n "$REQUEST_CERTS" ]; then - log "info" "CERTBOT_JOB" "Requesting certificates for $REQUEST_CERTS" - certbot certonly \ - --standalone \ - --preferred-challenges http \ - --http-01-port 2080 \ - --agree-tos \ - --issuance-timeout 90 \ - --no-eff-email \ - --non-interactive \ - --max-log-backups=0 \ - --post-hook "/scripts/certbot_to_haproxy.sh" \ - $REQUEST_CERTS --email $EASYHAPROXY_LETSENCRYPT_EMAIL -fi - -if [ -n "$RENEW_CERTS" ]; then - log "info" "CERTBOT_JOB" "Resquesting renew certificated fort $RENEW_CERTS" - certbot renew --post-hook "/scripts/certbot_to_haproxy.sh" -fi - -# Release semaphore -rm /tmp/certbot-lock diff --git a/assets/scripts/certbot_to_haproxy.sh b/assets/scripts/certbot_to_haproxy.sh deleted file mode 100755 index 532a265..0000000 --- a/assets/scripts/certbot_to_haproxy.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -source /scripts/functions.sh - -# Loop through all Let's Encrypt certificates -for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do - CERTIFICATE=`basename $CERTIFICATE` - - # Combine certificate and private key to single file - cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /certs/letsencrypt/$CERTIFICATE.pem -done - -# It will be checked on haproxy-reload.sh -touch /tmp/force-reload \ No newline at end of file diff --git a/src/functions/__init__.py b/src/functions/__init__.py index e9525e6..5d62154 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -157,7 +157,6 @@ class Certbot: ' --no-eff-email' ' --non-interactive' ' --max-log-backups=0' - ' --post-hook "/scripts/certbot_to_haproxy.sh"' ' %s --email %s' % (' '.join(request_certs), self.email) ) @@ -167,7 +166,7 @@ class Certbot: ret_reload = True if len(renew_certs) > 0: - Functions.run_bash("CERTBOT", "/usb/bin/certbot renew --post-hook /scripts/certbot_to_haproxy.sh", return_result=False) + Functions.run_bash("CERTBOT", "/usb/bin/certbot renew", return_result=False) ret_reload = True if ret_reload: From 16b69febc259e1a8e3111a4d06e1b9c8f7aa1dea Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 02:32:54 +0000 Subject: [PATCH 19/45] Minor typo --- .vscode/launch.json | 2 +- src/banner.txt | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 src/banner.txt diff --git a/.vscode/launch.json b/.vscode/launch.json index 01d56c1..9cb10c6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,7 @@ "console": "integratedTerminal", "cwd": "${workspaceFolder}/src", "env": { - "=": "${cwd}/src" + "PYTHONPATH": "${cwd}/src" } } ] diff --git a/src/banner.txt b/src/banner.txt deleted file mode 100644 index 8f09599..0000000 --- a/src/banner.txt +++ /dev/null @@ -1,5 +0,0 @@ -" _ " -" ___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _ " -"/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || |" -"\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |" -" |__/ |_| |__/ " From 2fe6ce4bea6c11fa6434d8782aaea08f34928775 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 13:52:14 +0000 Subject: [PATCH 20/45] Github flow --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a33b545..2888fad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,8 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - run: | + - name: Run tests + run: | cd src/ pip install -r requirements.txt pytest -s tests/ -vv From af896c1d8b6fa514f0befada51d465ef5f08d546 Mon Sep 17 00:00:00 2001 From: Joao M Date: Thu, 25 Aug 2022 09:40:36 -0500 Subject: [PATCH 21/45] Update README.md --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0f457b4..bf7b2df 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,23 @@ [![GitHub license](https://img.shields.io/github/license/byjg/docker-easy-haproxy.svg)](https://opensource.byjg.com/opensource/licensing.html) [![GitHub release](https://img.shields.io/github/release/byjg/docker-easy-haproxy.svg)](https://github.com/byjg/docker-easy-haproxy/releases/) -Service discovery for HAProxy. +## Service discovery for HAProxy This Docker image will dynamically create the `haproxy.cfg` based on the labels defined in docker containers or from a simple Yaml. +EasyHAProxy can detect and configure automatically HAProxy on the folowing platforms: +- Docker +- Docker Swarm +- Kubernetes + ## Features EasyHAProxy will discover the services based on the Docker Tags of the running containers in a Docker host or Docker Swarm cluster and dynamically set up the `haproxy.cfg`. Below, EasyHAProxy main features:: - Use Letsencrypt with HAProxy. +- Set your custom SSL certificates - Balance traffic between multiple replicas - Set SSL with three different levels of validations and according to the most recent definitions. -- Include your SSL certificate. - Setup HAProxy to listen to TCP. - Add redirects. - Enable/disable Stats on port 1936 with a custom password. @@ -78,7 +83,7 @@ The discovery will occur every minute. e.g.: ```bash -docker create networkd easyhaproxy +docker create network easyhaproxy docker run --network easyhaproxy byjg/easyhaproxy From 7d441d6386dbf9c449f7c9c8f05409d97d5c063b Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Thu, 25 Aug 2022 12:30:17 -0500 Subject: [PATCH 22/45] adjusting level of debug --- .github/dependabot.yml | 2 +- build-multiarch.sh | 9 ++++----- src/functions/__init__.py | 8 ++++---- src/main.py | 14 +++++++------- src/processor/__init__.py | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fff4485..6eda8b7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,6 +6,6 @@ updates: schedule: interval: "daily" - package-ecosystem: "pip" - directory: "/" + directory: "/src" schedule: interval: "daily" diff --git a/build-multiarch.sh b/build-multiarch.sh index 6a5ae0e..a2fe1bb 100755 --- a/build-multiarch.sh +++ b/build-multiarch.sh @@ -5,9 +5,9 @@ set -e # Start k8s-ci before run this command # docker run --privileged -v /tmp/z:/var/lib/containers -it --rm -v $PWD:/work -w /work byjg/k8s-ci -if [ -z "$DOCKER_USERNAME" ] || [ -z "$DOCKER_PASSWORD" ] || [ -z "$DOCKER_REGISTRY" ] +if [ -z "$DOCKER_USERNAME" ] || [ -z "$DOCKER_PASSWORD" ] || [ -z "$DOCKER_REGISTRY" ] || [ -z "$VERSIONS" ] then - echo You need to setup \$DOCKER_USERNAME, \$DOCKER_PASSWORD and \$DOCKER_REGISTRY before run this command. + echo You need to setup \$DOCKER_USERNAME, \$DOCKER_PASSWORD, \$DOCKER_REGISTRY and \$VERSIONS before run this command. exit 1 fi @@ -15,15 +15,14 @@ buildah login --username $DOCKER_USERNAME --password $DOCKER_PASSWORD $DOCKER_RE podman run --rm --events-backend=file --cgroup-manager=cgroupfs --privileged docker://multiarch/qemu-user-static --reset -p yes -VERSIONS="latest $TRAVIS_TAG" for VERSION in $VERSIONS do DOCKERFILE=Dockerfile buildah manifest create byjg/easy-haproxy:$VERSION - buildah bud --arch arm64 --os linux --iidfile /tmp/iid-arm64 -f $DOCKERFILE -t byjg/easy-haproxy:$VERSION-arm64 . - buildah bud --arch amd64 --os linux --iidfile /tmp/iid-amd64 -f $DOCKERFILE -t byjg/easy-haproxy:$VERSION-amd64 . + buildah bud --arch arm64 --os linux --iidfile /tmp/iid-arm64 -f $DOCKERFILE --build-arg=RELEASE_VERSION_ARG="$VERSION-manual" -t byjg/easy-haproxy:$VERSION-arm64 . + buildah bud --arch amd64 --os linux --iidfile /tmp/iid-amd64 -f $DOCKERFILE --build-arg=RELEASE_VERSION_ARG="$VERSION-manual" -t byjg/easy-haproxy:$VERSION-amd64 . buildah manifest add byjg/easy-haproxy:$VERSION --arch arm64 --os linux --variant v8 $(cat /tmp/iid-arm64) buildah manifest add byjg/easy-haproxy:$VERSION --arch amd64 --os linux --os=linux $(cat /tmp/iid-amd64) diff --git a/src/functions/__init__.py b/src/functions/__init__.py index 5d62154..1e97181 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -103,7 +103,7 @@ class DaemonizeHAProxy: Functions.log(source, "info", line) returncode = self.process.wait() - Functions.log(source, "info", "Return code %s" % (returncode)) + Functions.log(source, "debug", "Return code %s" % (returncode)) except Exception as e: Functions.log(source, 'error', "%s" % (e)) @@ -137,15 +137,15 @@ class Certbot: filename = "%s/%s.pem" % (self.certs, host) host_arg = '-d %s' % (host) if not os.path.exists(filename): - Functions.log("CERTBOT", "info", "Request new certificate for %s" % (host)) + Functions.log("CERTBOT", "debug", "Request new certificate for %s" % (host)) request_certs.append(host_arg) else: creation_time = os.path.getctime(filename) if (current_time - creation_time) // (24 * 3600) > 90: - Functions.log("CERTBOT", "info", "Request expired certificate for %s" % (host)) + Functions.log("CERTBOT", "debug", "Request expired certificate for %s" % (host)) request_certs.append(host_arg) if (current_time - creation_time) // (24 * 3600) >= 45: - Functions.log("CERTBOT", "info", "Renew certificate for %s" % (host)) + Functions.log("CERTBOT", "debug", "Renew certificate for %s" % (host)) renew_certs.append(host_arg) certbot_certonly = ('/usr/bin/certbot certonly ' diff --git a/src/main.py b/src/main.py index 69bd1c3..1e3c887 100644 --- a/src/main.py +++ b/src/main.py @@ -20,7 +20,7 @@ def start(): processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() - Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config + Functions.log('EASYHAPROXY', 'debug', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = None haproxy = DaemonizeHAProxy() @@ -37,11 +37,11 @@ def start(): old_parsed = processor_obj.get_parsed_object() processor_obj.refresh() if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not haproxy.is_alive(): - Functions.log('EASYHAPROXY', 'info', 'New configuration found. Reloading...') + Functions.log('EASYHAPROXY', 'debug', 'New configuration found. Reloading...') processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() - Functions.log('EASYHAPROXY', 'info', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config + Functions.log('EASYHAPROXY', 'debug', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = haproxy haproxy = DaemonizeHAProxy() haproxy.haproxy("reload") @@ -49,8 +49,8 @@ def start(): certbot.check_certificates(letsencrypt_certs_found) except Exception as e: - Functions.log('EASYHAPROXY', 'error', "Err: %s" % (e)) - Functions.log('EASYHAPROXY', 'info', 'Heartbeat') + Functions.log('EASYHAPROXY', 'fatal', "Err: %s" % (e)) + Functions.log('EASYHAPROXY', 'debug', 'Heartbeat') @@ -65,10 +65,10 @@ def main(): Functions.log('INIT', 'info', " |__/ |_| |__/ ") Functions.log('INIT', 'info', "Release: %s" % (os.getenv("RELEASE_VERSION"))) - Functions.log('INIT', 'info', 'Environment:') + Functions.log('INIT', 'debug', 'Environment:') for name, value in os.environ.items(): if "HAPROXY" in name: - Functions.log('INIT', 'info', "- {0}: {1}".format(name, value)) + Functions.log('INIT', 'debug', "- {0}: {1}".format(name, value)) start() diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 726b14b..84eed3f 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -48,7 +48,7 @@ class ProcessorInterface: elif mode == "kubernetes": return Kubernetes() else: - Functions.log("FACTORY", "error", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got '%s'" % (mode)) + Functions.log("FACTORY", "fatal", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got '%s'" % (mode)) return None def refresh(self): From 733e73ae5894f560886ddf17c9fb4395f438c375 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Thu, 25 Aug 2022 17:32:11 -0500 Subject: [PATCH 23/45] Add log level and test for functions --- README.md | 12 +++-- src/functions/__init__.py | 73 +++++++++++++++++++------- src/main.py | 28 +++++----- src/processor/__init__.py | 2 +- src/tests/test_functions.py | 101 ++++++++++++++++++++++++++++++++++++ 5 files changed, 179 insertions(+), 37 deletions(-) create mode 100644 src/tests/test_functions.py diff --git a/README.md b/README.md index bf7b2df..b1af1c4 100644 --- a/README.md +++ b/README.md @@ -52,16 +52,22 @@ The environment variables will setup the HAProxy. | Environment Variable | Description | |-------------------------------|---------------------------------------------------------------------------------------------------------------| -| EASYHAPROXY_DISCOVER | How `haproxy.cfg` will be created: `static`, `docker`, `swarm` or `kubernetes` | +| EASYHAPROXY_DISCOVER | How `haproxy.cfg` will be created: `static`, `docker`, `swarm` or `kubernetes` | | EASYHAPROXY_LABEL_PREFIX | (Optional) The key will search for matching resources. Default: `easyhaproxy`. | -| EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | +| EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | | EASYHAPROXY_SSL_MODE | (Optional) `STRICT` supports only the most recent TLS version; `DEFAULT` good SSL integration with recent browsers; `LOOSE` supports all old SSL protocols for old browsers (not recommended). | -| EASYHAPROXY_REFRESH_CONF | (Optional) Check configuration every N seconds. Default: 10 | +| EASYHAPROXY_REFRESH_CONF | (Optional) Check configuration every N seconds. Default: 10 | +| EASYHAPROXY_LOG_LEVEL | (Optional) The log level for EasyHAproxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL Default: TRACE | +| CERTBOT_LOG_LEVEL | (Optional) The log level for Certbot messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL Default: TRACE | +| HAPROXY_LOG_LEVEL | (Optional) The log level for HAProxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL Default: TRACE | | HAPROXY_USERNAME | (Optional) The HAProxy username to the statistics. Default: `admin` | | HAPROXY_PASSWORD | (Optional) The HAProxy password to the statistics. If not set, statistics will be available with no password | | HAPROXY_STATS_PORT | (Optional) The HAProxy port to the statistics. Default: `1936`. If set to `false`, disable statistics | | HAPROXY_CUSTOMERRORS | (Optional) If HAProxy will use custom HTML errors. true/false. Default: `false` | + + + The environment variable `EASYHAPROXY_DISCOVER` will define where is located your containers (see below for more details): - docker diff --git a/src/functions/__init__.py b/src/functions/__init__.py index 1e97181..450758c 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -6,6 +6,35 @@ import time import os class Functions: + HAPROXY_LOG="HAPROXY" + EASYHAPROXY_LOG="EASYHAPROXY" + CERTBOT_LOG="CERTBOT" + INIT_LOG="INIT" + + TRACE = "TRACE" + DEBUG = "DEBUG" + INFO = "INFO" + WARN = "WARN" + ERROR = "ERROR" + FATAL = "FATAL" + + debug_log = None + + @staticmethod + def skip_log(source, log_level_str): + level = os.getenv("%s_LOG_LEVEL" % (source.upper()), "").upper() + level_importance = { + Functions.TRACE: 0, + Functions.DEBUG: 1, + Functions.INFO: 2, + Functions.WARN: 3, + Functions.ERROR: 4, + Functions.FATAL: 5 + } + level_required = 0 if level not in level_importance else level_importance[level] + level_asked = 0 if log_level_str.upper() not in level_importance else level_importance[log_level_str.upper()] + return level_asked < level_required + @staticmethod def load(filename): with open(filename, 'r') as content_file: @@ -21,11 +50,17 @@ class Functions: if message is None or message == "": return + if Functions.skip_log(source, level): + return + if not isinstance(message, (list, tuple)): message = [message] for line in message: - print("[%s] %s [%s]: %s" % (source, datetime.now().strftime("%x %X"), level, line.rstrip())) + log = "[%s] %s [%s]: %s" % (source, datetime.now().strftime("%x %X"), level, line.rstrip()) + print(log) + if Functions.debug_log is not None: + Functions.debug_log.append(log) @staticmethod def run_bash(source, command, log_output=True, return_result=True): @@ -43,21 +78,21 @@ class Functions: while True: line = process.stdout.readline().rstrip() output.append(line) if return_result else None - Functions.log(source, "info", line) if log_output else None - Functions.log(source, "warning", process.stderr.readline()) + Functions.log(source, Functions.INFO, line) if log_output else None + Functions.log(source, Functions.WARN, process.stderr.readline()) return_code = process.poll() if return_code is not None: lines = [] for line in process.stdout.readlines(): output.append(line.rstrip()) if return_result else None lines.append(line.rstrip()) - Functions.log(source, "info", lines) if log_output else None - Functions.log(source, "warning", process.stderr.readlines()) + Functions.log(source, Functions.INFO, lines) if log_output else None + Functions.log(source, Functions.WARN, process.stderr.readlines()) break return output except Exception as e: - Functions.log(source, 'error', "%s" % (e)) + Functions.log(source, Functions.ERROR, "%s" % (e)) class DaemonizeHAProxy: @@ -69,7 +104,7 @@ class DaemonizeHAProxy: if action == "start": self.__prepare("/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /var/run/haproxy.sock") else: - pid = "".join(Functions().run_bash("HAPROXY", "cat /run/haproxy.pid", log_output=False)) + pid = "".join(Functions().run_bash(Functions.HAPROXY_LOG, "cat /run/haproxy.pid", log_output=False)) self.__prepare("/usr/sbin/haproxy -W -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -x /var/run/haproxy.sock -sf %s" % (pid)) if self.process is None: @@ -79,7 +114,7 @@ class DaemonizeHAProxy: self.thread.start() def __prepare(self, command): - source = "HAPROXY" + source = Functions.HAPROXY_LOG if not isinstance(command, (list, tuple)): command = shlex.split(command) @@ -92,21 +127,21 @@ class DaemonizeHAProxy: universal_newlines=True) except Exception as e: - Functions.log(source, 'error', "%s" % (e)) + Functions.log(source, Functions.ERROR, "%s" % (e)) def __start(self): - source = "HAPROXY" + source = Functions.HAPROXY_LOG try: with self.process.stdout: for line in iter(self.process.stdout.readline, b''): - Functions.log(source, "info", line) + Functions.log(source, Functions.INFO, line) returncode = self.process.wait() - Functions.log(source, "debug", "Return code %s" % (returncode)) + Functions.log(source, Functions.DEBUG, "Return code %s" % (returncode)) except Exception as e: - Functions.log(source, 'error', "%s" % (e)) + Functions.log(source, Functions.ERROR, "%s" % (e)) def is_alive(self): return self.thread.is_alive() @@ -137,15 +172,15 @@ class Certbot: filename = "%s/%s.pem" % (self.certs, host) host_arg = '-d %s' % (host) if not os.path.exists(filename): - Functions.log("CERTBOT", "debug", "Request new certificate for %s" % (host)) + Functions.log(Functions.CERTBOT_LOG, Functions.DEBUG, "Request new certificate for %s" % (host)) request_certs.append(host_arg) else: creation_time = os.path.getctime(filename) if (current_time - creation_time) // (24 * 3600) > 90: - Functions.log("CERTBOT", "debug", "Request expired certificate for %s" % (host)) + Functions.log(Functions.CERTBOT_LOG, Functions.DEBUG, "Request expired certificate for %s" % (host)) request_certs.append(host_arg) if (current_time - creation_time) // (24 * 3600) >= 45: - Functions.log("CERTBOT", "debug", "Renew certificate for %s" % (host)) + Functions.log(Functions.CERTBOT_LOG, Functions.DEBUG, "Renew certificate for %s" % (host)) renew_certs.append(host_arg) certbot_certonly = ('/usr/bin/certbot certonly ' @@ -162,11 +197,11 @@ class Certbot: ret_reload = False if len(request_certs) > 0: - Functions.run_bash("CERTBOT", certbot_certonly, return_result=False) + Functions.run_bash(Functions.CERTBOT_LOG, certbot_certonly, return_result=False) ret_reload = True if len(renew_certs) > 0: - Functions.run_bash("CERTBOT", "/usb/bin/certbot renew", return_result=False) + Functions.run_bash(Functions.CERTBOT_LOG, "/usb/bin/certbot renew", return_result=False) ret_reload = True if ret_reload: @@ -174,7 +209,7 @@ class Certbot: return ret_reload except Exception as e: - Functions.log("CERTBOT", "error", "%s" % (e)) + Functions.log(Functions.CERTBOT_LOG, Functions.ERROR, "%s" % (e)) return False def merge_certificate(self, cert, key, filename): diff --git a/src/main.py b/src/main.py index 1e3c887..5d2d75f 100644 --- a/src/main.py +++ b/src/main.py @@ -20,7 +20,7 @@ def start(): processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() - Functions.log('EASYHAPROXY', 'debug', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config + Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = None haproxy = DaemonizeHAProxy() @@ -37,11 +37,11 @@ def start(): old_parsed = processor_obj.get_parsed_object() processor_obj.refresh() if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not haproxy.is_alive(): - Functions.log('EASYHAPROXY', 'debug', 'New configuration found. Reloading...') + Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'New configuration found. Reloading...') processor_obj.save_config(haproxy_config) processor_obj.save_certs(certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() - Functions.log('EASYHAPROXY', 'debug', 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config + Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = haproxy haproxy = DaemonizeHAProxy() haproxy.haproxy("reload") @@ -49,26 +49,26 @@ def start(): certbot.check_certificates(letsencrypt_certs_found) except Exception as e: - Functions.log('EASYHAPROXY', 'fatal', "Err: %s" % (e)) - Functions.log('EASYHAPROXY', 'debug', 'Heartbeat') + Functions.log(Functions.EASYHAPROXY_LOG, Functions.FATAL, "Err: %s" % (e)) + Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'Heartbeat') def main(): - Functions.run_bash('INIT', '/usr/sbin/haproxy -v') + Functions.run_bash(Functions.INIT_LOG, '/usr/sbin/haproxy -v') - Functions.log('INIT', 'info', " _ ") - Functions.log('INIT', 'info', " ___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _ ") - Functions.log('INIT', 'info', "/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || |") - Functions.log('INIT', 'info', "\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |") - Functions.log('INIT', 'info', " |__/ |_| |__/ ") + Functions.log(Functions.INIT_LOG, Functions.INFO, " _ ") + Functions.log(Functions.INIT_LOG, Functions.INFO, " ___ __ _ ____ _ ___| |_ __ _ _ __ _ _ _____ ___ _ ") + Functions.log(Functions.INIT_LOG, Functions.INFO, "/ -_) _` (_-< || |___| ' \/ _` | '_ \ '_/ _ \ \ / || |") + Functions.log(Functions.INIT_LOG, Functions.INFO, "\___\__,_/__/\_, | |_||_\__,_| .__/_| \___/_\_\\_, |") + Functions.log(Functions.INIT_LOG, Functions.INFO, " |__/ |_| |__/ ") - Functions.log('INIT', 'info', "Release: %s" % (os.getenv("RELEASE_VERSION"))) - Functions.log('INIT', 'debug', 'Environment:') + Functions.log(Functions.INIT_LOG, Functions.INFO, "Release: %s" % (os.getenv("RELEASE_VERSION"))) + Functions.log(Functions.INIT_LOG, Functions.DEBUG, 'Environment:') for name, value in os.environ.items(): if "HAPROXY" in name: - Functions.log('INIT', 'debug', "- {0}: {1}".format(name, value)) + Functions.log(Functions.INIT_LOG, Functions.DEBUG, "- {0}: {1}".format(name, value)) start() diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 84eed3f..1a5ae9e 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -48,7 +48,7 @@ class ProcessorInterface: elif mode == "kubernetes": return Kubernetes() else: - Functions.log("FACTORY", "fatal", "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got '%s'" % (mode)) + Functions.log("EASYHAPROXY", Functions.FATAL, "Expected mode to be 'static', 'docker', 'swarm' or 'kubernetes'. I got '%s'" % (mode)) return None def refresh(self): diff --git a/src/tests/test_functions.py b/src/tests/test_functions.py new file mode 100644 index 0000000..5f40267 --- /dev/null +++ b/src/tests/test_functions.py @@ -0,0 +1,101 @@ +import json +import pytest +import os +import re +import random +import string +from functions import Functions + +def test_functions_check_local_level(): + assert Functions.skip_log('CERTBOT', Functions.INFO) == False + assert Functions.skip_log('HAPOROXY', Functions.INFO) == False + assert Functions.skip_log('EASYHAPROXY', Functions.INFO) == False + + os.environ['CERTBOT_LOG_LEVEL'] = 'warn' + assert Functions.skip_log('CERTBOT', Functions.INFO) == True + os.environ['CERTBOT_LOG_LEVEL'] = '' + + os.environ['HAPROXY_LOG_LEVEL'] = 'warn' + assert Functions.skip_log('HAPROXY', Functions.INFO) == True + os.environ['HAPROXY_LOG_LEVEL'] = '' + + os.environ['EASYHAPROXY_LOG_LEVEL'] = 'warn' + assert Functions.skip_log('EASYHAPROXY', Functions.INFO) == True + os.environ['EASYHAPROXY_LOG_LEVEL'] = '' + +def test_function_load_and_save(): + filename = '/tmp/x.txt' + try: + assert os.path.exists(filename) == False + text = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(50)) + Functions.save(filename, text) + assert os.path.exists(filename) == True + assert Functions.load(filename) == text + finally: + os.unlink(filename) + +def test_functions_check_log_sanity(): + print() + Functions.log(Functions.EASYHAPROXY_LOG, Functions.INFO, "Test 1") + assert Functions.debug_log is None + + Functions.debug_log = [] + try: + Functions.log(Functions.EASYHAPROXY_LOG, Functions.INFO, "Test 2") + assert len(Functions.debug_log) == 1 + assert re.match("\[EASYHAPROXY\] .* \[INFO\]: Test 2", Functions.debug_log[0]) + + os.environ['CERTBOT_LOG_LEVEL'] = 'DEBUG' + Functions.log(Functions.EASYHAPROXY_LOG, Functions.INFO, "Test 3") + assert len(Functions.debug_log) == 2 + assert re.match("\[EASYHAPROXY\] .* \[INFO\]: Test 3", Functions.debug_log[1]) + + os.environ['EASYHAPROXY_LOG_LEVEL'] = 'warn' + Functions.log(Functions.EASYHAPROXY_LOG, Functions.INFO, "Test 4") # Should not log to debug + assert len(Functions.debug_log) == 2 + + finally: + os.environ['EASYHAPROXY_LOG_LEVEL'] = '' + Functions.debug_log = None + +def test_functions_run_bash_log_output(): + print() + Functions.debug_log = [] + try: + result = Functions.run_bash(Functions.EASYHAPROXY_LOG, "echo 'test run 1'", log_output=True, return_result=False) + assert result == [] + assert len(Functions.debug_log) == 1 + assert re.match("\[EASYHAPROXY\] .* \[INFO\]: test run 1", Functions.debug_log[0]) + finally: + Functions.debug_log = None + +def test_functions_run_bash_no_log_output(): + print() + Functions.debug_log = [] + try: + result = Functions.run_bash(Functions.EASYHAPROXY_LOG, "echo 'test run 2'", log_output=False, return_result=False) + assert result == [] + assert len(Functions.debug_log) == 0 + finally: + Functions.debug_log = None + +def test_functions_run_bash_return(): + print() + Functions.debug_log = [] + try: + result = Functions.run_bash(Functions.EASYHAPROXY_LOG, "echo 'test run 3'", log_output=False, return_result=True) + assert len(Functions.debug_log) == 0 + assert "".join(result) == 'test run 3' + finally: + Functions.debug_log = None + +def test_functions_run_bash_log_and_return_output(): + print() + Functions.debug_log = [] + try: + result = Functions.run_bash(Functions.EASYHAPROXY_LOG, "echo 'test run 4'", log_output=True, return_result=True) + assert "".join(result) == 'test run 4' + assert len(Functions.debug_log) == 1 + assert re.match("\[EASYHAPROXY\] .* \[INFO\]: test run 4", Functions.debug_log[0]) + finally: + Functions.debug_log = None \ No newline at end of file From f007f857dfa33794269bd67725721b5ce819885b Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Thu, 25 Aug 2022 19:37:02 -0500 Subject: [PATCH 24/45] Added more unit tests --- src/easymapping/__init__.py | 4 +- src/processor/__init__.py | 7 ++- src/tests/expected/docker.txt | 101 ++++++++++++++++++++++++++++++++ src/tests/test_containerenv.py | 102 +++++++++++++++++++++++++++++++++ src/tests/test_docker.py | 92 +++++++++++++++++++++++++++++ src/tests/test_static.py | 24 ++++++++ 6 files changed, 325 insertions(+), 5 deletions(-) create mode 100644 src/tests/expected/docker.txt create mode 100644 src/tests/test_containerenv.py create mode 100644 src/tests/test_docker.py create mode 100644 src/tests/test_static.py diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index 042ca61..94a893f 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -56,10 +56,10 @@ class HaproxyConfigGenerator: self.serving_hosts = [] self.certs = {} - def generate(self, container_metadata = None): + def generate(self, container_metadata = {}): self.mapping.setdefault("easymapping", []) - if container_metadata is not None: + if container_metadata != {}: self.mapping["easymapping"] = self.parse(container_metadata) file_loader = FileSystemLoader('templates') diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 1a5ae9e..c92bf29 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -13,7 +13,7 @@ class ContainerEnv: def read(): env_vars = { "customerrors": True if os.getenv("HAPROXY_CUSTOMERRORS") == "true" else False, - "ssl_mode": os.getenv("EASYHAPROXY_SSL_MODE", "default") + "ssl_mode": os.getenv("EASYHAPROXY_SSL_MODE") if os.getenv("EASYHAPROXY_SSL_MODE") else 'default' } if os.getenv("HAPROXY_PASSWORD"): @@ -33,6 +33,8 @@ class ContainerEnv: class ProcessorInterface: + static_file = "/etc/haproxy/easyconfig.yml" + def __init__(self, filename = None): self.filename = filename self.refresh() @@ -40,7 +42,7 @@ class ProcessorInterface: @staticmethod def factory(mode): if mode == "static": - return Static("/etc/haproxy/easyconfig.yml") + return Static(ProcessorInterface.static_file) elif mode == "docker": return Docker() elif mode == "swarm": @@ -95,7 +97,6 @@ class ProcessorInterface: Functions.save("{0}/{1}".format(path, cert), self.get_certs(cert)) - class Static(ProcessorInterface): def inspect_network(self): self.parsed_object = {} diff --git a/src/tests/expected/docker.txt b/src/tests/expected/docker.txt new file mode 100644 index 0000000..7bcdedc --- /dev/null +++ b/src/tests/expected/docker.txt @@ -0,0 +1,101 @@ +global + log stdout format raw local0 info + maxconn 2000 + tune.ssl.default-dh-param 2048 + + # intermediate configuration + ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 + ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 + ssl-default-bind-options prefer-client-ciphers no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets + + ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 + ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 + ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets + + ssl-dh-param-file /etc/haproxy/dhparam + +defaults + log global + option httplog + + timeout connect 3s + timeout client 10s + timeout server 10m + +frontend stats + bind *:1936 + mode http + stats enable + stats hide-version + stats realm Haproxy\ Statistics + stats uri / + default_backend srv_stats + +backend srv_stats + mode http + server Local 127.0.0.1:1936 + +frontend http_in_443 + bind *:443 ssl crt /certs/letsencrypt/ alpn http/1.1 crt /certs/haproxy/ alpn http/1.1 + mode http + + acl is_rule_hostssl_local_443_1 hdr(host) -i hostssl.local + acl is_rule_hostssl_local_443_2 hdr(host) -i hostssl.local:443 + use_backend srv_hostssl_local_443 if is_rule_hostssl_local_443_1 OR is_rule_hostssl_local_443_2 + + acl is_rule_host2_local_443_1 hdr(host) -i host2.local + acl is_rule_host2_local_443_2 hdr(host) -i host2.local:443 + use_backend srv_host2_local_443 if is_rule_host2_local_443_1 OR is_rule_host2_local_443_2 + +backend srv_hostssl_local_443 + balance roundrobin + mode http + option forwardfor + http-request set-header X-Forwarded-Port %[dst_port] + http-request add-header X-Forwarded-Proto https if { ssl_fc } + server srv-0 test2_processor_docker:8080 check weight 1 +backend srv_host2_local_443 + balance roundrobin + mode http + option forwardfor + http-request set-header X-Forwarded-Port %[dst_port] + http-request add-header X-Forwarded-Proto https if { ssl_fc } + server srv-0 test_processor_docker:9000 check weight 1 + +frontend http_in_80 + bind *:80 + mode http + + acl is_rule_host1_local_80_1 hdr(host) -i host1.local + acl is_rule_host1_local_80_2 hdr(host) -i host1.local:80 + use_backend srv_host1_local_80 if is_rule_host1_local_80_1 OR is_rule_host1_local_80_2 + +backend srv_host1_local_80 + balance roundrobin + mode http + option forwardfor + http-request set-header X-Forwarded-Port %[dst_port] + http-request add-header X-Forwarded-Proto https if { ssl_fc } + server srv-0 test_processor_docker:8080 check weight 1 + +frontend http_in_90 + bind *:90 + mode http + + acl is_rule_host2_local_90_1 hdr(host) -i host2.local + acl is_rule_host2_local_90_2 hdr(host) -i host2.local:90 + acl is_letsencrypt_host2_local_90 path_beg /.well-known/acme-challenge/ + use_backend letsencrypt_backend if is_letsencrypt_host2_local_90 is_rule_host2_local_90_1 OR is_letsencrypt_host2_local_90 is_rule_host2_local_90_2 + use_backend srv_host2_local_90 if is_rule_host2_local_90_1 OR is_rule_host2_local_90_2 + +backend srv_host2_local_90 + balance roundrobin + mode http + option forwardfor + http-request set-header X-Forwarded-Port %[dst_port] + http-request add-header X-Forwarded-Proto https if { ssl_fc } + server srv-0 test_processor_docker:9000 check weight 1 + +backend letsencrypt_backend + mode http + server certbot 127.0.0.1:2080 diff --git a/src/tests/test_containerenv.py b/src/tests/test_containerenv.py new file mode 100644 index 0000000..90f5225 --- /dev/null +++ b/src/tests/test_containerenv.py @@ -0,0 +1,102 @@ +import pytest +import os +from processor import ContainerEnv + +def test_container_env_empty(): + assert { + "customerrors": False, + "ssl_mode": "default", + "lookup_label": "easyhaproxy" + } == ContainerEnv.read() + + # os.environ['CERTBOT_LOG_LEVEL'] = 'warn' + +def test_container_env_customerrors(): + os.environ['HAPROXY_CUSTOMERRORS'] = 'true' + try: + assert { + "customerrors": True, + "ssl_mode": "default", + "lookup_label": "easyhaproxy" + } == ContainerEnv.read() + finally: + os.environ['HAPROXY_CUSTOMERRORS'] = '' + +def test_container_env_sslmode(): + os.environ['EASYHAPROXY_SSL_MODE'] = 'strict' + try: + assert { + "customerrors": False, + "ssl_mode": "strict", + "lookup_label": "easyhaproxy" + } == ContainerEnv.read() + finally: + os.environ['EASYHAPROXY_SSL_MODE'] = '' + +def test_container_env_stats(): + os.environ['HAPROXY_USERNAME'] = 'abc' + os.environ['HAPROXY_STATS_PORT'] = '2101' + try: + assert { + "customerrors": False, + "ssl_mode": "default", + "lookup_label": "easyhaproxy", + } == ContainerEnv.read() + finally: + os.environ['HAPROXY_USERNAME'] = '' + os.environ['HAPROXY_STATS_PORT'] = '' + +def test_container_env_stats_password(): + os.environ['HAPROXY_PASSWORD'] = 'xyz' + try: + assert { + "customerrors": False, + "ssl_mode": "default", + "lookup_label": "easyhaproxy", + "stats": { + "username": "admin", + "password": "xyz", + "port": "1936" + + } + } == ContainerEnv.read() + finally: + os.environ['HAPROXY_PASSWORD'] = '' + + +def test_container_env_stats_password(): + os.environ['HAPROXY_USERNAME'] = 'abc' + os.environ['HAPROXY_STATS_PORT'] = '2101' + os.environ['HAPROXY_PASSWORD'] = 'xyz' + try: + assert { + "customerrors": False, + "ssl_mode": "default", + "lookup_label": "easyhaproxy", + "stats": { + "username": "abc", + "password": "xyz", + "port": "2101" + + } + } == ContainerEnv.read() + finally: + os.environ['HAPROXY_USERNAME'] = '' + os.environ['HAPROXY_STATS_PORT'] = '' + os.environ['HAPROXY_PASSWORD'] = '' + + +def test_container_env_stats_password(): + os.environ['EASYHAPROXY_LETSENCRYPT_EMAIL'] = 'acme@example.org' + try: + assert { + "customerrors": False, + "ssl_mode": "default", + "lookup_label": "easyhaproxy", + "letsencrypt": { + "email": "acme@example.org", + } + } == ContainerEnv.read() + finally: + os.environ['EASYHAPROXY_LETSENCRYPT_EMAIL'] = '' + diff --git a/src/tests/test_docker.py b/src/tests/test_docker.py new file mode 100644 index 0000000..d65a08b --- /dev/null +++ b/src/tests/test_docker.py @@ -0,0 +1,92 @@ +import pytest +import os +import time +import docker +from functions import Functions +from processor import ProcessorInterface +from processor import Docker + +def _get_hydrated_object(parsed_objects, key): + assert key in parsed_objects.keys() + hydrated_object = {} + for keys in parsed_objects[key]: + if "easyhaproxy" in keys: + hydrated_object[keys] = parsed_objects[key][keys] + return hydrated_object + + +def test_processor_docker(): + try: + client = docker.from_env() + except docker.errors.DockerException: + pytest.skip("There is no docker environment") + + if len(client.containers.list()) > 0: + pytest.skip("I cannot run this test with other containers running.") + + container = client.containers.run("byjg/static-httpserver", + name="test_processor_docker", + detach=True, + auto_remove=True, + remove=True, + labels={ + "easyhaproxy.http.port": "80", + "easyhaproxy.http.localport": "8080", + "easyhaproxy.http.host": "host1.local", + + "easyhaproxy.http2.port": "90", + "easyhaproxy.http2.localport": "9000", + "easyhaproxy.http2.host": "host2.local", + "easyhaproxy.http2.letsencrypt": "true", + }) + container2 = client.containers.run("byjg/static-httpserver", + name="test2_processor_docker", + detach=True, + auto_remove=True, + remove=True, + labels={ + "easyhaproxy.ssl.port": "443", + "easyhaproxy.ssl.localport": "8080", + "easyhaproxy.ssl.host": "hostssl.local", + "easyhaproxy.ssl.sslcert": "U29tZSBQRU0gQ2VydGlmaWNhdGU=" + }) + try: + time.sleep(1) + + os.environ['EASYHAPROXY_LETSENCRYPT_EMAIL'] = 'docker@example.org' + + static = ProcessorInterface.factory("docker") + assert static.get_letsencrypt_hosts() is None + + assert { + 'easyhaproxy.http.host': 'host1.local', + 'easyhaproxy.http.localport': '8080', + 'easyhaproxy.http.port': '80', + 'easyhaproxy.http2.host': 'host2.local', + 'easyhaproxy.http2.localport': '9000', + 'easyhaproxy.http2.port': '90', + 'easyhaproxy.http2.letsencrypt': 'true', + } == _get_hydrated_object(static.get_parsed_object(), "test_processor_docker") + assert { + 'easyhaproxy.ssl.host': 'hostssl.local', + 'easyhaproxy.ssl.localport': '8080', + 'easyhaproxy.ssl.port': '443', + 'easyhaproxy.ssl.sslcert': 'U29tZSBQRU0gQ2VydGlmaWNhdGU=' + } == _get_hydrated_object(static.get_parsed_object(), "test2_processor_docker") + + assert static.get_hosts() is None + assert static.get_certs() == {} + + haproxy_cfg = static.get_haproxy_conf() + assert haproxy_cfg == Functions.load(os.path.join(os.path.dirname(os.path.realpath(__file__)), "./expected/docker.txt")) + + assert static.get_letsencrypt_hosts() == ['host2.local'] + assert static.get_hosts() == ['hostssl.local:443', 'host1.local:80', 'host2.local:90'] + assert static.get_certs() == {'hostssl.local.pem': 'Some PEM Certificate'} + finally: + os.environ['EASYHAPROXY_LETSENCRYPT_EMAIL'] = '' + container.stop() + container2.stop() + + +#test_processor_docker() \ No newline at end of file diff --git a/src/tests/test_static.py b/src/tests/test_static.py new file mode 100644 index 0000000..a68c2e4 --- /dev/null +++ b/src/tests/test_static.py @@ -0,0 +1,24 @@ +import pytest +import os +from functions import Functions +from processor import ProcessorInterface +from processor import Static + +def test_processor_static(): + ProcessorInterface.static_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "./fixtures/static.yml") + static = ProcessorInterface.factory("static") + + assert static.get_letsencrypt_hosts() is None + assert static.get_parsed_object() == {} + assert static.get_hosts() is None + + haproxy_cfg = static.get_haproxy_conf() + + assert haproxy_cfg == Functions.load(os.path.join(os.path.dirname(os.path.realpath(__file__)), "./expected/static.txt")) + + # @todo: Static doesnt populate this fields + assert static.get_letsencrypt_hosts() == [] + assert static.get_parsed_object() == {} + assert static.get_hosts() == [] + +# test_processor_static() \ No newline at end of file From 60bf71f6fb99c4238d2fa9f97c2300b1662e871a Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Thu, 25 Aug 2022 20:58:43 -0500 Subject: [PATCH 25/45] Add annotations to Kubernetes --- README.md | 9 +++++++++ src/easymapping/__init__.py | 2 +- src/processor/__init__.py | 20 ++++++++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b1af1c4..ec929d8 100644 --- a/README.md +++ b/README.md @@ -151,6 +151,15 @@ The system will read only `host` and `port.number` There is no necessary to add labels or annotations. +### Kubernetes annotations: + +| annotation | Description | Example | +|-----------------------------|-------------------------------------------------------------------------------------------------|--------------| +| kubernetes.io/ingress.class | (required) Activate EasyHAProxy. | easyhaproxy-ingress +| easyhaproxy.redirect_ssl | (optional) Boolean. Force redirect all endpoints to https. | true/false) +| easyhaproxy.letsencrypt | (optional) Boolean. It will request letsencript certificates for the ingresses domains | true/false +| easyhaproxy.redirect | (optional) Json. Specific a domain and its destination | {"domain":"redirect_url"} + ### Container (Docker or Swarm) labels: diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index 94a893f..f45e1fc 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -27,7 +27,7 @@ class DockerLabelHandler: def get_bool(self, label, default_value = False): if self.has_label(label): - return self.__data[label].lower() in ["True", "true", "1", "yes"] + return self.__data[label].lower() in ["true", "1", "yes"] return default_value def get_json(self, label, default_value = {}): diff --git a/src/processor/__init__.py b/src/processor/__init__.py index c92bf29..212a316 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -34,7 +34,7 @@ class ContainerEnv: class ProcessorInterface: static_file = "/etc/haproxy/easyconfig.yml" - + def __init__(self, filename = None): self.filename = filename self.refresh() @@ -134,7 +134,12 @@ class Kubernetes(ProcessorInterface): self.api_instance = client.CoreV1Api() self.v1 = client.NetworkingV1Api() super().__init__() - + + def _check_annotation(self, annotations, key): + if key not in annotations: + return None + return annotations[key] + def inspect_network(self): ret = self.v1.list_ingress_for_all_namespaces(watch=False) @@ -144,6 +149,10 @@ class Kubernetes(ProcessorInterface): if i.metadata.annotations['kubernetes.io/ingress.class'] != "easyhaproxy-ingress": continue + letsencrypt = self._check_annotation(i.metadata.annotations, "easyhaproxy.letsencrypt") + redirect_ssl = self._check_annotation(i.metadata.annotations, "easyhaproxy.redirect_ssl") + redirect = self._check_annotation(i.metadata.annotations, "easyhaproxy.redirect") + data = {} #ingress_name = i.metadata.name data["creation_timestamp"] = i.metadata.creation_timestamp.strftime("%x %X") @@ -156,6 +165,13 @@ class Kubernetes(ProcessorInterface): rule_data["easyhaproxy.%s_%s.host" % (definition, port_number)] = rule.host rule_data["easyhaproxy.%s_%s.port" % (definition, port_number)] = "80" rule_data["easyhaproxy.%s_%s.localport" % (definition, port_number)] = port_number + if redirect_ssl is not None: + rule_data["easyhaproxy.%s_%s.redirect_ssl" % (definition, port_number)] = 'true' + if letsencrypt is not None: + rule_data["easyhaproxy.%s_%s.letsencrypt" % (definition, port_number)] = 'true' + if redirect is not None: + rule_data["easyhaproxy.%s_%s.redirect" % (definition, port_number)] = redirect + service_name = rule.http.paths[0].backend.service.name try: api_response = self.api_instance.read_namespaced_service(service_name, i.metadata.namespace) From 912be51399ddbf4706e98eb5f17705615c9d03a2 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 00:17:23 -0500 Subject: [PATCH 26/45] Added Kubernetes TLS --- examples/kubernetes/service.yml | 6 +- examples/kubernetes/service_tls.yml | 86 +++++++++++++++++++++++++++++ src/functions/__init__.py | 6 ++ src/main.py | 21 +++---- src/processor/__init__.py | 63 ++++++++++++++------- 5 files changed, 147 insertions(+), 35 deletions(-) create mode 100644 examples/kubernetes/service_tls.yml diff --git a/examples/kubernetes/service.yml b/examples/kubernetes/service.yml index d98399f..2ac821a 100644 --- a/examples/kubernetes/service.yml +++ b/examples/kubernetes/service.yml @@ -5,7 +5,7 @@ metadata: annotations: kubernetes.io/ingress.class: easyhaproxy-ingress name: container-example - namespace: parking + namespace: default spec: rules: - host: example.org @@ -32,7 +32,7 @@ apiVersion: v1 kind: Service metadata: name: container-example - namespace: parking + namespace: default spec: ports: - name: http @@ -46,7 +46,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: container-example - namespace: parking + namespace: default spec: replicas: 1 revisionHistoryLimit: 10 diff --git a/examples/kubernetes/service_tls.yml b/examples/kubernetes/service_tls.yml new file mode 100644 index 0000000..e351fc2 --- /dev/null +++ b/examples/kubernetes/service_tls.yml @@ -0,0 +1,86 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: tls-example + namespace: default +spec: + tls: + - hosts: + - host2.local + secretName: host2-tls + rules: + - host: host2.local + http: + paths: + - backend: + service: + name: tls-example + port: + number: 8080 + pathType: ImplementationSpecific + +--- +apiVersion: v1 +kind: Secret +metadata: + name: host2-tls + namespace: default +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxVENDQXBHZ0F3SUJBZ0lVSWQ1Yjl0OXVxSDc4ZzAyRXpiV0Y2RktWdzNnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pERUxNQWtHQTFVRUJoTUNRbEl4RnpBVkJnTlZCQWdNRGxKcGJ5QmtaU0JLWVc1bGFYSnZNUmN3RlFZRApWUVFIREE1U2FXOGdaR1VnU21GdVpXbHliekVOTUFzR0ExVUVDZ3dFUVVOTlJURVVNQklHQTFVRUF3d0xhRzl6CmRESXViRzlqWVd3d0hoY05Nakl3T0RFMU1EUXlOekExV2hjTk1qTXdPREUxTURReU56QTFXakJrTVFzd0NRWUQKVlFRR0V3SkNVakVYTUJVR0ExVUVDQXdPVW1sdklHUmxJRXBoYm1WcGNtOHhGekFWQmdOVkJBY01EbEpwYnlCawpaU0JLWVc1bGFYSnZNUTB3Q3dZRFZRUUtEQVJCUTAxRk1SUXdFZ1lEVlFRRERBdG9iM04wTWk1c2IyTmhiRENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTVNLdnJPYWhhdkNYbnZTRjUxMzFocG8KNms2NUM1N2pnUlE4NEZhRGo1TWJKT1ZsWVFWRnRNRzBYT2s3YStoaDV2MWZlNHdIMFI3STZGRG8wVjlzUytzcwprbzVic0VsYzF4WWxnNUhidUtxODl2UlNLZzZFRGx6dHgzQktiaTkxMlBtdDV2RkdOSjE2emN3NzdEVXJRSVhvCjRJL2I0YTNwbUJpV2o0M05vVElybVNXSHRzR3d3T2ozaUR2U3dlcWRZWEpJcjNocEhINXU2cG9oakRvUXZxRHoKSzZNdThwNm1oQ1VLTnM3S0ZKbk5Jbk5HMjVvUVQ2TzBuNE9HdG1nUmpMV29wZEVuT2hNa0tzZklvSTFYdGxYQgpMQkR2N2h1SUNrM3Q1eXd0ZkNReU8wOWtYN2xGSWdkNXJuNytNandINVdOZXFiUUp4dWFxam9YUW5OWlVnVXNDCkF3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZOaE1CRzhxNmEraUsybkVDd1ZUbjZCOUVYWk9NQjhHQTFVZEl3UVkKTUJhQUZOaE1CRzhxNmEraUsybkVDd1ZUbjZCOUVYWk9NQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0VCQUptdWR2eDgrcDVpSVVzVDhmbS9mYlZNMERBNnFXQUxEWVVKblRuM2o2THE0dnBmClBGQytxMUxtdVdmQlFNeXFLckhyUDNlNDkzRWN0WG9pU0taTzZpTjVkVkpJdXIwMk9qR3VpQUVjc1l1WTFuTG4KczlwaWlJK1VFd3hINnV4MU5hSFVuenNXYXVvQnZSaHpqWHZPNlNBVlNaSllhOWRZNW1pelhrbER5RE51RzVVMApsWHY5ZWdNR0JzeTBkRzZlRlhrVTVDUGR4V1U1NDB5STJzQ3RTQWo3eitXUlVENWs3Z0o3dFZvWTMvL2pIUVpHCjVTVFRtbTV0OWtwSVpUV2twdHlKb3M5b1pKRllNSVhxVzJGYzZ0eUxacFJwMzFSNzh0RHM2RVRJa1RvRGMwUlIKano2NnRoNkhJK1psZ0lCUWh3MDkraFlBaEJEZTkrRG1kL1N6UVpjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t + tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktrd2dnU2xBZ0VBQW9JQkFRREVpcjZ6bW9XcndsNTcKMGhlZGQ5WWFhT3BPdVF1ZTQ0RVVQT0JXZzQrVEd5VGxaV0VGUmJUQnRGenBPMnZvWWViOVgzdU1COUVleU9oUQo2TkZmYkV2ckxKS09XN0JKWE5jV0pZT1IyN2lxdlBiMFVpb09oQTVjN2Nkd1NtNHZkZGo1cmVieFJqU2RlczNNCk8rdzFLMENGNk9DUDIrR3Q2WmdZbG8rTnphRXlLNWtsaDdiQnNNRG85NGc3MHNIcW5XRnlTSzk0YVJ4K2J1cWEKSVl3NkVMNmc4eXVqTHZLZXBvUWxDamJPeWhTWnpTSnpSdHVhRUUranRKK0RoclpvRVl5MXFLWFJKem9USkNySAp5S0NOVjdaVndTd1E3KzRiaUFwTjdlY3NMWHdrTWp0UFpGKzVSU0lIZWE1Ky9qSThCK1ZqWHFtMENjYm1xbzZGCjBKeldWSUZMQWdNQkFBRUNnZ0VCQUtjZWl0VlJPUVE1ZS9teFJSOUNmSzFzTkgvSDNOZTMvMVBrQjZYSXJGYWIKcUIzZXZFYXRaT3VvbjdBNk5LRWVUamwzN1NlK3BkU1ZaT1VYY3FDL0J6YnJhWnJlMytFaHJrcElqNzJBcFYrWQoyaXdaaVdWYWFKUWdJNHVaM21OQXc4UmFXSnNqNVMxYTlJOExET2lRNUlaNDVDbXZBQkRQSmVNU2N2SlN2UlJZCmU1TjBMNnN0cVM3WitJb3lHVktVZnAxaU5PMFl5eXdPVWlTa0lSWGdzY3VSWFpHWXBpR1BvbXNKK0pzMWVqelcKanlTdGxaSkVyNEwxMjg1ckdQcm1IcWpUd0ZkK2hHODBXYzQxNzl4TCtXUkU2SEJFVVpTaXk5NWZlNmtjUEhYWApCZ2lWWXRjRkttaUJpMmRUYnhsNGU5NHV0MjM5aTBIdGxKMVpKdExoK0JFQ2dZRUE4YTI5OEsyelhrSG9zeGhOCnRSckg3WGZNUFRrSEREZDNyeE0yMUxUK2ZJWHFpbkdVcDlMWWFEY2JqdVRQczhlMzN1S01kN1I2UTQweDg5eVcKSVhOa2EvVkwwUFhVZVY2N2FDVkxMcWdYRExHdWRsdUppbkgwWHZtSTBDbUJlY0ZTTXFJRm1RbGdxRVJvR0dzMwpVTWFjMHA4NzZUNFhrR1FRSmRmNjJiRnBFNFVDZ1lFQTBEQkgwUERsT3B3WGNjRGdYck1mYXlyOEhBaEkrRzVSCnlXUS8vOWlpcnRVODNjaHdJV3draDUzZUxMTXpMZ2RxSm5QaVd5YVVXNUJxem1ZdUQyM25oeGNRN1BOZElxT08KSDFzRTZ6cUxOc2h2NDZ0NVFLbGgxUTRxamQ3VXF0Z3JTclk2M1JYSkNNV1R3bk5NZURMdGo4Z2FLYmprckczUgpCTTJpbGR0NlVvOENnWUJYN05EVWxpMVNsb0gxWGxzdkQwNDdTOEZIYU03eWw5OTRGM0owVW1EZnBzemNqMVA0CjlwRjY0TW1xNC8zWXQwbGkwbU11VGIvSmdiM3hyWWdGSlhrY2VjS2FoRVZIM3JvcHVwK3Vtc0xBQUlpclVNUXEKVlNrRndKMFF0bmovZGVEVXdQTnVhT1g4Y2Q2NU81Q0ZWNnpJUjl4QkVERDhmQnNQMlpMT3ptZWZEUUtCZ1FERgptMjR2VnRoZC8xY0pkQ2dEKzBWeE5ZWERIZUlWWExGbzFTMGlMWUNOTG4zdGpabFJRQktVWHpaSmUzYXkwL3JmCnNOTkQ3YVNZSE1Za1R6eWRESmJjMVBvTnp4bXlEVWlUWHBPV3F5VUV4TS9mYkIxVlVQRTVoNDdBeHFkWjJvR04KRXRkZ2pwTVpMbUNJQzJTa0dzTCszTkpvazhVS0hkcHVFcm1tUUlNazVRS0JnUUNnRVdjWXRMWEMzWURZTUZkSQpVZ2NUZWJGcVNzM21MWWd1YjF4ZWtXM0lYUjJ5b200VjVmUVRMaUY3WWZuMmRwRFc0SWNNVTBVSkZZVnNVbGhLCmFHdGV0NFZtNU5uOCtNZ2hvdDV5QWpxTzl5QVVhdWI3d2dpZktJZTk5dFFLZDh1WnlDdkowaGh2bUREU2Z4NG0KQi9URWlGQU85OXlGNDlpU3hFVlNBUzZwcVE9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t +type: kubernetes.io/tls + +--- +apiVersion: v1 +kind: Service +metadata: + name: tls-example + namespace: default +spec: + ports: + - name: http + port: 8080 + selector: + app: tls-example + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: tls-example + namespace: default +spec: + replicas: 1 + revisionHistoryLimit: 10 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app: tls-example + template: + metadata: + labels: + app: tls-example + spec: + containers: + - name: tls-example + image: byjg/static-httpserver + ports: + - containerPort: 8080 + resources: + limits: + cpu: '0.05' + memory: '20Mi' + requests: + cpu: '0.05' + memory: '20Mi' + env: + - name: TITLE + value: "My Host Example" diff --git a/src/functions/__init__.py b/src/functions/__init__.py index 450758c..1be98bd 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -95,6 +95,12 @@ class Functions: Functions.log(source, Functions.ERROR, "%s" % (e)) +class Consts: + easyhaproxy_config = "/etc/haproxy/easyconfig.yml" + haproxy_config = "/etc/haproxy/haproxy.cfg" + certs_letsencrypt = "/certs/letsencrypt" + certs_haproxy = "/certs/haproxy" + class DaemonizeHAProxy: def __init__(self): self.process = None diff --git a/src/main.py b/src/main.py index 5d2d75f..ee3447d 100644 --- a/src/main.py +++ b/src/main.py @@ -1,24 +1,19 @@ -from functions import Functions, DaemonizeHAProxy, Certbot +from functions import Functions, DaemonizeHAProxy, Certbot, Consts from processor import ProcessorInterface import os import time from deepdiff import DeepDiff -easyhaproxy_config = "/etc/haproxy/easyconfig.yml" -haproxy_config = "/etc/haproxy/haproxy.cfg" -certs_letsencrypt = "/certs/letsencrypt" -certs_haproxy = "/certs/haproxy" - def start(): processor_obj = ProcessorInterface.factory(os.getenv("EASYHAPROXY_DISCOVER")) if processor_obj is None: exit(1) - os.makedirs(certs_letsencrypt, exist_ok=True) - os.makedirs(certs_haproxy, exist_ok=True) + os.makedirs(Consts.certs_letsencrypt, exist_ok=True) + os.makedirs(Consts.certs_haproxy, exist_ok=True) - processor_obj.save_config(haproxy_config) - processor_obj.save_certs(certs_haproxy) + processor_obj.save_config(Consts.haproxy_config) + processor_obj.save_certs(Consts.certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config @@ -26,7 +21,7 @@ def start(): haproxy = DaemonizeHAProxy() haproxy.haproxy("start") - certbot = Certbot(certs_letsencrypt, os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL")) + certbot = Certbot(Consts.certs_letsencrypt, os.getenv("EASYHAPROXY_LETSENCRYPT_EMAIL")) while True: time.sleep(10) @@ -38,8 +33,8 @@ def start(): processor_obj.refresh() if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not haproxy.is_alive(): Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'New configuration found. Reloading...') - processor_obj.save_config(haproxy_config) - processor_obj.save_certs(certs_haproxy) + processor_obj.save_config(Consts.haproxy_config) + processor_obj.save_certs(Consts.certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config old_haproxy = haproxy diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 212a316..74aff20 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -1,9 +1,10 @@ from easymapping import HaproxyConfigGenerator -from functions import Functions +from functions import Functions, Consts import yaml import sys import os import json +import base64 import docker from kubernetes import client, config from kubernetes.client.rest import ApiException @@ -131,8 +132,10 @@ class Swarm(ProcessorInterface): class Kubernetes(ProcessorInterface): def __init__(self, filename = None): config.load_incluster_config() + #config.verify_ssl=False self.api_instance = client.CoreV1Api() self.v1 = client.NetworkingV1Api() + self.cert_cache = {} super().__init__() def _check_annotation(self, annotations, key): @@ -145,36 +148,58 @@ class Kubernetes(ProcessorInterface): ret = self.v1.list_ingress_for_all_namespaces(watch=False) self.parsed_object = {} - for i in ret.items: - if i.metadata.annotations['kubernetes.io/ingress.class'] != "easyhaproxy-ingress": + for ingress in ret.items: + if ingress.metadata.annotations['kubernetes.io/ingress.class'] != "easyhaproxy-ingress": continue - letsencrypt = self._check_annotation(i.metadata.annotations, "easyhaproxy.letsencrypt") - redirect_ssl = self._check_annotation(i.metadata.annotations, "easyhaproxy.redirect_ssl") - redirect = self._check_annotation(i.metadata.annotations, "easyhaproxy.redirect") + ssl_hosts = [] + + letsencrypt = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.letsencrypt") + redirect_ssl = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.redirect_ssl") + redirect = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.redirect") data = {} - #ingress_name = i.metadata.name - data["creation_timestamp"] = i.metadata.creation_timestamp.strftime("%x %X") - data["resource_version"] = i.metadata.resource_version - data["namespace"] = i.metadata.namespace - for rule in i.spec.rules: + data["creation_timestamp"] = ingress.metadata.creation_timestamp.strftime("%x %X") + data["resource_version"] = ingress.metadata.resource_version + data["namespace"] = ingress.metadata.namespace + + if ingress.spec.tls is not None: + for tls in ingress.spec.tls: + try: + secret = self.api_instance.read_namespaced_secret(tls.secret_name, ingress.metadata.namespace) + if "tls.crt" not in secret.data or "tls.key" not in secret.data: + continue + + if tls.secret_name not in self.cert_cache or self.cert_cache[tls.secret_name] != secret.data: + self.cert_cache[tls.secret_name] = secret.data + Functions.save( + "{0}/{1}.pem".format(Consts.certs_haproxy, tls.secret_name), + base64.b64decode(secret.data["tls.crt"]).decode('ascii') + "\n" + base64.b64decode(secret.data["tls.key"]).decode('ascii') + ) + + ssl_hosts.extend(tls.hosts) + except Exception as e: + pass + + for rule in ingress.spec.rules: rule_data = {} port_number = rule.http.paths[0].backend.service.port.number - definition = rule.host.replace(".", "-") - rule_data["easyhaproxy.%s_%s.host" % (definition, port_number)] = rule.host - rule_data["easyhaproxy.%s_%s.port" % (definition, port_number)] = "80" - rule_data["easyhaproxy.%s_%s.localport" % (definition, port_number)] = port_number + definition = "easyhaproxy.%s_%s" % (rule.host.replace(".", "-"), port_number) + rule_data["%s.host" % (definition)] = rule.host + rule_data["%s.port" % (definition)] = "80" + rule_data["%s.localport" % (definition)] = port_number + if rule.host in ssl_hosts: + rule_data["%s.ssl" % (definition)] = 'true' if redirect_ssl is not None: - rule_data["easyhaproxy.%s_%s.redirect_ssl" % (definition, port_number)] = 'true' + rule_data["%s.redirect_ssl" % (definition)] = 'true' if letsencrypt is not None: - rule_data["easyhaproxy.%s_%s.letsencrypt" % (definition, port_number)] = 'true' + rule_data["%s.letsencrypt" % (definition)] = 'true' if redirect is not None: - rule_data["easyhaproxy.%s_%s.redirect" % (definition, port_number)] = redirect + rule_data["%s.redirect" % (definition)] = redirect service_name = rule.http.paths[0].backend.service.name try: - api_response = self.api_instance.read_namespaced_service(service_name, i.metadata.namespace) + api_response = self.api_instance.read_namespaced_service(service_name, ingress.metadata.namespace) cluster_ip = api_response.spec.cluster_ip except ApiException as e: cluster_ip = None From 0d16c117cb4be85d9195cbf7d1d568a0d2cf8168 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 00:50:00 -0500 Subject: [PATCH 27/45] Fix minor things --- src/main.py | 2 ++ src/processor/__init__.py | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main.py b/src/main.py index ee3447d..bb5305f 100644 --- a/src/main.py +++ b/src/main.py @@ -16,6 +16,7 @@ def start(): processor_obj.save_certs(Consts.certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'Found hosts: %s' % ", ".join(processor_obj.get_hosts())) # Needs to after save_config + Functions.log(Functions.EASYHAPROXY_LOG, Functions.TRACE, 'Object Found: %s' % (processor_obj.get_parsed_object())) old_haproxy = None haproxy = DaemonizeHAProxy() @@ -33,6 +34,7 @@ def start(): processor_obj.refresh() if DeepDiff(old_parsed, processor_obj.get_parsed_object()) != {} or not haproxy.is_alive(): Functions.log(Functions.EASYHAPROXY_LOG, Functions.DEBUG, 'New configuration found. Reloading...') + Functions.log(Functions.EASYHAPROXY_LOG, Functions.TRACE, 'Object Found: %s' % (processor_obj.get_parsed_object())) processor_obj.save_config(Consts.haproxy_config) processor_obj.save_certs(Consts.certs_haproxy) letsencrypt_certs_found = processor_obj.get_letsencrypt_hosts() diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 74aff20..72f9418 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -132,7 +132,7 @@ class Swarm(ProcessorInterface): class Kubernetes(ProcessorInterface): def __init__(self, filename = None): config.load_incluster_config() - #config.verify_ssl=False + config.verify_ssl = False self.api_instance = client.CoreV1Api() self.v1 = client.NetworkingV1Api() self.cert_cache = {} @@ -163,6 +163,8 @@ class Kubernetes(ProcessorInterface): data["resource_version"] = ingress.metadata.resource_version data["namespace"] = ingress.metadata.namespace + ingress_name = ingress.metadata.namespace + if ingress.spec.tls is not None: for tls in ingress.spec.tls: try: @@ -179,7 +181,9 @@ class Kubernetes(ProcessorInterface): ssl_hosts.extend(tls.hosts) except Exception as e: - pass + Functions.log("EASYHAPROXY", Functions.WARN, "Ingress %s - Get secret failed: '%s'" % (ingress_name, e)) + + Functions.log("EASYHAPROXY", Functions.TRACE, "Ingress %s - SSL Hosts found '%s'" % (ingress_name, ssl_hosts)) for rule in ingress.spec.rules: rule_data = {} @@ -197,13 +201,13 @@ class Kubernetes(ProcessorInterface): if redirect is not None: rule_data["%s.redirect" % (definition)] = redirect - service_name = rule.http.paths[0].backend.service.name + service_name = rule.http.paths[0].backend.service.ingress_name try: api_response = self.api_instance.read_namespaced_service(service_name, ingress.metadata.namespace) cluster_ip = api_response.spec.cluster_ip except ApiException as e: cluster_ip = None - # print("Exception when calling CoreV1Api->read_namespaced_service: %s\n" % e) + Functions.log("EASYHAPROXY", Functions.WARN, "Ingress %s - Service %s - Failed: '%s'" % (ingress_name, service_name, e)) if cluster_ip is not None: if cluster_ip not in self.parsed_object.keys(): From 68eea939a32d42d60f580dea756e8c3e97bdff2c Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 11:38:02 -0500 Subject: [PATCH 28/45] Fix SSL on Kubernetes --- README.md | 137 ++++++++++++++++------- examples/kubernetes/easyhaproxy.yml | 5 +- src/easymapping/__init__.py | 11 +- src/functions/__init__.py | 4 +- src/processor/__init__.py | 13 ++- src/tests/fixtures/services-clone-to-ssl | 2 + src/tests/test_containerenv.py | 2 +- src/tests/test_parser.py | 77 +++++++++++++ 8 files changed, 194 insertions(+), 57 deletions(-) create mode 100644 src/tests/fixtures/services-clone-to-ssl diff --git a/README.md b/README.md index ec929d8..1ddb82f 100644 --- a/README.md +++ b/README.md @@ -50,23 +50,20 @@ The mapping to `/var/run/docker.sock` is necessary to discover the docker contai The environment variables will setup the HAProxy. -| Environment Variable | Description | -|-------------------------------|---------------------------------------------------------------------------------------------------------------| -| EASYHAPROXY_DISCOVER | How `haproxy.cfg` will be created: `static`, `docker`, `swarm` or `kubernetes` | -| EASYHAPROXY_LABEL_PREFIX | (Optional) The key will search for matching resources. Default: `easyhaproxy`. | -| EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | -| EASYHAPROXY_SSL_MODE | (Optional) `STRICT` supports only the most recent TLS version; `DEFAULT` good SSL integration with recent browsers; `LOOSE` supports all old SSL protocols for old browsers (not recommended). | -| EASYHAPROXY_REFRESH_CONF | (Optional) Check configuration every N seconds. Default: 10 | -| EASYHAPROXY_LOG_LEVEL | (Optional) The log level for EasyHAproxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL Default: TRACE | -| CERTBOT_LOG_LEVEL | (Optional) The log level for Certbot messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL Default: TRACE | -| HAPROXY_LOG_LEVEL | (Optional) The log level for HAProxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL Default: TRACE | -| HAPROXY_USERNAME | (Optional) The HAProxy username to the statistics. Default: `admin` | -| HAPROXY_PASSWORD | (Optional) The HAProxy password to the statistics. If not set, statistics will be available with no password | -| HAPROXY_STATS_PORT | (Optional) The HAProxy port to the statistics. Default: `1936`. If set to `false`, disable statistics | -| HAPROXY_CUSTOMERRORS | (Optional) If HAProxy will use custom HTML errors. true/false. Default: `false` | - - - +| Environment Variable | Description | Default | +|-------------------------------|-------------------------------------------------------------------------------------------------|------------------| +| EASYHAPROXY_DISCOVER | How the services will be discovered to create `haproxy.cfg`: `static`, `docker`, `swarm` or `kubernetes` | **required** | +| EASYHAPROXY_LABEL_PREFIX | (Optional) The key will search for matching resources. | `easyhaproxy` | +| EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | *empty* | +| EASYHAPROXY_SSL_MODE | (Optional) `strict` supports only the most recent TLS version; `default` good SSL integration with recent browsers; `loose` supports all old SSL protocols for old browsers (not recommended). | `default`| +| EASYHAPROXY_REFRESH_CONF | (Optional) Check configuration every N seconds. | 10 | +| EASYHAPROXY_LOG_LEVEL | (Optional) The log level for EasyHAproxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | +| CERTBOT_LOG_LEVEL | (Optional) The log level for Certbot messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | +| HAPROXY_LOG_LEVEL | (Optional) The log level for HAProxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | +| HAPROXY_USERNAME | (Optional) The HAProxy username to the statistics. | `admin` | +| HAPROXY_PASSWORD | (Optional) The HAProxy password to the statistics. If not set, statistics will be available with no password | *empty* | +| HAPROXY_STATS_PORT | (Optional) The HAProxy port to the statistics. If set to `false`, disable statistics | `1936` | +| HAPROXY_CUSTOMERRORS | (Optional) If HAProxy will use custom HTML errors. true/false. | `false` | The environment variable `EASYHAPROXY_DISCOVER` will define where is located your containers (see below for more details): @@ -98,7 +95,7 @@ docker run --network easyhaproxy myimage or, if the container is already created you can join it using the command: -``` +```bash docker network connect easyhaproxy mycontainer ``` @@ -113,10 +110,10 @@ Important: easyhaproxy needs to be in the same network of the containers or othe ### EASYHAPROXY_DISCOVER: kubernetes (experimental and limited) -This will query all `ingress` in the kubernetes cluster and check the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. +This will query all `ingress` in the kubernetes cluster and check the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. e.g.: -``` +```yaml kind: Ingress metadata: annotations: @@ -145,36 +142,92 @@ spec: pathType: ImplementationSpecific ``` -At this point the implementation is very limited and doesn't support all ingress properties nor wildcard domains. +Caveats: -The system will read only `host` and `port.number` - -There is no necessary to add labels or annotations. +- At this point, the implementation don't support all ingress properties nor wildcard domains. +- The ingress will publish externally only the ports 80 and 443, plus 1936 if stats is enable. +- The system will read `spec.rules[].host` and `spec.rules[].http.paths[0].port.number` and ignore the other parameters. +- Only the first path `spec.rules[].http.paths[0]` will be parsed. +- There are specific annotations can be added as described bellow. ### Kubernetes annotations: -| annotation | Description | Example | -|-----------------------------|-------------------------------------------------------------------------------------------------|--------------| -| kubernetes.io/ingress.class | (required) Activate EasyHAProxy. | easyhaproxy-ingress -| easyhaproxy.redirect_ssl | (optional) Boolean. Force redirect all endpoints to https. | true/false) -| easyhaproxy.letsencrypt | (optional) Boolean. It will request letsencript certificates for the ingresses domains | true/false -| easyhaproxy.redirect | (optional) Json. Specific a domain and its destination | {"domain":"redirect_url"} +| annotation | Description | Default | Example | +|-----------------------------|-----------------------------------------------------------------------------------------|--------------|--------------| +| kubernetes.io/ingress.class | (required) Activate EasyHAProxy. | **required** | easyhaproxy-ingress +| easyhaproxy.redirect_ssl | (optional) Boolean. Force redirect all endpoints to https. | false | true or false +| easyhaproxy.letsencrypt | (optional) Boolean. It will request letsencript certificates for the ingresses domains. | false | true or false +| easyhaproxy.redirect | (optional) Json. Specific a domain and its destination. | *empty* | {"domain":"redirect_url"} +| easyhaproxy.mode | (optional) Set the HTTP mode for that connection. | http | http or tcp +**Important**: The annotations are per ingress and applied to all hosts in that ingress configuration. + +### Kubernetes and Letsencrypt: + +It is necessary add the annotation `easyhaproxy.letsencrypt` to the ingress configuration: + +```yaml +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + easyhaproxy.letsencrypt: 'true' + name: example-ingress + namespace: example +spec: + .... +``` + +Make sure your cluster is accessible both through ports 80 and 443. + +### Kubernetes and SSL: + +You need to create a secret with your certificate and key, and associate them in your ingress. + +```yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: host2-tls + namespace: default +data: + tls.crt: base64 of your certificate + tls.key: base64 of your certificate private key +type: kubernetes.io/tls + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: tls-example + namespace: default +spec: + tls: + - hosts: + - host2.local + secretName: host2-tls + rules: + ... +``` ### Container (Docker or Swarm) labels: -| Tag | Description | Example | -|---------------------------------------|---------------------------------------------------------------------------------------------------------|--------------| -| easyhaproxy.[definition].host | Host(s) HAProxy is listening. More than one host use comma as delimiter | somehost.com OR host1.com,host2.com | -| easyhaproxy.[definition].mode | (Optional) Is this `http` or `tcp` mode in HAProxy. (Defaults to http) | http | -| easyhaproxy.[definition].port | (Optional) Port HAProxy will listen for the host. (Defaults to 80) | 80 | -| easyhaproxy.[definition].localport | (Optional) Port container is listening. (Defaults to 80) | 8080 | -| easyhaproxy.[definition].redirect | (Optional) JSON containing key/value pair from host/to URL redirect. | {"foo.com":"https://bla.com", "bar.com":"https://bar.org"} | -| easyhaproxy.[definition].sslcert | (Optional) Cert PEM Base64 encoded. Do not use this if letsencrypt is enabled. | | -| easyhaproxy.[definition].ssl | (Optional) If `true` you need to provide certificate as a file. See below. Do not use with `sslcert`. | true | -| easyhaproxy.[definition].health-check | (Optional) `ssl`, enable health check via SSL in `mode tcp` (Defaults to "empty") | ssl | -| easyhaproxy.[definition].letsencrypt | (Optional) Generate certificate with letsencrypt. Do not use with `sslcert`. | true OR yes OR false OR no | -| easyhaproxy.[definition].redirect_ssl | (Optional) Redirect all requests to https | true OR yes OR false OR no | +| Tag | Description | Default | Example | +|---------------------------------------|-------------------------------------------------------------------------------------------------------|----------------|--------------| +| easyhaproxy.[definition].host | Host(s) HAProxy is listening. More than one host use comma as delimiter | **required** | somehost.com OR host1.com,host2.com | +| easyhaproxy.[definition].mode | (Optional) Is this `http` or `tcp` mode in HAProxy. | http | http or tcp | +| easyhaproxy.[definition].port | (Optional) Port HAProxy will listen for the host. | 80 | 3000 | +| easyhaproxy.[definition].localport | (Optional) Port container is listening. | 80 | 8080 | +| easyhaproxy.[definition].redirect | (Optional) JSON containing key/value pair from host/to URL redirect. | *empty* | {"foo.com":"https://bla.com", "bar.com":"https://bar.org"} | +| easyhaproxy.[definition].sslcert | (Optional) Cert PEM Base64 encoded. Do not use this if `letsencrypt` is enabled. | *empty* | base64 cert + key | +| easyhaproxy.[definition].ssl | (Optional) If `true` you need to provide certificate as a file. See below. Do not use with `sslcert`. | false | true or false | +| easyhaproxy.[definition].health-check | (Optional) `ssl`, enable health check via SSL in `mode tcp` | *empty* | ssl | +| easyhaproxy.[definition].letsencrypt | (Optional) Generate certificate with letsencrypt. Do not use with `sslcert` parameter. | false | true OR false | +| easyhaproxy.[definition].redirect_ssl | (Optional) Redirect all requests to https | false | true OR false | +| easyhaproxy.[definition].clone_to_ssl | (Optional) It copies the configuration to HTTPS(443) and disable SSL from the current config. **Do not use* this with `ssl` or `letsencrypt` parameters | false | true OR false | ### Defining the labels in Docker Swarm diff --git a/examples/kubernetes/easyhaproxy.yml b/examples/kubernetes/easyhaproxy.yml index 2aba608..3a7270a 100644 --- a/examples/kubernetes/easyhaproxy.yml +++ b/examples/kubernetes/easyhaproxy.yml @@ -19,7 +19,6 @@ spec: labels: app: easyhaproxy-ingress spec: - #serviceAccountName: easyhaproxy-ingress containers: - image: byjg/easy-haproxy:test imagePullPolicy: Always @@ -32,8 +31,8 @@ spec: containerPort: 443 hostPort: 443 - name: stats - containerPort: 1943 - hostPort: 1943 + containerPort: 1936 + hostPort: 1936 resources: requests: cpu: "100m" diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index f45e1fc..e2d6eeb 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -110,6 +110,9 @@ class HaproxyConfigGenerator: self.label.create([definition, "letsencrypt"]), False ) and self.mapping["letsencrypt"]["email"] != "" + clone_to_ssl = self.label.get_bool( + self.label.create([definition, "clone_to_ssl"]) + ) if port not in easymapping: easymapping[port] = { @@ -147,7 +150,7 @@ class HaproxyConfigGenerator: self.label.create([definition, "redirect"]) ) - if letsencrypt: + if letsencrypt or clone_to_ssl: if "443" not in easymapping: easymapping["443"] = { "mode": "http", @@ -160,17 +163,17 @@ class HaproxyConfigGenerator: easymapping["443"]["hosts"][hostname]["letsencrypt"] = False easymapping["443"]["hosts"][hostname]["redirect_ssl"] = False easymapping["443"]["ssl"] = True - self.letsencrypt_hosts.append(hostname) if hostname not in self.letsencrypt_hosts else self.letsencrypt_hosts + self.letsencrypt_hosts.append(hostname) if letsencrypt and hostname not in self.letsencrypt_hosts else self.letsencrypt_hosts # handle SSL ssl_label = self.label.create([definition, "sslcert"]) if self.label.has_label(ssl_label): filename = "{}.pem".format(d[host_label]) - easymapping[port]["ssl"] = True + easymapping[port]["ssl"] = True if not clone_to_ssl else False self.certs[filename] = base64.b64decode(d[ssl_label]).decode('ascii') if self.label.get_bool(self.label.create([definition, "ssl"])): - easymapping[port]["ssl"] = True + easymapping[port]["ssl"] = True if not clone_to_ssl else False return easymapping.values() diff --git a/src/functions/__init__.py b/src/functions/__init__.py index 1be98bd..4267f73 100644 --- a/src/functions/__init__.py +++ b/src/functions/__init__.py @@ -31,8 +31,8 @@ class Functions: Functions.ERROR: 4, Functions.FATAL: 5 } - level_required = 0 if level not in level_importance else level_importance[level] - level_asked = 0 if log_level_str.upper() not in level_importance else level_importance[log_level_str.upper()] + level_required = 1 if level not in level_importance else level_importance[level] + level_asked = 1 if log_level_str.upper() not in level_importance else level_importance[log_level_str.upper()] return level_asked < level_required @staticmethod diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 72f9418..ed4733c 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -14,7 +14,7 @@ class ContainerEnv: def read(): env_vars = { "customerrors": True if os.getenv("HAPROXY_CUSTOMERRORS") == "true" else False, - "ssl_mode": os.getenv("EASYHAPROXY_SSL_MODE") if os.getenv("EASYHAPROXY_SSL_MODE") else 'default' + "ssl_mode": os.getenv("EASYHAPROXY_SSL_MODE").lower() if os.getenv("EASYHAPROXY_SSL_MODE") else 'default' } if os.getenv("HAPROXY_PASSWORD"): @@ -157,6 +157,7 @@ class Kubernetes(ProcessorInterface): letsencrypt = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.letsencrypt") redirect_ssl = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.redirect_ssl") redirect = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.redirect") + mode = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.mode") data = {} data["creation_timestamp"] = ingress.metadata.creation_timestamp.strftime("%x %X") @@ -193,15 +194,17 @@ class Kubernetes(ProcessorInterface): rule_data["%s.port" % (definition)] = "80" rule_data["%s.localport" % (definition)] = port_number if rule.host in ssl_hosts: - rule_data["%s.ssl" % (definition)] = 'true' + rule_data["%s.clone_to_ssl" % (definition)] = 'true' if redirect_ssl is not None: - rule_data["%s.redirect_ssl" % (definition)] = 'true' + rule_data["%s.redirect_ssl" % (definition)] = redirect_ssl if letsencrypt is not None: - rule_data["%s.letsencrypt" % (definition)] = 'true' + rule_data["%s.letsencrypt" % (definition)] = letsencrypt if redirect is not None: rule_data["%s.redirect" % (definition)] = redirect + if mode is not None: + rule_data["%s.mode" % (definition)] = mode - service_name = rule.http.paths[0].backend.service.ingress_name + service_name = rule.http.paths[0].backend.service.name try: api_response = self.api_instance.read_namespaced_service(service_name, ingress.metadata.namespace) cluster_ip = api_response.spec.cluster_ip diff --git a/src/tests/fixtures/services-clone-to-ssl b/src/tests/fixtures/services-clone-to-ssl new file mode 100644 index 0000000..e9b9239 --- /dev/null +++ b/src/tests/fixtures/services-clone-to-ssl @@ -0,0 +1,2 @@ +{"10.152.183.62": {"creation_timestamp": "08/24/22 02:59:44", "resource_version": "72517156", "namespace": "parking", "easyhaproxy.valida-me_8080.host": "valida.me", "easyhaproxy.valida-me_8080.port": "80", "easyhaproxy.valida-me_8080.localport": 8080, "easyhaproxy.valida-me_8080.redirect": "{\"www.valida.me\": \"https://valida.me\"}", "easyhaproxy.www-valida-me_8080.host": "www.valida.me", "easyhaproxy.www-valida-me_8080.port": "80", "easyhaproxy.www-valida-me_8080.localport": 8080, "easyhaproxy.www-valida-me_8080.redirect": "{\"www.valida.me\": \"https://valida.me\"}"}, +"10.152.183.215": {"creation_timestamp": "08/26/22 03:06:01", "resource_version": "72522999", "namespace": "default", "easyhaproxy.host2-local_8080.host": "host2.local", "easyhaproxy.host2-local_8080.port": "80", "easyhaproxy.host2-local_8080.localport": 8080, "easyhaproxy.host2-local_8080.clone_to_ssl": "true"}} \ No newline at end of file diff --git a/src/tests/test_containerenv.py b/src/tests/test_containerenv.py index 90f5225..5e64b0f 100644 --- a/src/tests/test_containerenv.py +++ b/src/tests/test_containerenv.py @@ -23,7 +23,7 @@ def test_container_env_customerrors(): os.environ['HAPROXY_CUSTOMERRORS'] = '' def test_container_env_sslmode(): - os.environ['EASYHAPROXY_SSL_MODE'] = 'strict' + os.environ['EASYHAPROXY_SSL_MODE'] = 'STRICT' try: assert { "customerrors": False, diff --git a/src/tests/test_parser.py b/src/tests/test_parser.py index f46e6bf..a3d35f0 100644 --- a/src/tests/test_parser.py +++ b/src/tests/test_parser.py @@ -423,6 +423,83 @@ def test_parser_ssl_letsencrypt(): assert expected_file.read() == haproxy_config assert ["test.example.org"] == cfg.letsencrypt_hosts + +def test_parser_finds_services_clone_to_ssl_raw(): + line_list = load_fixture("services-clone-to-ssl") + + result = { + "customerrors": False, + "letsencrypt": { + "email": LETSENCRYPT_EMAIL + }, + "stats": { + "port": 0 + } + } + + if os.path.exists(CERT_FILE): + os.remove(CERT_FILE) + + cfg = easymapping.HaproxyConfigGenerator(result) + + parsed_object = [ + { + "health-check":"", + "hosts":{ + "host2.local":{ + "containers":[ + "10.152.183.215:8080" + ], + "letsencrypt": False, + "redirect_ssl": False + }, + "valida.me":{ + "containers":[ + "10.152.183.62:8080" + ], + "letsencrypt": False, + "redirect_ssl": False + }, + "www.valida.me":{ + "containers":[ + "10.152.183.62:8080" + ], + "letsencrypt": False, + "redirect_ssl": False + } + }, + "mode":"http", + "port":"80", + "redirect":{ + + } + }, + { + "health-check":"ssl", + "hosts":{ + "host2.local":{ + "containers":[ + "10.152.183.215:8080" + ], + "letsencrypt": False, + "redirect_ssl": False + } + }, + "mode":"http", + "port":"443", + "redirect":{ + + }, + "ssl": True + } + ] + processed = list(cfg.parse(line_list)) + + assert parsed_object == processed + assert [] == cfg.letsencrypt_hosts + + + #test_parser_finds_services_raw() #test_parser_tcp() #test_parser_multiple_hosts() From 799e277fe0df436501abcc29f8aed7a7a4da0bf0 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 14:07:47 -0500 Subject: [PATCH 29/45] Add service account and RBAC --- Dockerfile | 1 + examples/kubernetes/easyhaproxy.yml | 84 +++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/Dockerfile b/Dockerfile index fb29e07..c252af6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,7 @@ FROM alpine:3.16 ARG RELEASE_VERSION_ARG ENV RELEASE_VERSION=$RELEASE_VERSION_ARG +ENV TZ="Etc/UTC" WORKDIR /scripts diff --git a/examples/kubernetes/easyhaproxy.yml b/examples/kubernetes/easyhaproxy.yml index 3a7270a..1f54f2e 100644 --- a/examples/kubernetes/easyhaproxy.yml +++ b/examples/kubernetes/easyhaproxy.yml @@ -4,6 +4,89 @@ kind: Namespace metadata: name: easyhaproxy + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: easyhaproxy-ingress + namespace: easyhaproxy + +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: easyhaproxy-ingress +rules: +- apiGroups: + - "" + resources: + # - configmaps + # - endpoints + # - nodes + - pods + - services + - namespaces + # - events + - serviceaccounts + verbs: + - get + - list + - watch +- apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses + # - ingresses/status + # - ingressclasses + verbs: + - get + - list + - watch +# - apiGroups: +# - "extensions" +# - "networking.k8s.io" +# resources: +# - ingresses/status +# verbs: +# - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + # - watch + # - create + # - patch + # - update +# - apiGroups: +# - "discovery.k8s.io" +# resources: +# - endpointslices +# verbs: +# - get +# - list +# - watch + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: easyhaproxy-ingress + namespace: easyhaproxy +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: easyhaproxy-ingress +subjects: +- kind: ServiceAccount + name: easyhaproxy-ingress + namespace: easyhaproxy + + --- apiVersion: apps/v1 kind: DaemonSet @@ -19,6 +102,7 @@ spec: labels: app: easyhaproxy-ingress spec: + serviceAccountName: easyhaproxy-ingress containers: - image: byjg/easy-haproxy:test imagePullPolicy: Always From 2a74f5d4451833e0c5d856d958d0d9bd6ccca34a Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 14:19:56 -0500 Subject: [PATCH 30/45] Code reorganization --- .github/workflows/build.yml | 2 +- Makefile | 2 +- README.md | 26 ++++++++++------- build-multiarch.sh | 3 +- Dockerfile => build/Dockerfile | 2 +- .../certs/haproxy/.place_holder_cert.pem | 0 .../assets}/etc/haproxy/conf.d/README.md | 0 .../etc/haproxy/errors-custom/400.http | 0 .../etc/haproxy/errors-custom/403.http | 0 .../etc/haproxy/errors-custom/408.http | 0 .../etc/haproxy/errors-custom/500.http | 0 .../etc/haproxy/errors-custom/502.http | 0 .../etc/haproxy/errors-custom/503.http | 0 .../etc/haproxy/errors-custom/504.http | 0 .../docker/docker-compose.yml | 7 ++++- deploy/docker/install.sh | 29 +++++++++++++++++++ .../kubernetes/easyhaproxy.yml | 3 -- 17 files changed, 54 insertions(+), 20 deletions(-) rename Dockerfile => build/Dockerfile (96%) rename {assets => build/assets}/certs/haproxy/.place_holder_cert.pem (100%) rename {assets => build/assets}/etc/haproxy/conf.d/README.md (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/400.http (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/403.http (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/408.http (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/500.http (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/502.http (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/503.http (100%) rename {assets => build/assets}/etc/haproxy/errors-custom/504.http (100%) rename docker-compose.yml => deploy/docker/docker-compose.yml (88%) create mode 100755 deploy/docker/install.sh rename {examples => deploy}/kubernetes/easyhaproxy.yml (99%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2888fad..af6563c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -88,7 +88,7 @@ jobs: uses: docker/build-push-action@v2 with: context: . - file: Dockerfile + file: build/Dockerfile build-args: | RELEASE_VERSION_ARG="${{ join(steps.tags.outputs.result, ',') }}" platforms: linux/amd64,linux/arm64 diff --git a/Makefile b/Makefile index 4c3b4e4..0b7e07f 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ VERSION := $(shell git rev-parse --short HEAD) .PHONY: build build: - docker build -t byjg/easy-haproxy --build-arg RELEASE_VERSION_ARG="$(VERSION)" -t byjg/easy-haproxy:local . + docker build -t byjg/easy-haproxy --build-arg RELEASE_VERSION_ARG="$(VERSION)" -t byjg/easy-haproxy:local -f build/Dockerfile . .PHONY: test test: diff --git a/README.md b/README.md index 1ddb82f..f00af27 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,15 @@ This Docker image will dynamically create the `haproxy.cfg` based on the labels a simple Yaml. EasyHAProxy can detect and configure automatically HAProxy on the folowing platforms: + - Docker - Docker Swarm - Kubernetes ## Features -EasyHAProxy will discover the services based on the Docker Tags of the running containers in a Docker host or Docker Swarm cluster and dynamically set up the `haproxy.cfg`. Below, EasyHAProxy main features:: +EasyHAProxy will discover the services based on the Docker Tags of the running containers in a Docker host or Docker Swarm cluster and dynamically set up the `haproxy.cfg`. Below, EasyHAProxy main features: + - Use Letsencrypt with HAProxy. - Set your custom SSL certificates - Balance traffic between multiple replicas @@ -113,6 +115,7 @@ Important: easyhaproxy needs to be in the same network of the containers or othe This will query all `ingress` in the kubernetes cluster and check the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. e.g.: + ```yaml kind: Ingress metadata: @@ -150,7 +153,7 @@ Caveats: - Only the first path `spec.rules[].http.paths[0]` will be parsed. - There are specific annotations can be added as described bellow. -### Kubernetes annotations: +### Kubernetes annotations | annotation | Description | Default | Example | |-----------------------------|-----------------------------------------------------------------------------------------|--------------|--------------| @@ -180,7 +183,7 @@ spec: Make sure your cluster is accessible both through ports 80 and 443. -### Kubernetes and SSL: +### Kubernetes and SSL You need to create a secret with your certificate and key, and associate them in your ingress. @@ -213,7 +216,7 @@ spec: ... ``` -### Container (Docker or Swarm) labels: +### Container (Docker or Swarm) labels | Tag | Description | Default | Example | |---------------------------------------|-------------------------------------------------------------------------------------------------------|----------------|--------------| @@ -387,6 +390,7 @@ docker run \ ``` Run your container: + ```bash docker run \ -l easyhaproxy.express.port=80 \ @@ -401,15 +405,15 @@ Caveats: - Your container **must** listen to the port 80. Besides no error, the certificate won't be issued if in a different port. - The port 2080 is reserved for the certbot and should not be exposed. -- You cannot set the port 443 for the container with the Letsencrypt because EasyHAProxy will handle this automatically once the certificate is issued. +- You cannot set the port 443 for the container with the Letsencrypt because EasyHAProxy will handle this automatically once the certificate is issued. - If you don't run the EasyHAProxy with the parameter `EASYHAPROXY_LETSENCRYPT_EMAIL` no certificate will be issued. - Be aware of Letsencrypt issue limits - https://letsencrypt.org/docs/duplicate-certificate-limit/ and https://letsencrypt.org/docs/rate-limits/ ## Exposing Ports -You must expose some ports on the EasyHAProxy container and in the firewall. However, you don't need to expose the other container ports because EasyHAProxy will handle that. +You must expose some ports on the EasyHAProxy container and in the firewall. However, you don't need to expose the other container ports because EasyHAProxy will handle that. -- The ports `80` and `443`. +- The ports `80` and `443`. - If you enable the HAProxy statistics, you must also expose the port defined in `HAPROXY_STATS_PORT` environment variable (default 1936). Be aware that statististics are enabled by default with no password. - Every port defined in `easyhaproxy.[definitions].port` also should be exposed. @@ -424,7 +428,6 @@ docker run \ -d byjg/easy-haproxy ``` - ## Mapping custom .cfg files You can concatenate valid HAProxy `.cfg` files to the dynamically generated `haproxy.cfg` by mapping the folder `/etc/haproxy/conf.d`. @@ -438,7 +441,8 @@ docker run \ ## Mapping SSL certificates volumes -EasyHAProxy stores the certificates inside the folder `/certs/haproxy` and `/certs/letsencrypt`. +EasyHAProxy stores the certificates inside the folder `/certs/haproxy` and `/certs/letsencrypt`. + - If you want to preserve the letsencrypt certificates between reloads, map the folder `/certs/letsencrypt` to your volume. - If you want to provide your certificates as a file instead of a Base64 parameter, map the folder `/certs/haproxy` to your volume, and instead of use `easyhaproxy.[definition].sslcert`, use `easyhaproxy.[definition].ssl: true` @@ -486,14 +490,14 @@ where ERROR_NUMBER is the HTTP error code (e.g., `503.http`) ## Build - ```bash docker build -t byjg/easy-haproxy . ``` ## Limitations -EasyHAProxy has some limitations when there is more than one easy-haproxy container running: +EasyHAProxy has some limitations when there is more than one easy-haproxy container running: + - Replicas can be out-of-sync for a few seconds because each replica will discover the pods separately. - Each replica will request a Letsencrypt certificate and can fail because the letsencrypt challenge can be directed to the other replica. diff --git a/build-multiarch.sh b/build-multiarch.sh index a2fe1bb..716412b 100755 --- a/build-multiarch.sh +++ b/build-multiarch.sh @@ -17,7 +17,7 @@ podman run --rm --events-backend=file --cgroup-manager=cgroupfs --privileged doc for VERSION in $VERSIONS do - DOCKERFILE=Dockerfile + DOCKERFILE=build/Dockerfile buildah manifest create byjg/easy-haproxy:$VERSION @@ -29,4 +29,3 @@ do buildah manifest push --all --format v2s2 byjg/easy-haproxy:$VERSION docker://byjg/easy-haproxy:$VERSION done - diff --git a/Dockerfile b/build/Dockerfile similarity index 96% rename from Dockerfile rename to build/Dockerfile index c252af6..20c3459 100644 --- a/Dockerfile +++ b/build/Dockerfile @@ -8,7 +8,7 @@ ENV TZ="Etc/UTC" WORKDIR /scripts COPY src/ /scripts/ -COPY assets / +COPY build/assets / RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml certbot openssl \ && ln -s /usr/bin/python3 /usr/bin/python \ diff --git a/assets/certs/haproxy/.place_holder_cert.pem b/build/assets/certs/haproxy/.place_holder_cert.pem similarity index 100% rename from assets/certs/haproxy/.place_holder_cert.pem rename to build/assets/certs/haproxy/.place_holder_cert.pem diff --git a/assets/etc/haproxy/conf.d/README.md b/build/assets/etc/haproxy/conf.d/README.md similarity index 100% rename from assets/etc/haproxy/conf.d/README.md rename to build/assets/etc/haproxy/conf.d/README.md diff --git a/assets/etc/haproxy/errors-custom/400.http b/build/assets/etc/haproxy/errors-custom/400.http similarity index 100% rename from assets/etc/haproxy/errors-custom/400.http rename to build/assets/etc/haproxy/errors-custom/400.http diff --git a/assets/etc/haproxy/errors-custom/403.http b/build/assets/etc/haproxy/errors-custom/403.http similarity index 100% rename from assets/etc/haproxy/errors-custom/403.http rename to build/assets/etc/haproxy/errors-custom/403.http diff --git a/assets/etc/haproxy/errors-custom/408.http b/build/assets/etc/haproxy/errors-custom/408.http similarity index 100% rename from assets/etc/haproxy/errors-custom/408.http rename to build/assets/etc/haproxy/errors-custom/408.http diff --git a/assets/etc/haproxy/errors-custom/500.http b/build/assets/etc/haproxy/errors-custom/500.http similarity index 100% rename from assets/etc/haproxy/errors-custom/500.http rename to build/assets/etc/haproxy/errors-custom/500.http diff --git a/assets/etc/haproxy/errors-custom/502.http b/build/assets/etc/haproxy/errors-custom/502.http similarity index 100% rename from assets/etc/haproxy/errors-custom/502.http rename to build/assets/etc/haproxy/errors-custom/502.http diff --git a/assets/etc/haproxy/errors-custom/503.http b/build/assets/etc/haproxy/errors-custom/503.http similarity index 100% rename from assets/etc/haproxy/errors-custom/503.http rename to build/assets/etc/haproxy/errors-custom/503.http diff --git a/assets/etc/haproxy/errors-custom/504.http b/build/assets/etc/haproxy/errors-custom/504.http similarity index 100% rename from assets/etc/haproxy/errors-custom/504.http rename to build/assets/etc/haproxy/errors-custom/504.http diff --git a/docker-compose.yml b/deploy/docker/docker-compose.yml similarity index 88% rename from docker-compose.yml rename to deploy/docker/docker-compose.yml index 2af38f1..90b0a3e 100644 --- a/docker-compose.yml +++ b/deploy/docker/docker-compose.yml @@ -23,10 +23,15 @@ services: - "443:443/tcp" - "1936:1936/tcp" + networks: + - easyhaproxy + volumes: certs_letsencrypt: + external: true certs_haproxy: + external: true networks: easyhaproxy: - driver: bridge + external: true diff --git a/deploy/docker/install.sh b/deploy/docker/install.sh new file mode 100755 index 0000000..d5ab2ff --- /dev/null +++ b/deploy/docker/install.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +ASSETS_DIR="$(dirname "${BASH_SOURCE[0]}")"/../../build/assets/certs/haproxy + +docker network create easyhaproxy +docker volume create certs_letsencrypt +docker volume create certs_haproxy + +docker run -d --rm --name easyhaproxy_install -v certs_haproxy:/certs alpine tail -f /dev/null +docker cp $ASSETS_DIR/.place_holder_cert.pem easyhaproxy_install:/certs/.place_holder_cert.pem +docker stop easyhaproxy_install + +echo +echo +echo make sure to add to all of your containers: +echo +echo docker-compose +echo ============== +echo "networks:" +echo " default:" +echo " name: easyhaproxy" +echo " external: true" + +echo +echo +echo docker run +echo ============== +echo docker run ... --network easyhaproxy ... your_image:tag +echo \ No newline at end of file diff --git a/examples/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy.yml similarity index 99% rename from examples/kubernetes/easyhaproxy.yml rename to deploy/kubernetes/easyhaproxy.yml index 1f54f2e..b4ee2ad 100644 --- a/examples/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy.yml @@ -4,7 +4,6 @@ kind: Namespace metadata: name: easyhaproxy - --- apiVersion: v1 kind: ServiceAccount @@ -86,7 +85,6 @@ subjects: name: easyhaproxy-ingress namespace: easyhaproxy - --- apiVersion: apps/v1 kind: DaemonSet @@ -135,4 +133,3 @@ spec: value: "true" - name: EASYHAPROXY_SSL_MODE value: loose - From 7a1fc46f00c6f13ea409dcf7e0de7df68ed13903 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 16:05:18 -0500 Subject: [PATCH 31/45] Minor changes in github actions --- .dockerignore | 4 ++++ .github/workflows/build.yml | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8dc3880 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +__pycache__ +.pytest_cache +*.pyc +.* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index af6563c..b02c742 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,10 +26,14 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - name: Run tests + - name: Install requirements run: | cd src/ pip install -r requirements.txt + + - name: Run tests + run: | + cd src/ pytest -s tests/ -vv Build: From 25c3db70704ec0606c18b8f7f146d5774cc473fd Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 20:03:11 -0500 Subject: [PATCH 32/45] Reorganizing the Documentation --- README.md | 480 +----------------------------- deploy/kubernetes/easyhaproxy.yml | 9 + docker.png | Bin 0 -> 6614 bytes docs/container-labels.md | 97 ++++++ docs/docker-environment.md | 21 ++ docs/docker.md | 65 ++++ docs/kubernetes.md | 141 +++++++++ docs/letsencrypt.md | 52 ++++ docs/limitations.md | 16 + docs/logo.xcf | Bin 0 -> 995246 bytes docs/other.md | 39 +++ docs/ssl.md | 75 +++++ docs/static.md | 109 +++++++ docs/swarm.md | 96 ++++++ kubernetes.png | Bin 0 -> 14420 bytes logo.png | Bin 0 -> 31425 bytes static.png | Bin 0 -> 22944 bytes swarm.png | Bin 0 -> 19467 bytes 18 files changed, 734 insertions(+), 466 deletions(-) create mode 100644 docker.png create mode 100644 docs/container-labels.md create mode 100644 docs/docker-environment.md create mode 100644 docs/docker.md create mode 100644 docs/kubernetes.md create mode 100644 docs/letsencrypt.md create mode 100644 docs/limitations.md create mode 100644 docs/logo.xcf create mode 100644 docs/other.md create mode 100644 docs/ssl.md create mode 100644 docs/static.md create mode 100644 docs/swarm.md create mode 100644 kubernetes.png create mode 100644 logo.png create mode 100644 static.png create mode 100644 swarm.png diff --git a/README.md b/README.md index f00af27..33c62f5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Easy HAProxy +# EasyHAProxy [![Opensource ByJG](https://img.shields.io/badge/opensource-byjg-success.svg)](http://opensource.byjg.com) [![Build Status](https://github.com/byjg/docker-easy-haproxy/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/byjg/docker-easy-haproxy/actions/workflows/build.yml) @@ -6,10 +6,11 @@ [![GitHub license](https://img.shields.io/github/license/byjg/docker-easy-haproxy.svg)](https://opensource.byjg.com/opensource/licensing.html) [![GitHub release](https://img.shields.io/github/release/byjg/docker-easy-haproxy.svg)](https://github.com/byjg/docker-easy-haproxy/releases/) +![EasyHAProxy](logo.png) + ## Service discovery for HAProxy -This Docker image will dynamically create the `haproxy.cfg` based on the labels defined in docker containers or from -a simple Yaml. +The main objective of EasyHAProxy is dynamically create the `haproxy.cfg` based on the labels defined in docker containers. EasyHAProxy can detect and configure automatically HAProxy on the folowing platforms: @@ -30,476 +31,23 @@ EasyHAProxy will discover the services based on the Docker Tags of the running c - Enable/disable Stats on port 1936 with a custom password. - Enable/disable custom errors. -Also, it is possible to set up HAProxy from a simple Yaml file instead of creating `haproxy.cfg` file. +Also, it is possible to set up HAProxy from a simple Yaml file instead of creating `haproxy.cfg` file. -## Basic Usage +## How It Works? -The Easy HAProxy will automatically create the `haproxy.cfg` file based on the containers or a YAML provided. +You don't need to change your current infrastructure and don't need to learn the HAProxy configuration. -The basic command line to run is: +You need run the EasyHAProxy container, add some labels to your existing container and EasyHAProxy will +automatically detect them and setup HAProxy for you. -```bash -docker run -d \ - --name easy-haproxy-container \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -e EASYHAPROXY_DISCOVER="swarm|docker|static" \ - # + Environment Variables \ - # + ports mapped to the host \ - byjg/easy-haproxy -``` +## Detailed Instructions -The mapping to `/var/run/docker.sock` is necessary to discover the docker containers and get the labels; +For detailed instructions on how to use EasyHAProxy follow the instructions for the platform you want to use: -The environment variables will setup the HAProxy. +| Kubernetes | Docker Swarm | Docker | Static +|------------|--------------|--------|--------- +| [![Kubernetes](kubernetes.png)](docs/kubernetes.md) | [![Docker Swarm](swarm.png)](docs/swarm.md) | [![Docker](docker.png)](docs/docker.md) | [![Static](static.png)](docs/static.md) -| Environment Variable | Description | Default | -|-------------------------------|-------------------------------------------------------------------------------------------------|------------------| -| EASYHAPROXY_DISCOVER | How the services will be discovered to create `haproxy.cfg`: `static`, `docker`, `swarm` or `kubernetes` | **required** | -| EASYHAPROXY_LABEL_PREFIX | (Optional) The key will search for matching resources. | `easyhaproxy` | -| EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | *empty* | -| EASYHAPROXY_SSL_MODE | (Optional) `strict` supports only the most recent TLS version; `default` good SSL integration with recent browsers; `loose` supports all old SSL protocols for old browsers (not recommended). | `default`| -| EASYHAPROXY_REFRESH_CONF | (Optional) Check configuration every N seconds. | 10 | -| EASYHAPROXY_LOG_LEVEL | (Optional) The log level for EasyHAproxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | -| CERTBOT_LOG_LEVEL | (Optional) The log level for Certbot messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | -| HAPROXY_LOG_LEVEL | (Optional) The log level for HAProxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | -| HAPROXY_USERNAME | (Optional) The HAProxy username to the statistics. | `admin` | -| HAPROXY_PASSWORD | (Optional) The HAProxy password to the statistics. If not set, statistics will be available with no password | *empty* | -| HAPROXY_STATS_PORT | (Optional) The HAProxy port to the statistics. If set to `false`, disable statistics | `1936` | -| HAPROXY_CUSTOMERRORS | (Optional) If HAProxy will use custom HTML errors. true/false. | `false` | - -The environment variable `EASYHAPROXY_DISCOVER` will define where is located your containers (see below for more details): - -- docker -- swarm -- static - -## Automatic Discover Services - -Easy HAProxy can automatically discover the container services running in the same network of Docker or in a Docker Swarm cluster. - -### EASYHAPROXY_DISCOVER: docker - -This method will use a standard docker installation to discover the containers and configure the HAProxy. - -The only requirement is that containers and easy-haproxy must be in the same docker network. - -The discovery will occur every minute. - -e.g.: - -```bash -docker create network easyhaproxy - -docker run --network easyhaproxy byjg/easyhaproxy - -docker run --network easyhaproxy myimage -``` - -or, if the container is already created you can join it using the command: - -```bash -docker network connect easyhaproxy mycontainer -``` - -### EASYHAPROXY_DISCOVER: swarm - -This method requires a functional Docker Swarm Cluster. The system will search for the labels in all containers on all -swarm nodes. - -The discovery will occur every minute. - -Important: easyhaproxy needs to be in the same network of the containers or otherwise will not access. - -### EASYHAPROXY_DISCOVER: kubernetes (experimental and limited) - -This will query all `ingress` in the kubernetes cluster and check the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. - -e.g.: - -```yaml -kind: Ingress -metadata: - annotations: - kubernetes.io/ingress.class: easyhaproxy-ingress - name: example-ingress - namespace: example -spec: - rules: - - host: example.org - http: - paths: - - backend: - service: - name: example-service - port: - number: 8080 - pathType: ImplementationSpecific - - host: www.example.org - http: - paths: - - backend: - service: - name: example-service - port: - number: 8080 - pathType: ImplementationSpecific -``` - -Caveats: - -- At this point, the implementation don't support all ingress properties nor wildcard domains. -- The ingress will publish externally only the ports 80 and 443, plus 1936 if stats is enable. -- The system will read `spec.rules[].host` and `spec.rules[].http.paths[0].port.number` and ignore the other parameters. -- Only the first path `spec.rules[].http.paths[0]` will be parsed. -- There are specific annotations can be added as described bellow. - -### Kubernetes annotations - -| annotation | Description | Default | Example | -|-----------------------------|-----------------------------------------------------------------------------------------|--------------|--------------| -| kubernetes.io/ingress.class | (required) Activate EasyHAProxy. | **required** | easyhaproxy-ingress -| easyhaproxy.redirect_ssl | (optional) Boolean. Force redirect all endpoints to https. | false | true or false -| easyhaproxy.letsencrypt | (optional) Boolean. It will request letsencript certificates for the ingresses domains. | false | true or false -| easyhaproxy.redirect | (optional) Json. Specific a domain and its destination. | *empty* | {"domain":"redirect_url"} -| easyhaproxy.mode | (optional) Set the HTTP mode for that connection. | http | http or tcp - -**Important**: The annotations are per ingress and applied to all hosts in that ingress configuration. - -### Kubernetes and Letsencrypt: - -It is necessary add the annotation `easyhaproxy.letsencrypt` to the ingress configuration: - -```yaml -kind: Ingress -metadata: - annotations: - kubernetes.io/ingress.class: easyhaproxy-ingress - easyhaproxy.letsencrypt: 'true' - name: example-ingress - namespace: example -spec: - .... -``` - -Make sure your cluster is accessible both through ports 80 and 443. - -### Kubernetes and SSL - -You need to create a secret with your certificate and key, and associate them in your ingress. - -```yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: host2-tls - namespace: default -data: - tls.crt: base64 of your certificate - tls.key: base64 of your certificate private key -type: kubernetes.io/tls - ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - kubernetes.io/ingress.class: easyhaproxy-ingress - name: tls-example - namespace: default -spec: - tls: - - hosts: - - host2.local - secretName: host2-tls - rules: - ... -``` - -### Container (Docker or Swarm) labels - -| Tag | Description | Default | Example | -|---------------------------------------|-------------------------------------------------------------------------------------------------------|----------------|--------------| -| easyhaproxy.[definition].host | Host(s) HAProxy is listening. More than one host use comma as delimiter | **required** | somehost.com OR host1.com,host2.com | -| easyhaproxy.[definition].mode | (Optional) Is this `http` or `tcp` mode in HAProxy. | http | http or tcp | -| easyhaproxy.[definition].port | (Optional) Port HAProxy will listen for the host. | 80 | 3000 | -| easyhaproxy.[definition].localport | (Optional) Port container is listening. | 80 | 8080 | -| easyhaproxy.[definition].redirect | (Optional) JSON containing key/value pair from host/to URL redirect. | *empty* | {"foo.com":"https://bla.com", "bar.com":"https://bar.org"} | -| easyhaproxy.[definition].sslcert | (Optional) Cert PEM Base64 encoded. Do not use this if `letsencrypt` is enabled. | *empty* | base64 cert + key | -| easyhaproxy.[definition].ssl | (Optional) If `true` you need to provide certificate as a file. See below. Do not use with `sslcert`. | false | true or false | -| easyhaproxy.[definition].health-check | (Optional) `ssl`, enable health check via SSL in `mode tcp` | *empty* | ssl | -| easyhaproxy.[definition].letsencrypt | (Optional) Generate certificate with letsencrypt. Do not use with `sslcert` parameter. | false | true OR false | -| easyhaproxy.[definition].redirect_ssl | (Optional) Redirect all requests to https | false | true OR false | -| easyhaproxy.[definition].clone_to_ssl | (Optional) It copies the configuration to HTTPS(443) and disable SSL from the current config. **Do not use* this with `ssl` or `letsencrypt` parameters | false | true OR false | - -### Defining the labels in Docker Swarm - -if you are deploying a stack in a Docker Swarm cluster, set labels at the `deploy` level: - -```yaml -services: - foo: - deploy: - labels: - easyhaproxy.my.host: "www.example.org" - easyhaproxy.my.localport: 8080 - ... -``` - -```bash -docker stack deploy --compose-file docker-compose.yml mystack -``` - -### Single Definition - -```bash -docker run \ - -l easyhaproxy.webapi.port=80\ - -l easyhaproxy.webapi.host=byjg.com.br \ - .... -``` - -### Multiples Definitions on the same container - -```bash -docker run \ - -l easyhaproxy.express.port=80 \ - -l easyhaproxy.express.localport=3000 \ - -l easyhaproxy.express.host=express.byjg.com.br \ - - -l easyhaproxy.admin.port=80 \ - -l easyhaproxy.admin.localport=3001 \ - -l easyhaproxy.admin.host=admin.byjg.com.br \ - .... \ - some/myimage -``` - -### Multiples hosts on the same container - -```bash -docker run \ - -l easyhaproxy.express.port=80 \ - -l easyhaproxy.express.localport=3000 \ - -l easyhaproxy.express.host=express.byjg.com.br,admin.byjg.com.br \ - .... \ - some/myimage -``` - -If you are using docker-compose you can use this way: - -```yaml -version: "3" - -services: - mycontainer: - image: some/myimage - labels: - easyhaproxy.express.port: 80 - easyhaproxy.express.localport: 3000 - easyhaproxy.express.host: >- - express.byjg.com.br, - admin.byjg.com.br -``` - -### TLS passthrough - -Used to pass on SSL termination to a backend. Alternatively, you can enable health-check via SSL on the backend with the optional `health-check` label: - -```bash -docker run \ - -l easyhaproxy.example.mode=tcp \ - -l easyhaproxy.example.health-check=ssl \ - -l easyhaproxy.example.port=443 - .... \ - some/tcp-service -``` - -### Redirect Example - -```bash -docker run \ - -l easyhaproxy.[definition].redirect='{"www.byjg.com.br":"http://byjg.com.br","byjg.com":"http://byjg.com.br"}' -``` - -## EASYHAPROXY_DISCOVER: static - -This method expects a YAML file to setup the `haproxy.cfg` - -Create a YAML file and map to `/etc/haproxy/easyconfig.yml` - -```yaml -stats: - username: admin - password: password - port: 1936 # Optional (default 1936) - -customerrors: true # Optional (default false) - -ssl_mode: default - -letsencrypt: { - "email": "acme@example.org" -} - -easymapping: - - port: 80 - hosts: - host1.com.br: - containers: - - container:5000 - letsencrypt: true - redirect_ssl: true - host2.com.br: - containers: - - other:3000 - redirect: - www.host1.com.br: http://host1.com.br - - - port: 443 - hosts: - host1.com.br: - containers: - - container:80 - redirect_ssl: false - ssl: true - - - port: 8080 - hosts: - host3.com.br: - containers: - - domain:8181 -``` - -Running: - -```bash -docker run -v /my/config.yml:/etc/haproxy/easyconfig.yml .... byjg/easyhaproxy -``` - -## Letsencrypt - -This HAProxy can issue a letsencrypt certificate. The command is as below: - -Run the EasyHAProxy: - -```bash -docker run \ - -e EASYHAPROXY_LETSENCRYPT_EMAIL=john@doe.com - .... \ - byjg/easy-haproxy -``` - -Run your container: - -```bash -docker run \ - -l easyhaproxy.express.port=80 \ - -l easyhaproxy.express.localport=3000 \ - -l easyhaproxy.express.host=example.org \ - -l easyhaproxy.express.letsencrypt=true \ - .... \ - some/myimage -``` - -Caveats: - -- Your container **must** listen to the port 80. Besides no error, the certificate won't be issued if in a different port. -- The port 2080 is reserved for the certbot and should not be exposed. -- You cannot set the port 443 for the container with the Letsencrypt because EasyHAProxy will handle this automatically once the certificate is issued. -- If you don't run the EasyHAProxy with the parameter `EASYHAPROXY_LETSENCRYPT_EMAIL` no certificate will be issued. -- Be aware of Letsencrypt issue limits - https://letsencrypt.org/docs/duplicate-certificate-limit/ and https://letsencrypt.org/docs/rate-limits/ - -## Exposing Ports - -You must expose some ports on the EasyHAProxy container and in the firewall. However, you don't need to expose the other container ports because EasyHAProxy will handle that. - -- The ports `80` and `443`. -- If you enable the HAProxy statistics, you must also expose the port defined in `HAPROXY_STATS_PORT` environment variable (default 1936). Be aware that statististics are enabled by default with no password. -- Every port defined in `easyhaproxy.[definitions].port` also should be exposed. - -e.g. - -```bash -docker run \ - /* other parameters */ - -p 80:80 \ - -p 443:443 \ - -p 1936:1936 \ - -d byjg/easy-haproxy -``` - -## Mapping custom .cfg files - -You can concatenate valid HAProxy `.cfg` files to the dynamically generated `haproxy.cfg` by mapping the folder `/etc/haproxy/conf.d`. - -```bash -docker run \ - /* other parameters */ - -v /your/local/conf.d:/etc/haproxy/conf.d \ - -d byjg/easy-haproxy -``` - -## Mapping SSL certificates volumes - -EasyHAProxy stores the certificates inside the folder `/certs/haproxy` and `/certs/letsencrypt`. - -- If you want to preserve the letsencrypt certificates between reloads, map the folder `/certs/letsencrypt` to your volume. -- If you want to provide your certificates as a file instead of a Base64 parameter, map the folder `/certs/haproxy` to your volume, and instead of use `easyhaproxy.[definition].sslcert`, use `easyhaproxy.[definition].ssl: true` - -```bash -docker run \ - /* other parameters */ - -v /your/certs/letsencrypt:/certs/letsencrypt \ - -d byjg/easy-haproxy -``` - -## Handling SSL - -You can attach a valid SSL certificate to the request. - -1. First, Create a single PEM file including CA. - -```bash -cat example.com.crt example.com.key > single.pem - -cat single.pem - ------BEGIN CERTIFICATE----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5ZheHqmBnEJP+ -U9r1gxYWKLzdqrMrcxtQN6M1hIH9n0peuJeIrybdcV7sMbStMXI= ------END CERTIFICATE----- - ------BEGIN PRIVATE KEY----- -MIIEojCCA4qgAwIBAgIUegW2BimwuL4RzRZ2WYkHA6U5nkAwDQYJKoZIhvcNAQEL -3j4wz8/I5fdsk090j4s5KA== ------END PRIVATE KEY----- -``` - -2. Convert it to BASE64 in a single line: - -```bash -cat single.pem | base64 -w0 -``` - -3. Use this string to define the label `easyhaproxy.[definition].sslcert` - -## Setting Custom Errors - -If enabled, map the volume : `/etc/haproxy/errors-custom/` to your container and put a file named `ERROR_NUMBER.http` -where ERROR_NUMBER is the HTTP error code (e.g., `503.http`) - -## Build - -```bash -docker build -t byjg/easy-haproxy . -``` - -## Limitations - -EasyHAProxy has some limitations when there is more than one easy-haproxy container running: - -- Replicas can be out-of-sync for a few seconds because each replica will discover the pods separately. -- Each replica will request a Letsencrypt certificate and can fail because the letsencrypt challenge can be directed to the other replica. ---- [Open source ByJG](http://opensource.byjg.com) diff --git a/deploy/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy.yml index b4ee2ad..cec1d40 100644 --- a/deploy/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy.yml @@ -100,6 +100,15 @@ spec: labels: app: easyhaproxy-ingress spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: easyhaproxy/node + operator: In + values: + - master serviceAccountName: easyhaproxy-ingress containers: - image: byjg/easy-haproxy:test diff --git a/docker.png b/docker.png new file mode 100644 index 0000000000000000000000000000000000000000..536bacf774ba2ecd4a71c4125b0798859f42fbe8 GIT binary patch literal 6614 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 literal 0 HcmV?d00001 diff --git a/docs/container-labels.md b/docs/container-labels.md new file mode 100644 index 0000000..97988d5 --- /dev/null +++ b/docs/container-labels.md @@ -0,0 +1,97 @@ +# Container Labels + +## Container (Docker or Swarm) labels + +| Tag | Description | Default | Example | +|---------------------------------------|-------------------------------------------------------------------------------------------------------|----------------|--------------| +| easyhaproxy.[definition].host | Host(s) HAProxy is listening. More than one host use comma as delimiter | **required** | somehost.com OR host1.com,host2.com | +| easyhaproxy.[definition].mode | (Optional) Is this `http` or `tcp` mode in HAProxy. | http | http or tcp | +| easyhaproxy.[definition].port | (Optional) Port HAProxy will listen for the host. | 80 | 3000 | +| easyhaproxy.[definition].localport | (Optional) Port container is listening. | 80 | 8080 | +| easyhaproxy.[definition].redirect | (Optional) JSON containing key/value pair from host/to URL redirect. | *empty* | {"foo.com":"https://bla.com", "bar.com":"https://bar.org"} | +| easyhaproxy.[definition].sslcert | (Optional) Cert PEM Base64 encoded. Do not use this if `letsencrypt` is enabled. | *empty* | base64 cert + key | +| easyhaproxy.[definition].ssl | (Optional) If `true` you need to provide certificate as a file. See below. Do not use with `sslcert`. | false | true or false | +| easyhaproxy.[definition].health-check | (Optional) `ssl`, enable health check via SSL in `mode tcp` | *empty* | ssl | +| easyhaproxy.[definition].letsencrypt | (Optional) Generate certificate with letsencrypt. Do not use with `sslcert` parameter. | false | true OR false | +| easyhaproxy.[definition].redirect_ssl | (Optional) Redirect all requests to https | false | true OR false | +| easyhaproxy.[definition].clone_to_ssl | (Optional) It copies the configuration to HTTPS(443) and disable SSL from the current config. **Do not use* this with `ssl` or `letsencrypt` parameters | false | true OR false | + +The `definition` is a string that will group all configurations togethers. Different `definition` will create different configurations. + +The container can have more than one defintion. + +## Configuations + +### Single Definition + +```bash +docker run \ + -l easyhaproxy.webapi.port=80\ + -l easyhaproxy.webapi.host=byjg.com.br \ + .... +``` + +### Multiples Definitions on the same container + +```bash +docker run \ + -l easyhaproxy.express.port=80 \ + -l easyhaproxy.express.localport=3000 \ + -l easyhaproxy.express.host=express.byjg.com.br \ + + -l easyhaproxy.admin.port=80 \ + -l easyhaproxy.admin.localport=3001 \ + -l easyhaproxy.admin.host=admin.byjg.com.br \ + .... \ + some/myimage +``` + +### Multiples hosts on the same container + +```bash +docker run \ + -l easyhaproxy.express.port=80 \ + -l easyhaproxy.express.localport=3000 \ + -l easyhaproxy.express.host=express.byjg.com.br,admin.byjg.com.br \ + .... \ + some/myimage +``` + +If you are using docker-compose you can use this way: + +```yaml +version: "3" + +services: + mycontainer: + image: some/myimage + labels: + easyhaproxy.express.port: 80 + easyhaproxy.express.localport: 3000 + easyhaproxy.express.host: >- + express.byjg.com.br, + admin.byjg.com.br +``` + +### TCP Mode + +Set `easyhaproxy.[definition].mode=tcp` if your application uses TCP protocol instead of HTTP. + +```bash +docker run \ + -l easyhaproxy.example.mode=tcp \ + -l easyhaproxy.example.port=3306 + -l easyhaproxy.example.localport=3306 + .... \ + some/tcp-service +``` + +### Redirect Domains + +```bash +docker run \ + -l easyhaproxy.[definition].redirect='{"www.byjg.com.br":"http://byjg.com.br","byjg.com":"http://byjg.com.br"}' +``` + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/docker-environment.md b/docs/docker-environment.md new file mode 100644 index 0000000..1ed6288 --- /dev/null +++ b/docs/docker-environment.md @@ -0,0 +1,21 @@ +# Docker environment variables + +| Environment Variable | Description | Default | +|-------------------------------|-------------------------------------------------------------------------------------------------|------------------| +| EASYHAPROXY_DISCOVER | How the services will be discovered to create `haproxy.cfg`: `static`, `docker`, `swarm` or `kubernetes` | **required** | +| EASYHAPROXY_LABEL_PREFIX | (Optional) The key will search for matching resources. | `easyhaproxy` | +| EASYHAPROXY_LETSENCRYPT_EMAIL | (Optional) The email will be used to request the certificate to Letsencrypt | *empty* | +| EASYHAPROXY_SSL_MODE | (Optional) `strict` supports only the most recent TLS version; `default` good SSL integration with recent browsers; `loose` supports all old SSL protocols for old browsers (not recommended). | `default`| +| EASYHAPROXY_REFRESH_CONF | (Optional) Check configuration every N seconds. | 10 | +| EASYHAPROXY_LOG_LEVEL | (Optional) The log level for EasyHAproxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | +| CERTBOT_LOG_LEVEL | (Optional) The log level for Certbot messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | +| HAPROXY_LOG_LEVEL | (Optional) The log level for HAProxy messages. Available: TRACE,DEBUG,INFO,WARN,ERROR,FATAL | DEBUG | +| HAPROXY_USERNAME | (Optional) The HAProxy username to the statistics. | `admin` | +| HAPROXY_PASSWORD | (Optional) The HAProxy password to the statistics. If not set, statistics will be available with no password | *empty* | +| HAPROXY_STATS_PORT | (Optional) The HAProxy port to the statistics. If set to `false`, disable statistics | `1936` | +| HAPROXY_CUSTOMERRORS | (Optional) If HAProxy will use custom HTML errors. true/false. | `false` | + + + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/docker.md b/docs/docker.md new file mode 100644 index 0000000..a195129 --- /dev/null +++ b/docs/docker.md @@ -0,0 +1,65 @@ +# Docker + +## Setup Docker EasyHAProxy + +This method will use a docker standalone installation to discover the containers and configure the HAProxy. + +The only requirement is that containers and EasyHAProxy must be in the same docker network in order to HAProxy be able direct the traffic to the containers. + +e.g.: + +```bash +docker create network easyhaproxy +``` + +And then run the EasyHAProxy + +```bash +docker run -d \ + --name easy-haproxy-container \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -e EASYHAPROXY_DISCOVER="docker" \ + # + Environment Variables \ + -p 80:80 \ + -p 443:443 \ + -p 1936:1936 \ + --network easyhaproxy + byjg/easy-haproxy +``` + +The mapping to `/var/run/docker.sock` is necessary to discover the docker containers and get the labels; + +## Running containers + +To make your containers "discoverable" by EasyHAProxy that is minimum configuration you need: + +```bash +docker run -d \ + -e easyhaproxy.http.host=example.org \ + -e easyhaproxy.http.port=80 \ + -e easyhaproxy.http.localport=8080 \ + --network easyhaproxy + my/image:tag +``` + +Once the container is running EasyHAProxy will detect automatically and start to redirect all traffic from `example.org:80` to your container. + +You don't need to expose any port in your container. + +There a list of other parameters you can to configure your container. Please follow the [docker label configuration](container-labels.md) + +## Setup the EasyHAProxy container + +You can configure the behavior of the EasyHAProxy by setup specific environment variables. To get a list of the variables please follow the [docker container environment](docker-environment.md) + + +## Setup certificates with Letsencrypt + +Follow [this link](letsencrypt.md) + +## Setup your own certificates + +Follow [this link](ssl.md) + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/kubernetes.md b/docs/kubernetes.md new file mode 100644 index 0000000..143ca49 --- /dev/null +++ b/docs/kubernetes.md @@ -0,0 +1,141 @@ +# Kubernetes + +## Setup Kubernetes EasyHAProxy + +EasyHAProxy is a Daemonset and it will query all ingress definitions with the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. + +Once find the annotation, it will immediatelly setup HAProxy and start to serve it. + +To install the daemonset in your cluster follow these steps: + +1. Identify the node where your EasyHAProxy container will run. + +EasyHAProxy is a daemonset but it will be limited to a single node. To understand that see [limitations](limitations.md) page. + +```bash +$ kubectl get nodes + +NAME STATUS ROLES AGE VERSION +node-01 Ready 561d v1.21.13-3 +node-02 Ready 561d v1.21.13-3 +``` + +2. Add the EasyHAProxy label to the node + +```bash +kubectl label nodes node-01 "easyhaproxy/node=master" +``` + +3. Install EasyHAProxy + +```bash +kubectl apply -f \ + https://raw.githubusercontent.com/haproxytech/kubernetes-ingress/master/deploy/haproxy-ingress-daemonset.yaml +``` + +You can configure the behavior of the EasyHAProxy by setup specific environment variables. To get a list of the variables please follow the [docker container environment](docker-environment.md) + +## Running containers + +The only requirement is that you have an ingress properly setup and with the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. + +e.g. + +```yaml +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: example-ingress + namespace: example +spec: + rules: + - host: example.org + http: + paths: + - backend: + service: + name: example-service + port: + number: 8080 + pathType: ImplementationSpecific +``` + +Once the container is running EasyHAProxy will detect automatically and start to redirect all traffic from `example.org:80` to your container. + +You don't need to expose any port in your container. + +Caveats: + +- At this point, the implementation don't support all ingress properties nor wildcard domains. +- The ingress will publish externally only the ports 80 and 443, plus 1936 if stats is enable. +- EasyHAProxy will read all `spec.rules[].host` spec, however it will parse only the first path `spec.rules[].http.paths[0].port.number` for each rule, and ignore the other paths. + +## Kubernetes annotations + +| annotation | Description | Default | Example | +|-----------------------------|-----------------------------------------------------------------------------------------|--------------|--------------| +| kubernetes.io/ingress.class | (required) Activate EasyHAProxy. | **required** | easyhaproxy-ingress +| easyhaproxy.redirect_ssl | (optional) Boolean. Force redirect all endpoints to https. | false | true or false +| easyhaproxy.letsencrypt | (optional) Boolean. It will request letsencript certificates for the ingresses domains. | false | true or false +| easyhaproxy.redirect | (optional) Json. Specific a domain and its destination. | *empty* | {"domain":"redirect_url"} +| easyhaproxy.mode | (optional) Set the HTTP mode for that connection. | http | http or tcp + +**Important**: The annotations are per ingress and applied to all hosts in that ingress configuration. + +## Letsencrypt + +It is necessary add the annotation `easyhaproxy.letsencrypt` to the ingress configuration: + +```yaml +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + easyhaproxy.letsencrypt: 'true' + name: example-ingress + namespace: example +spec: + .... +``` + +Make sure your cluster is accessible both through ports 80 and 443. + +## Custom SSL Certificates + +You need to create a secret with your certificate and key, and associate them in your ingress. + +```yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: host2-tls + namespace: default +data: + tls.crt: base64 of your certificate + tls.key: base64 of your certificate private key +type: kubernetes.io/tls + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: tls-example + namespace: default +spec: + tls: + - hosts: + - host2.local + secretName: host2-tls + rules: + ... +``` + + + + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/letsencrypt.md b/docs/letsencrypt.md new file mode 100644 index 0000000..6dfcc38 --- /dev/null +++ b/docs/letsencrypt.md @@ -0,0 +1,52 @@ +# Letsencrypt + +EasyHAProxy can issue a letsencrypt certificate. The command is as below: + +Run the EasyHAProxy: + +```bash +docker run \ + -e EASYHAPROXY_LETSENCRYPT_EMAIL=john@doe.com + .... \ + byjg/easy-haproxy +``` + +Run your container: + +```bash +docker run \ + -l easyhaproxy.express.port=80 \ + -l easyhaproxy.express.localport=3000 \ + -l easyhaproxy.express.host=example.org \ + -l easyhaproxy.express.letsencrypt=true \ + .... \ + some/myimage +``` + +Requirements: + +- Your container **must** listen to the port 80. Besides no error, the certificate won't be issued if in a different port. +- You cannot set the port 443 for the container with the Letsencrypt because EasyHAProxy will handle this automatically once the certificate is issued. +- You have to setup the `EASYHAPROXY_LETSENCRYPT_EMAIL` environment variable on EasyHAProxy. If you don't setup, EasyHAProxy **will not request** a certificate. + +Be aware of Letsencrypt issue limits - https://letsencrypt.org/docs/duplicate-certificate-limit/ and https://letsencrypt.org/docs/rate-limits/ + +## Persist your Letsencrypt certificates + +It is a good idea to store the letsencrypt certificate in a persistent storage, even you knowing you can issue again in case your lost the certificate. + +However, there is a limit in how many certificates can be issue for the same domain in a period of time. + +To avoid this, map the folder `/certs/letsencrypt` to a docker volume. + +```bash +docker volume create certs_letsencrypt + +docker run \ + /* other parameters */ + -v certs_letsencrypt:/certs/letsencrypt \ + -d byjg/easy-haproxy +``` + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/limitations.md b/docs/limitations.md new file mode 100644 index 0000000..3f64701 --- /dev/null +++ b/docs/limitations.md @@ -0,0 +1,16 @@ +# Limitations + +EasyHAProxy currently expects to work in a single replica. + +If more than one replica is running, EasyHAProxy will continue to work, however each replica will discover +the services independently. + +It means replicas can be out-of-sync for a few seconds because each replica will discover the pods +separately. + +For Letsencrypt this is worse because each replica will a Letsencrypt certificate and can fail because the +letsencrypt challenge can be directed to the other replica. Also, you can hit the certificate issue limit. +So if you intend to run multiple replicas **do not** activate letsencrypt. + +---- +[Open source ByJG](http://opensource.byjg.com) \ No newline at end of file diff --git a/docs/logo.xcf b/docs/logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..ab58b088fbb94198ef6fa61890deb1534bb7054c GIT binary patch literal 995246 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

+C?`xuNB=w?y9-t@ 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 z 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 we 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%0AddzkQE$9X9?P2l> zjXKx~#jl=fV)w301=;9she%Ss_==J@+S|$_8}{Q1wy`SA7LP_?q>yDDReNI72Cx?o zYk@~qI}(3BOg*(JiejIPg@MhPhCDxpv*_jHw9^}AfWN}68Pgc#GJSP<@n4UxpWZMZ z)M}TeOcPV#6+Ct0A_OiO-*&Qr(MYxon#eQ%2<8W$NpNJ)d(@5JfSN6Bf*{xTs2j$D zs$y}qc^NFDXcP>9dwQTrF1QI zWEl~HYB@XlTiv1ymK$NIVQ~+!dG=0NEJJJ_PRSKfz^z>;3b-|PbTX$OsXhHz;y)d? zg8*FE2IlyMJ!9dB*geASrXM?;%=)P*|1>Jrh;Vkn16qU!g0B){&`M z-_a3!EMS%M*_?1~Y}S&Gbmp&H<1{9tG`S^~Kk3{c%IS=2J%R^u(+Z2EeE4%-D=nQ0 zM8{EaS*>wRrxOXVxf-W6V~Lxx!33q4Ji2U)P(1@&32Vo;6sXsna!K3KWn;J&II9_p zwZ=viV*QjZ4W0OG4uH?(YwL(#qeD|_*d4kCpM$HGK=YCLsVhSID3~1ASd#|qy{(P4 z<7bHNqb6}uH(cSdBejJah4q=bS*KR(UimAz^xI}GIkC3qb^wA2rUbyasz2@9g3Jf$#^Z58csTXc~Yw5^H`pY6(kaM8F-u(YhZ_cMT=hK_>Y0mjS zIp;{B)Se;+UA6vH8sg>=V`GHPh_B%esi4NKK9O2W6+^QbElz=&JnwMI!s=ey!WE0oQkLqa4l{jh_8dT#oqd(pu7si2H-UYR@LK5E2eKcmz9@~ARi+Z z23x@5(TX|U>gdzyPv4YQg4l=yNOO}!5Vx#3nfByW3Bvxd_z5iM?Vuf8b>!+JQ)8QO z%^2=0RFu|oukzlXMSKUEaM<6_6U0|R+hcG4QOGw*0^Crea}jFS&)9fQqczoTgJ?LT zb(|GfV&t~0J5^ghKz49i41lI}mscOV_SjT^GY;s}?tn0XStw z!OtM(wBM_GU@B1xA{Pjn?u)Ilw@r<7BpOZ(Dm9*1cZPo&DAEyOc-$c{K3j3*+LPD( z!*JrD%_A@vW&XPo@1fgx7A+BxXLO*dH$b-&Y>Hp8J-6ENwYDZ|VvdKmR51K8=?VXL-X`5R3pVcHwEw?|k>#6RlnjG8YWo zt$y^He||*d#(^(p&AFR@@a^k>C_oFUqo~WilqYy7XkQ1;$SeWZy3Mh7UKCReIR3lY zD=V(-<%(l9op9xhn+>3ZQ!Dr$xN;oMQYyQ#`czF5Jh`%dJCx`j4NiBiEYbT!*6)S% z&Ufc@IP`?DtawcB$)9 z?yfwQ{VvahZ3z!v)t2_8&7tdg{1ZfJE7x7TOOKdu!t*}AUd?$+&j%^7t7C4NdX9Q3 z!}laVc~g^eZ`IkG&+$?j!B+lFZKd5gXGG$a=H}2c`rHY_`g#Ib&I$2#PafXYT)nh! z=_qWrzROVmU^Tc%uOR)65C z(+F{sP-I>D`E4@?A%0JS6v2eeXX2FDhT2eDMqjIVcmmZ>v-)JLQm7KD8=$It z*UoKU`1PyBVLfrx4U`SPRZ6I3b$cL}fyRZZy+ zFU)ppj~Ki%k>!M6kf>H6V2;x2WB|L8JIlshR;txXrRr*O zuK33gt!|9t)V

bMrHHti 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�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 FKL9CQAu|8~ literal 0 HcmV?d00001 diff --git a/docs/other.md b/docs/other.md new file mode 100644 index 0000000..5f93002 --- /dev/null +++ b/docs/other.md @@ -0,0 +1,39 @@ +# Other configurations + +## Exposing Ports + +You must expose some ports on the EasyHAProxy container and in the firewall. However, you don't need to expose the other container ports because EasyHAProxy will handle that. + +- The ports `80` and `443`. +- If you enable the HAProxy statistics, you must also expose the port defined in `HAPROXY_STATS_PORT` environment variable (default 1936). Be aware that statististics are enabled by default with no password. +- Every port defined in `easyhaproxy.[definitions].port` also should be exposed. + +e.g. + +```bash +docker run \ + /* other parameters */ + -p 80:80 \ + -p 443:443 \ + -p 1936:1936 \ + -d byjg/easy-haproxy +``` + +## Mapping custom .cfg files + +You can concatenate valid HAProxy `.cfg` files to the dynamically generated `haproxy.cfg` by mapping the folder `/etc/haproxy/conf.d`. + +```bash +docker run \ + /* other parameters */ + -v /your/local/conf.d:/etc/haproxy/conf.d \ + -d byjg/easy-haproxy +``` + +## Setting Custom Errors + +If enabled, map the volume : `/etc/haproxy/errors-custom/` to your container and put a file named `ERROR_NUMBER.http` +where ERROR_NUMBER is the HTTP error code (e.g., `503.http`) + +---- +[Open source ByJG](http://opensource.byjg.com) \ No newline at end of file diff --git a/docs/ssl.md b/docs/ssl.md new file mode 100644 index 0000000..9baffd3 --- /dev/null +++ b/docs/ssl.md @@ -0,0 +1,75 @@ +# Setup your own certificates + +You can use your certificates with EasyHAProxy. + +There is two ways to do that. + +## Setup certificate as a label definition in docker container + +1. First, Create a single PEM from the certificate and the key. + +```bash +cat example.com.crt example.com.key > single.pem + +cat single.pem + +-----BEGIN CERTIFICATE----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5ZheHqmBnEJP+ +U9r1gxYWKLzdqrMrcxtQN6M1hIH9n0peuJeIrybdcV7sMbStMXI= +-----END CERTIFICATE----- + +-----BEGIN PRIVATE KEY----- +MIIEojCCA4qgAwIBAgIUegW2BimwuL4RzRZ2WYkHA6U5nkAwDQYJKoZIhvcNAQEL +3j4wz8/I5fdsk090j4s5KA== +-----END PRIVATE KEY----- +``` + +2. Convert the `single.pem` to BASE64 in a single line: + +```bash +cat single.pem | base64 -w0 +``` + +3. Use this string to define the label `easyhaproxy.[definition].sslcert` + +## Map the certificate as docker volume + +EasyHAProxy stores the certificates inside the folder `/certs/haproxy`. + +1. Run EasyHAProxy with the volume for the certificates: + +```bash +docker volume create certs_haproxy + +docker run \ + /* other parameters */ + -v certs_haproxy:/certs/haproxy \ + -d byjg/easy-haproxy +``` + +2. Create a single PEM from the certificate and the key. + +```bash +cat example.com.crt example.com.key > single.pem + +cat single.pem + +-----BEGIN CERTIFICATE----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5ZheHqmBnEJP+ +U9r1gxYWKLzdqrMrcxtQN6M1hIH9n0peuJeIrybdcV7sMbStMXI= +-----END CERTIFICATE----- + +-----BEGIN PRIVATE KEY----- +MIIEojCCA4qgAwIBAgIUegW2BimwuL4RzRZ2WYkHA6U5nkAwDQYJKoZIhvcNAQEL +3j4wz8/I5fdsk090j4s5KA== +-----END PRIVATE KEY----- +``` + +3. Copy this certificate to EasyHAProxy volume + +```bash +docker cp single.pem easyhaproxy:/certs/haproxy +``` + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/static.md b/docs/static.md new file mode 100644 index 0000000..8506234 --- /dev/null +++ b/docs/static.md @@ -0,0 +1,109 @@ +# Docker + +## Setup Docker EasyHAProxy + +This method will use a static configuration, simpler and easier than HAProxy to create the `haproxy.cfg` + +You can use this configuration to setup external servers not related to docker or kubernetes. + +Another advantage is that EasyHAProxy will monitor for changes in this file and automatically reconfigure HAProxy and changes are detected. + +First, Create a YAML: + +```yaml +stats: + username: admin + password: password + port: 1936 # Optional (default 1936) + +customerrors: true # Optional (default false) + +ssl_mode: default + +letsencrypt: { + "email": "acme@example.org" +} + +easymapping: + - port: 80 + hosts: + host1.com.br: + containers: + - container:5000 + letsencrypt: true + redirect_ssl: true + host2.com.br: + containers: + - other:3000 + redirect: + www.host1.com.br: http://host1.com.br + + - port: 443 + hosts: + host1.com.br: + containers: + - container:80 + redirect_ssl: false + ssl: true + + - port: 8080 + hosts: + host3.com.br: + containers: + - domain:8181 +``` + +Then map this file to `/etc/haproxy/easyconfig.yml` in your EasyHAProxy container as: + +```bash +docker run -d \ + --name easy-haproxy-container \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /my/config.yml:/etc/haproxy/easyconfig.yml + -e EASYHAPROXY_DISCOVER="static" \ + # + Environment Variables \ + -p 80:80 \ + -p 443:443 \ + -p 1936:1936 \ + --network easyhaproxy + byjg/easy-haproxy +``` + +You can find other informations on [docker label configuration](container-labels.md) and [docker container environment](docker-environment.md) + +## Yaml Definition + +```yaml +stats: + username: admin # Optional (default "admin") + password: password # If stats or stats.password is omitted, stats will be public with no password + port: 1936 # Optional (default 1936) + +customerrors: true # Optional (default false) + +ssl_mode: default # Optional + +letsencrypt: { # Optional. If you enable `letsencrypt` will need to setu0p this, + # otherwise the certificate will be issued + "email": "acme@example.org" +} + +easymapping: + - port: 80 # Listen port + mode: http # Optional. Default `http`. Can be http or tcp + hosts: + host1.com.br: # Hostname + containers: + - container:5000 # Endpoints of the hostname above (ip, dns, container, etc) + letsencrypt: true # Optional. it will request a letsencrypt certiticate + redirect_ssl: true # Optional. It will redirect this site to it SSL. + ssl: true # Optional. Inform this port will listen to SSL, instead of HTTP + clone_to_ssl: true # Optional. Default False. You clone these hosts to it equivalent SSL. + redirect: + www.host1.com.br: http://host1.com.br +``` + +*Note*: The only way to pass SSL certificates is to map the certificates to EasyHAProxy as a docker volume. Refer to the [SSL documentation](ssl.md) to learn how to do it. + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/swarm.md b/docs/swarm.md new file mode 100644 index 0000000..9d26245 --- /dev/null +++ b/docs/swarm.md @@ -0,0 +1,96 @@ +# Swarm + +## Setup Docker EasyHAProxy + +This method will use a docker swarm installation to discover the containers and configure the HAProxy. +The advantage of this method is that you can discover container in other nodes from cluster. + +The only requirement is that containers and EasyHAProxy must be in the same docker swarm network in order to HAProxy be able direct the traffic to the containers. + +e.g.: + +```bash +docker create network easyhaproxy +``` + +And then deploy the EasyHAProxy stack: + +```yaml +version: "3" + +services: + haproxy: + image: byjg/easy-haproxy + volumes: + - /var/run/docker.sock:/var/run/docker.sock + deploy: + replicas: 1 + environment: + EASYHAPROXY_DISCOVER: swarm + EASYHAPROXY_SSL_MODE: "loose" + HAPROXY_CUSTOMERRORS: "true" + HAPROXY_USERNAME: admin + HAPROXY_PASSWORD: password + HAPROXY_STATS_PORT: 1936 + ports: + - "80:80/tcp" + - "443:443/tcp" + - "1936:1936/tcp" + networks: + - easyhaproxy + +networks: + easyhaproxy: + external: true +``` + +and then: + +```bash +docker stack deploy --compose-file docker-compose.yml easyhaproxy +``` + +The mapping to `/var/run/docker.sock` is necessary to discover the docker containers and get the labels; + +**Do not** add more than one replica for EasyHAProxy. To understand that see [limitations](limitations.md) page. + +## Running containers + +To make your containers "discoverable" by EasyHAProxy that is minimum configuration you need: + +```yaml +version: "3" + +services: + container: + image: my/image:tag + deploy: + replicas: 1 + labels: + easyhaproxy.http.host: host1.local + easyhaproxy.http.port: 80 + easyhaproxy.http.localport: 8080 + networks: + - easyhaproxy + +networks: + easyhaproxy: + external: true +``` + +Once the container is running EasyHAProxy will detect automatically and start to redirect all traffic from `example.org:80` to your container. + +You don't need to expose any port in your container. + +There a list of other parameters you can to configure your container. Please follow the [docker label configuration](container-labels.md) + +## Setup the EasyHAProxy container + +You can configure the behavior of the EasyHAProxy by setup specific environment variables. To get a list of the variables please follow the [docker container environment](docker-environment.md) + +## More information + +You can refer the [Docker Documentation](docker.md) to get other detailed instructions. + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/kubernetes.png b/kubernetes.png new file mode 100644 index 0000000000000000000000000000000000000000..c78d3279894dc2f110adbf46146437693e183fe3 GIT binary patch literal 14420 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 literal 0 HcmV?d00001 From e8aa05512a5a1921fdb1a6e1cb44384d13924528 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Fri, 26 Aug 2022 20:22:15 -0500 Subject: [PATCH 33/45] More adjusts in the documentation --- .github/workflows/build.yml | 2 +- README.md | 6 +++--- docs/icons.xcf | Bin 0 -> 384777 bytes docker.png => easyhaproxy_docker.png | Bin kubernetes.png => easyhaproxy_kubernetes.png | Bin logo.png => easyhaproxy_logo.png | Bin static.png => easyhaproxy_static.png | Bin swarm.png => easyhaproxy_swarm.png | Bin 8 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 docs/icons.xcf rename docker.png => easyhaproxy_docker.png (100%) rename kubernetes.png => easyhaproxy_kubernetes.png (100%) rename logo.png => easyhaproxy_logo.png (100%) rename static.png => easyhaproxy_static.png (100%) rename swarm.png => easyhaproxy_swarm.png (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b02c742..29d6f73 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -115,4 +115,4 @@ jobs: DOC_GITHUB_TOKEN: '${{ secrets.DOC_TOKEN }}' steps: - uses: actions/checkout@v2 - - run: curl https://opensource.byjg.com/add-doc.sh | bash /dev/stdin devops docker-easy-haproxy + - run: curl https://opensource.byjg.com/add-doc.sh | bash /dev/stdin devops docker-easy-haproxy docs diff --git a/README.md b/README.md index 33c62f5..23cdd36 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub license](https://img.shields.io/github/license/byjg/docker-easy-haproxy.svg)](https://opensource.byjg.com/opensource/licensing.html) [![GitHub release](https://img.shields.io/github/release/byjg/docker-easy-haproxy.svg)](https://github.com/byjg/docker-easy-haproxy/releases/) -![EasyHAProxy](logo.png) +![EasyHAProxy](easyhaproxy_logo.png) ## Service discovery for HAProxy @@ -45,8 +45,8 @@ automatically detect them and setup HAProxy for you. For detailed instructions on how to use EasyHAProxy follow the instructions for the platform you want to use: | Kubernetes | Docker Swarm | Docker | Static -|------------|--------------|--------|--------- -| [![Kubernetes](kubernetes.png)](docs/kubernetes.md) | [![Docker Swarm](swarm.png)](docs/swarm.md) | [![Docker](docker.png)](docs/docker.md) | [![Static](static.png)](docs/static.md) +|:----------:|:------------:|:------:|:-------: +| [![Kubernetes](easyhaproxy_kubernetes.png)](docs/kubernetes.md) | [![Docker Swarm](easyhaproxy_swarm.png)](docs/swarm.md) | [![Docker](easyhaproxy_docker.png)](docs/docker.md) | [![Static](easyhaproxy_static.png)](docs/static.md) ---- diff --git a/docs/icons.xcf b/docs/icons.xcf new file mode 100644 index 0000000000000000000000000000000000000000..dda11612a247f050d3504b71fa0f1eb695cebb83 GIT binary patch literal 384777 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 Irme7$@4Rqf8ox= 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 lD|UtVMjH)betnCZ%AtI8mxL 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�Z2F~;Z==pTmK|0 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 Date: Sat, 27 Aug 2022 14:34:55 -0500 Subject: [PATCH 34/45] Add helm package --- deploy/kubernetes/easyhaproxy.yml | 132 +++++++++++------- helm/easyhaproxy-ingress/.helmignore | 23 +++ helm/easyhaproxy-ingress/Chart.yaml | 24 ++++ .../templates/_helpers.tpl | 62 ++++++++ .../templates/clusterrole.yaml | 66 +++++++++ .../templates/clusterrolebinding.yaml | 20 +++ .../templates/deployment.yaml | 65 +++++++++ .../templates/serviceaccount.yaml | 12 ++ helm/easyhaproxy-ingress/values.yaml | 65 +++++++++ 9 files changed, 415 insertions(+), 54 deletions(-) create mode 100644 helm/easyhaproxy-ingress/.helmignore create mode 100644 helm/easyhaproxy-ingress/Chart.yaml create mode 100644 helm/easyhaproxy-ingress/templates/_helpers.tpl create mode 100644 helm/easyhaproxy-ingress/templates/clusterrole.yaml create mode 100644 helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml create mode 100644 helm/easyhaproxy-ingress/templates/deployment.yaml create mode 100644 helm/easyhaproxy-ingress/templates/serviceaccount.yaml create mode 100644 helm/easyhaproxy-ingress/values.yaml diff --git a/deploy/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy.yml index cec1d40..cedfdfb 100644 --- a/deploy/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy.yml @@ -1,21 +1,27 @@ --- -apiVersion: v1 -kind: Namespace -metadata: - name: easyhaproxy - ---- +# Source: easyhaproxy-ingress/templates/serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata: - name: easyhaproxy-ingress - namespace: easyhaproxy - + name: manual-easyhaproxy-ingress + labels: + helm.sh/chart: easyhaproxy-ingress-0.1.0 + app.kubernetes.io/name: easyhaproxy-ingress + app.kubernetes.io/instance: manual + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm --- +# Source: easyhaproxy-ingress/templates/clusterrole.yaml kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: easyhaproxy-ingress + name: manual-easyhaproxy-ingress + labels: + helm.sh/chart: easyhaproxy-ingress-0.1.0 + app.kubernetes.io/name: easyhaproxy-ingress + app.kubernetes.io/instance: manual + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm rules: - apiGroups: - "" @@ -69,36 +75,47 @@ rules: # - get # - list # - watch - --- +# Source: easyhaproxy-ingress/templates/clusterrolebinding.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: easyhaproxy-ingress - namespace: easyhaproxy + name: manual-easyhaproxy-ingress + labels: + helm.sh/chart: easyhaproxy-ingress-0.1.0 + app.kubernetes.io/name: easyhaproxy-ingress + app.kubernetes.io/instance: manual + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: easyhaproxy-ingress + name: manual-easyhaproxy-ingress subjects: - kind: ServiceAccount - name: easyhaproxy-ingress - namespace: easyhaproxy - + name: manual-easyhaproxy-ingress --- +# Source: easyhaproxy-ingress/templates/deployment.yaml apiVersion: apps/v1 kind: DaemonSet metadata: - name: easyhaproxy-ingress - namespace: easyhaproxy + name: manual-easyhaproxy-ingress + labels: + helm.sh/chart: easyhaproxy-ingress-0.1.0 + app.kubernetes.io/name: easyhaproxy-ingress + app.kubernetes.io/instance: manual + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm spec: selector: matchLabels: - app: easyhaproxy-ingress + app.kubernetes.io/name: easyhaproxy-ingress + app.kubernetes.io/instance: manual template: metadata: labels: - app: easyhaproxy-ingress + app.kubernetes.io/name: easyhaproxy-ingress + app.kubernetes.io/instance: manual spec: affinity: nodeAffinity: @@ -108,37 +125,44 @@ spec: - key: easyhaproxy/node operator: In values: - - master - serviceAccountName: easyhaproxy-ingress + - master + serviceAccountName: manual-easyhaproxy-ingress + securityContext: + {} containers: - - image: byjg/easy-haproxy:test - imagePullPolicy: Always - name: easyhaproxy-ingress - ports: - - name: http - containerPort: 80 - hostPort: 80 - - name: https - containerPort: 443 - hostPort: 443 - - name: stats - containerPort: 1936 - hostPort: 1936 - resources: - requests: - cpu: "100m" - memory: "128Mi" - - env: - - name: EASYHAPROXY_DISCOVER - value: kubernetes - - name: HAPROXY_USERNAME - value: admin - - name: HAPROXY_PASSWORD - value: password - - name: EASYHAPROXY_REFRESH_CONF - value: "10" - - name: HAPROXY_CUSTOMERRORS - value: "true" - - name: EASYHAPROXY_SSL_MODE - value: loose + - name: easyhaproxy-ingress + securityContext: + {} + image: "byjg/easy-haproxy:test" + imagePullPolicy: Always + ports: + - name: http + containerPort: 80 + hostPort: 80 + - name: https + containerPort: 443 + hostPort: 443 + - name: stats + containerPort: 1936 + hostPort: 1936 + resources: + {} + env: + - name: EASYHAPROXY_DISCOVER + value: kubernetes + - name: HAPROXY_USERNAME + value: admin + - name: HAPROXY_PASSWORD + value: password + - name: EASYHAPROXY_REFRESH_CONF + value: "10" + - name: HAPROXY_CUSTOMERRORS + value: "true" + - name: EASYHAPROXY_SSL_MODE + value: loose + - name: EASYHAPROXY_LOG_LEVEL + value: DEBUG + - name: HAPROXY_LOG_LEVEL + value: DEBUG + - name: CERTBOT_LOG_LEVEL + value: DEBUG \ No newline at end of file diff --git a/helm/easyhaproxy-ingress/.helmignore b/helm/easyhaproxy-ingress/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/helm/easyhaproxy-ingress/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/easyhaproxy-ingress/Chart.yaml b/helm/easyhaproxy-ingress/Chart.yaml new file mode 100644 index 0000000..fbfb95c --- /dev/null +++ b/helm/easyhaproxy-ingress/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: easyhaproxy-ingress +description: "EasyHAProxy - A service discovery backed on HAProxy" + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "test" diff --git a/helm/easyhaproxy-ingress/templates/_helpers.tpl b/helm/easyhaproxy-ingress/templates/_helpers.tpl new file mode 100644 index 0000000..3e9c496 --- /dev/null +++ b/helm/easyhaproxy-ingress/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "easyhaproxy-ingress.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "easyhaproxy-ingress.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "easyhaproxy-ingress.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "easyhaproxy-ingress.labels" -}} +helm.sh/chart: {{ include "easyhaproxy-ingress.chart" . }} +{{ include "easyhaproxy-ingress.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "easyhaproxy-ingress.selectorLabels" -}} +app.kubernetes.io/name: {{ include "easyhaproxy-ingress.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "easyhaproxy-ingress.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "easyhaproxy-ingress.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/helm/easyhaproxy-ingress/templates/clusterrole.yaml b/helm/easyhaproxy-ingress/templates/clusterrole.yaml new file mode 100644 index 0000000..05a42d4 --- /dev/null +++ b/helm/easyhaproxy-ingress/templates/clusterrole.yaml @@ -0,0 +1,66 @@ +{{- if .Values.serviceAccount.create -}} +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "easyhaproxy-ingress.fullname" . }} + labels: + {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +rules: +- apiGroups: + - "" + resources: + # - configmaps + # - endpoints + # - nodes + - pods + - services + - namespaces + # - events + - serviceaccounts + verbs: + - get + - list + - watch +- apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses + # - ingresses/status + # - ingressclasses + verbs: + - get + - list + - watch +# - apiGroups: +# - "extensions" +# - "networking.k8s.io" +# resources: +# - ingresses/status +# verbs: +# - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + # - watch + # - create + # - patch + # - update +# - apiGroups: +# - "discovery.k8s.io" +# resources: +# - endpointslices +# verbs: +# - get +# - list +# - watch +{{- end }} \ No newline at end of file diff --git a/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml b/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml new file mode 100644 index 0000000..9678a9b --- /dev/null +++ b/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml @@ -0,0 +1,20 @@ +{{- if .Values.serviceAccount.create -}} +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "easyhaproxy-ingress.fullname" . }} + labels: + {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "easyhaproxy-ingress.fullname" . }} +subjects: +- kind: ServiceAccount + name: {{ include "easyhaproxy-ingress.serviceAccountName" . }} +{{- end }} diff --git a/helm/easyhaproxy-ingress/templates/deployment.yaml b/helm/easyhaproxy-ingress/templates/deployment.yaml new file mode 100644 index 0000000..9df1e67 --- /dev/null +++ b/helm/easyhaproxy-ingress/templates/deployment.yaml @@ -0,0 +1,65 @@ +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "easyhaproxy-ingress.fullname" . }} + labels: + {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{- include "easyhaproxy-ingress.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "easyhaproxy-ingress.selectorLabels" . | nindent 8 }} + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .Values.masterNode.label }} + operator: In + values: + {{- toYaml .Values.masterNode.values | nindent 18 }} + serviceAccountName: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 80 + hostPort: 80 + - name: https + containerPort: 443 + hostPort: 443 + - name: stats + containerPort: 1936 + hostPort: 1936 + resources: + {{- toYaml .Values.resources | nindent 12 }} + env: + - name: EASYHAPROXY_DISCOVER + value: kubernetes + - name: HAPROXY_USERNAME + value: {{ .Values.easyhaproxy.stats.username }} + - name: HAPROXY_PASSWORD + value: {{ .Values.easyhaproxy.stats.password }} + - name: EASYHAPROXY_REFRESH_CONF + value: {{ .Values.easyhaproxy.refresh | quote }} + - name: HAPROXY_CUSTOMERRORS + value: {{ .Values.easyhaproxy.customErrors | quote}} + - name: EASYHAPROXY_SSL_MODE + value: {{ .Values.easyhaproxy.sslMode }} + - name: EASYHAPROXY_LOG_LEVEL + value: {{ .Values.easyhaproxy.logLevel.easyhaproxy }} + - name: HAPROXY_LOG_LEVEL + value: {{ .Values.easyhaproxy.logLevel.haproxy }} + - name: CERTBOT_LOG_LEVEL + value: {{ .Values.easyhaproxy.logLevel.certbot }} diff --git a/helm/easyhaproxy-ingress/templates/serviceaccount.yaml b/helm/easyhaproxy-ingress/templates/serviceaccount.yaml new file mode 100644 index 0000000..fd85feb --- /dev/null +++ b/helm/easyhaproxy-ingress/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + labels: + {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/helm/easyhaproxy-ingress/values.yaml b/helm/easyhaproxy-ingress/values.yaml new file mode 100644 index 0000000..213937f --- /dev/null +++ b/helm/easyhaproxy-ingress/values.yaml @@ -0,0 +1,65 @@ +# Default values for easyhaproxy-ingress. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: byjg/easy-haproxy + pullPolicy: Always # IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + create: true + annotations: {} + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +resources: {} +# requests: +# cpu: "100m" +# memory: "128Mi" +# limits: +# cpu: 100m +# memory: 128Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +easyhaproxy: + stats: + username: admin + password: password + refresh: "10" + customErrors: "true" + sslMode: loose + logLevel: + certbot: DEBUG + easyhaproxy: DEBUG + haproxy: DEBUG + +# Make sure to create this +masterNode: + label: easyhaproxy/node + values: + - master From 4de8361951d92cda47abeea6b6ebbe6006fafd66 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sat, 27 Aug 2022 15:29:01 -0500 Subject: [PATCH 35/45] Add build HELM --- .github/workflows/build.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 29d6f73..dcd3b5d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -107,6 +107,16 @@ jobs: # chmod +x $HOME/.docker/cli-plugins/docker-pushrm # docker pushrm ${{ env.IMAGE_NAME }} + Helm: + runs-on: 'ubuntu-latest' + needs: Build + # if: github.ref == 'refs/heads/master' + env: + DOC_GITHUB_TOKEN: '${{ secrets.DOC_TOKEN }}' + steps: + - uses: actions/checkout@v2 + - run: curl https://opensource.byjg.com/add-helm.sh | bash /dev/stdin helm easyhaproxy-ingress + Documentation: runs-on: 'ubuntu-latest' needs: Build From 7c9da241a36f95dd459bcecd1d01d2d1bf7f8f6a Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sat, 27 Aug 2022 19:52:42 -0500 Subject: [PATCH 36/45] Add missing namespace --- deploy/kubernetes/easyhaproxy.yml | 5 +++++ helm/easyhaproxy-ingress/templates/clusterrole.yaml | 1 + helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml | 2 ++ helm/easyhaproxy-ingress/templates/deployment.yaml | 1 + helm/easyhaproxy-ingress/templates/serviceaccount.yaml | 1 + 5 files changed, 10 insertions(+) diff --git a/deploy/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy.yml index cedfdfb..53e1f19 100644 --- a/deploy/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy.yml @@ -4,6 +4,7 @@ apiVersion: v1 kind: ServiceAccount metadata: name: manual-easyhaproxy-ingress + namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress @@ -16,6 +17,7 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: manual-easyhaproxy-ingress + namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress @@ -81,6 +83,7 @@ kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: manual-easyhaproxy-ingress + namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress @@ -94,12 +97,14 @@ roleRef: subjects: - kind: ServiceAccount name: manual-easyhaproxy-ingress + namespace: easyhaproxy --- # Source: easyhaproxy-ingress/templates/deployment.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: manual-easyhaproxy-ingress + namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress diff --git a/helm/easyhaproxy-ingress/templates/clusterrole.yaml b/helm/easyhaproxy-ingress/templates/clusterrole.yaml index 05a42d4..77aaa1f 100644 --- a/helm/easyhaproxy-ingress/templates/clusterrole.yaml +++ b/helm/easyhaproxy-ingress/templates/clusterrole.yaml @@ -4,6 +4,7 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: {{ include "easyhaproxy-ingress.fullname" . }} + namespace: {{ .Release.Namespace }} labels: {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} {{- with .Values.serviceAccount.annotations }} diff --git a/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml b/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml index 9678a9b..c806403 100644 --- a/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml +++ b/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml @@ -4,6 +4,7 @@ kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: {{ include "easyhaproxy-ingress.fullname" . }} + namespace: {{ .Release.Namespace }} labels: {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} {{- with .Values.serviceAccount.annotations }} @@ -17,4 +18,5 @@ roleRef: subjects: - kind: ServiceAccount name: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} {{- end }} diff --git a/helm/easyhaproxy-ingress/templates/deployment.yaml b/helm/easyhaproxy-ingress/templates/deployment.yaml index 9df1e67..3ef6c3a 100644 --- a/helm/easyhaproxy-ingress/templates/deployment.yaml +++ b/helm/easyhaproxy-ingress/templates/deployment.yaml @@ -3,6 +3,7 @@ apiVersion: apps/v1 kind: DaemonSet metadata: name: {{ include "easyhaproxy-ingress.fullname" . }} + namespace: {{ .Release.Namespace }} labels: {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} spec: diff --git a/helm/easyhaproxy-ingress/templates/serviceaccount.yaml b/helm/easyhaproxy-ingress/templates/serviceaccount.yaml index fd85feb..9d1310e 100644 --- a/helm/easyhaproxy-ingress/templates/serviceaccount.yaml +++ b/helm/easyhaproxy-ingress/templates/serviceaccount.yaml @@ -3,6 +3,7 @@ apiVersion: v1 kind: ServiceAccount metadata: name: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} labels: {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} {{- with .Values.serviceAccount.annotations }} From beb7dfb2231eadd3be5c781d16161d32cd701eb6 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sat, 27 Aug 2022 20:02:55 -0500 Subject: [PATCH 37/45] Fix HELM chart --- deploy/kubernetes/easyhaproxy.yml | 26 ++++++++++---------- docs/kubernetes.md | 40 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/deploy/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy.yml index 53e1f19..64f9630 100644 --- a/deploy/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy.yml @@ -3,12 +3,12 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: manual-easyhaproxy-ingress + name: byjg-easyhaproxy-ingress namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: manual + app.kubernetes.io/instance: byjg app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm --- @@ -16,12 +16,12 @@ metadata: kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: manual-easyhaproxy-ingress + name: byjg-easyhaproxy-ingress namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: manual + app.kubernetes.io/instance: byjg app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm rules: @@ -82,45 +82,45 @@ rules: kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: manual-easyhaproxy-ingress + name: byjg-easyhaproxy-ingress namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: manual + app.kubernetes.io/instance: byjg app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: manual-easyhaproxy-ingress + name: byjg-easyhaproxy-ingress subjects: - kind: ServiceAccount - name: manual-easyhaproxy-ingress + name: byjg-easyhaproxy-ingress namespace: easyhaproxy --- # Source: easyhaproxy-ingress/templates/deployment.yaml apiVersion: apps/v1 kind: DaemonSet metadata: - name: manual-easyhaproxy-ingress + name: byjg-easyhaproxy-ingress namespace: easyhaproxy labels: helm.sh/chart: easyhaproxy-ingress-0.1.0 app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: manual + app.kubernetes.io/instance: byjg app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm spec: selector: matchLabels: app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: manual + app.kubernetes.io/instance: byjg template: metadata: labels: app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: manual + app.kubernetes.io/instance: byjg spec: affinity: nodeAffinity: @@ -131,7 +131,7 @@ spec: operator: In values: - master - serviceAccountName: manual-easyhaproxy-ingress + serviceAccountName: byjg-easyhaproxy-ingress securityContext: {} containers: diff --git a/docs/kubernetes.md b/docs/kubernetes.md index 143ca49..22cc486 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -28,6 +28,10 @@ kubectl label nodes node-01 "easyhaproxy/node=master" 3. Install EasyHAProxy +There are two ways to install EasyHAProxy in a Kubernetes cluster. You can use Kubernetes Manifest or Helm 3. + +3.1. Using Kubernetes Manifest + ```bash kubectl apply -f \ https://raw.githubusercontent.com/haproxytech/kubernetes-ingress/master/deploy/haproxy-ingress-daemonset.yaml @@ -35,6 +39,42 @@ kubectl apply -f \ You can configure the behavior of the EasyHAProxy by setup specific environment variables. To get a list of the variables please follow the [docker container environment](docker-environment.md) +3.2. Using HELM 3 + +Minimal configuration + +```bash +helm repo add byjg https://opensource.byjg.com/helm +helm repo update +kubectl create namespace easyhaproxy +helm upgrade --install byjg byjg/easyhaproxy-ingress \ + --namespace easyhaproxy + --set resources.requests.cpu=100m \ + --set resources.requests.memory=128Mi +``` + +Customizing Helm Values: + +```yaml +easyhaproxy: + stats: + username: admin + password: password + refresh: "10" + customErrors: "true" + sslMode: loose + logLevel: + certbot: DEBUG + easyhaproxy: DEBUG + haproxy: DEBUG + +# Make sure to create this +masterNode: + label: easyhaproxy/node + values: + - master +``` + ## Running containers The only requirement is that you have an ingress properly setup and with the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. From fa49e16454a8c3c90453432da8c5cbeac3b1ce35 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sun, 28 Aug 2022 01:05:04 -0500 Subject: [PATCH 38/45] Rename helm package --- .github/workflows/build.yml | 2 +- docs/kubernetes.md | 4 ++-- helm/{easyhaproxy-ingress => easyhaproxy}/.helmignore | 0 helm/{easyhaproxy-ingress => easyhaproxy}/Chart.yaml | 0 .../templates/_helpers.tpl | 0 .../templates/clusterrole.yaml | 0 .../templates/clusterrolebinding.yaml | 0 .../templates/deployment.yaml | 0 .../templates/serviceaccount.yaml | 0 helm/{easyhaproxy-ingress => easyhaproxy}/values.yaml | 0 10 files changed, 3 insertions(+), 3 deletions(-) rename helm/{easyhaproxy-ingress => easyhaproxy}/.helmignore (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/Chart.yaml (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/templates/_helpers.tpl (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/templates/clusterrole.yaml (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/templates/clusterrolebinding.yaml (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/templates/deployment.yaml (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/templates/serviceaccount.yaml (100%) rename helm/{easyhaproxy-ingress => easyhaproxy}/values.yaml (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dcd3b5d..7991d5f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -115,7 +115,7 @@ jobs: DOC_GITHUB_TOKEN: '${{ secrets.DOC_TOKEN }}' steps: - uses: actions/checkout@v2 - - run: curl https://opensource.byjg.com/add-helm.sh | bash /dev/stdin helm easyhaproxy-ingress + - run: curl https://opensource.byjg.com/add-helm.sh | bash /dev/stdin helm easyhaproxy Documentation: runs-on: 'ubuntu-latest' diff --git a/docs/kubernetes.md b/docs/kubernetes.md index 22cc486..9063a85 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -47,8 +47,8 @@ Minimal configuration helm repo add byjg https://opensource.byjg.com/helm helm repo update kubectl create namespace easyhaproxy -helm upgrade --install byjg byjg/easyhaproxy-ingress \ - --namespace easyhaproxy +helm upgrade --install ingress byjg/easyhaproxy \ + --namespace easyhaproxy \ --set resources.requests.cpu=100m \ --set resources.requests.memory=128Mi ``` diff --git a/helm/easyhaproxy-ingress/.helmignore b/helm/easyhaproxy/.helmignore similarity index 100% rename from helm/easyhaproxy-ingress/.helmignore rename to helm/easyhaproxy/.helmignore diff --git a/helm/easyhaproxy-ingress/Chart.yaml b/helm/easyhaproxy/Chart.yaml similarity index 100% rename from helm/easyhaproxy-ingress/Chart.yaml rename to helm/easyhaproxy/Chart.yaml diff --git a/helm/easyhaproxy-ingress/templates/_helpers.tpl b/helm/easyhaproxy/templates/_helpers.tpl similarity index 100% rename from helm/easyhaproxy-ingress/templates/_helpers.tpl rename to helm/easyhaproxy/templates/_helpers.tpl diff --git a/helm/easyhaproxy-ingress/templates/clusterrole.yaml b/helm/easyhaproxy/templates/clusterrole.yaml similarity index 100% rename from helm/easyhaproxy-ingress/templates/clusterrole.yaml rename to helm/easyhaproxy/templates/clusterrole.yaml diff --git a/helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml b/helm/easyhaproxy/templates/clusterrolebinding.yaml similarity index 100% rename from helm/easyhaproxy-ingress/templates/clusterrolebinding.yaml rename to helm/easyhaproxy/templates/clusterrolebinding.yaml diff --git a/helm/easyhaproxy-ingress/templates/deployment.yaml b/helm/easyhaproxy/templates/deployment.yaml similarity index 100% rename from helm/easyhaproxy-ingress/templates/deployment.yaml rename to helm/easyhaproxy/templates/deployment.yaml diff --git a/helm/easyhaproxy-ingress/templates/serviceaccount.yaml b/helm/easyhaproxy/templates/serviceaccount.yaml similarity index 100% rename from helm/easyhaproxy-ingress/templates/serviceaccount.yaml rename to helm/easyhaproxy/templates/serviceaccount.yaml diff --git a/helm/easyhaproxy-ingress/values.yaml b/helm/easyhaproxy/values.yaml similarity index 100% rename from helm/easyhaproxy-ingress/values.yaml rename to helm/easyhaproxy/values.yaml From b01ec6a09aa6ca623a23ccc09c31e07c8381d57e Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sun, 28 Aug 2022 01:18:23 -0500 Subject: [PATCH 39/45] Renaming HELM Package --- deploy/kubernetes/easyhaproxy.yml | 56 +++++++++---------- helm/easyhaproxy/Chart.yaml | 2 +- helm/easyhaproxy/templates/_helpers.tpl | 20 +++---- helm/easyhaproxy/templates/clusterrole.yaml | 4 +- .../templates/clusterrolebinding.yaml | 8 +-- helm/easyhaproxy/templates/deployment.yaml | 10 ++-- .../easyhaproxy/templates/serviceaccount.yaml | 4 +- helm/easyhaproxy/values.yaml | 2 +- 8 files changed, 53 insertions(+), 53 deletions(-) diff --git a/deploy/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy.yml index 64f9630..f44626d 100644 --- a/deploy/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy.yml @@ -1,27 +1,27 @@ --- -# Source: easyhaproxy-ingress/templates/serviceaccount.yaml +# Source: easyhaproxy/templates/serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata: - name: byjg-easyhaproxy-ingress + name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-ingress-0.1.0 - app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: byjg + helm.sh/chart: easyhaproxy-0.1.0 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm --- -# Source: easyhaproxy-ingress/templates/clusterrole.yaml +# Source: easyhaproxy/templates/clusterrole.yaml kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: byjg-easyhaproxy-ingress + name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-ingress-0.1.0 - app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: byjg + helm.sh/chart: easyhaproxy-0.1.0 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm rules: @@ -78,49 +78,49 @@ rules: # - list # - watch --- -# Source: easyhaproxy-ingress/templates/clusterrolebinding.yaml +# Source: easyhaproxy/templates/clusterrolebinding.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: byjg-easyhaproxy-ingress + name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-ingress-0.1.0 - app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: byjg + helm.sh/chart: easyhaproxy-0.1.0 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: byjg-easyhaproxy-ingress + name: ingress-easyhaproxy subjects: - kind: ServiceAccount - name: byjg-easyhaproxy-ingress + name: ingress-easyhaproxy namespace: easyhaproxy --- -# Source: easyhaproxy-ingress/templates/deployment.yaml +# Source: easyhaproxy/templates/deployment.yaml apiVersion: apps/v1 kind: DaemonSet metadata: - name: byjg-easyhaproxy-ingress + name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-ingress-0.1.0 - app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: byjg + helm.sh/chart: easyhaproxy-0.1.0 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" app.kubernetes.io/managed-by: Helm spec: selector: matchLabels: - app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: byjg + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress template: metadata: labels: - app.kubernetes.io/name: easyhaproxy-ingress - app.kubernetes.io/instance: byjg + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress spec: affinity: nodeAffinity: @@ -131,11 +131,11 @@ spec: operator: In values: - master - serviceAccountName: byjg-easyhaproxy-ingress + serviceAccountName: ingress-easyhaproxy securityContext: {} containers: - - name: easyhaproxy-ingress + - name: easyhaproxy securityContext: {} image: "byjg/easy-haproxy:test" diff --git a/helm/easyhaproxy/Chart.yaml b/helm/easyhaproxy/Chart.yaml index fbfb95c..7bc7817 100644 --- a/helm/easyhaproxy/Chart.yaml +++ b/helm/easyhaproxy/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -name: easyhaproxy-ingress +name: easyhaproxy description: "EasyHAProxy - A service discovery backed on HAProxy" # A chart can be either an 'application' or a 'library' chart. diff --git a/helm/easyhaproxy/templates/_helpers.tpl b/helm/easyhaproxy/templates/_helpers.tpl index 3e9c496..d84556c 100644 --- a/helm/easyhaproxy/templates/_helpers.tpl +++ b/helm/easyhaproxy/templates/_helpers.tpl @@ -1,7 +1,7 @@ {{/* Expand the name of the chart. */}} -{{- define "easyhaproxy-ingress.name" -}} +{{- define "easyhaproxy.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} {{- end }} @@ -10,7 +10,7 @@ Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. */}} -{{- define "easyhaproxy-ingress.fullname" -}} +{{- define "easyhaproxy.fullname" -}} {{- if .Values.fullnameOverride }} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} {{- else }} @@ -26,16 +26,16 @@ If release name contains chart name it will be used as a full name. {{/* Create chart name and version as used by the chart label. */}} -{{- define "easyhaproxy-ingress.chart" -}} +{{- define "easyhaproxy.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Common labels */}} -{{- define "easyhaproxy-ingress.labels" -}} -helm.sh/chart: {{ include "easyhaproxy-ingress.chart" . }} -{{ include "easyhaproxy-ingress.selectorLabels" . }} +{{- define "easyhaproxy.labels" -}} +helm.sh/chart: {{ include "easyhaproxy.chart" . }} +{{ include "easyhaproxy.selectorLabels" . }} {{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} {{- end }} @@ -45,17 +45,17 @@ app.kubernetes.io/managed-by: {{ .Release.Service }} {{/* Selector labels */}} -{{- define "easyhaproxy-ingress.selectorLabels" -}} -app.kubernetes.io/name: {{ include "easyhaproxy-ingress.name" . }} +{{- define "easyhaproxy.selectorLabels" -}} +app.kubernetes.io/name: {{ include "easyhaproxy.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end }} {{/* Create the name of the service account to use */}} -{{- define "easyhaproxy-ingress.serviceAccountName" -}} +{{- define "easyhaproxy.serviceAccountName" -}} {{- if .Values.serviceAccount.create }} -{{- default (include "easyhaproxy-ingress.fullname" .) .Values.serviceAccount.name }} +{{- default (include "easyhaproxy.fullname" .) .Values.serviceAccount.name }} {{- else }} {{- default "default" .Values.serviceAccount.name }} {{- end }} diff --git a/helm/easyhaproxy/templates/clusterrole.yaml b/helm/easyhaproxy/templates/clusterrole.yaml index 77aaa1f..04ac23e 100644 --- a/helm/easyhaproxy/templates/clusterrole.yaml +++ b/helm/easyhaproxy/templates/clusterrole.yaml @@ -3,10 +3,10 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: {{ include "easyhaproxy-ingress.fullname" . }} + name: {{ include "easyhaproxy.fullname" . }} namespace: {{ .Release.Namespace }} labels: - {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- include "easyhaproxy.labels" . | nindent 4 }} {{- with .Values.serviceAccount.annotations }} annotations: {{- toYaml . | nindent 4 }} diff --git a/helm/easyhaproxy/templates/clusterrolebinding.yaml b/helm/easyhaproxy/templates/clusterrolebinding.yaml index c806403..d936de9 100644 --- a/helm/easyhaproxy/templates/clusterrolebinding.yaml +++ b/helm/easyhaproxy/templates/clusterrolebinding.yaml @@ -3,10 +3,10 @@ kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: {{ include "easyhaproxy-ingress.fullname" . }} + name: {{ include "easyhaproxy.fullname" . }} namespace: {{ .Release.Namespace }} labels: - {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- include "easyhaproxy.labels" . | nindent 4 }} {{- with .Values.serviceAccount.annotations }} annotations: {{- toYaml . | nindent 4 }} @@ -14,9 +14,9 @@ metadata: roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: {{ include "easyhaproxy-ingress.fullname" . }} + name: {{ include "easyhaproxy.fullname" . }} subjects: - kind: ServiceAccount - name: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + name: {{ include "easyhaproxy.serviceAccountName" . }} namespace: {{ .Release.Namespace }} {{- end }} diff --git a/helm/easyhaproxy/templates/deployment.yaml b/helm/easyhaproxy/templates/deployment.yaml index 3ef6c3a..df86012 100644 --- a/helm/easyhaproxy/templates/deployment.yaml +++ b/helm/easyhaproxy/templates/deployment.yaml @@ -2,18 +2,18 @@ apiVersion: apps/v1 kind: DaemonSet metadata: - name: {{ include "easyhaproxy-ingress.fullname" . }} + name: {{ include "easyhaproxy.fullname" . }} namespace: {{ .Release.Namespace }} labels: - {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- include "easyhaproxy.labels" . | nindent 4 }} spec: selector: matchLabels: - {{- include "easyhaproxy-ingress.selectorLabels" . | nindent 6 }} + {{- include "easyhaproxy.selectorLabels" . | nindent 6 }} template: metadata: labels: - {{- include "easyhaproxy-ingress.selectorLabels" . | nindent 8 }} + {{- include "easyhaproxy.selectorLabels" . | nindent 8 }} spec: affinity: nodeAffinity: @@ -24,7 +24,7 @@ spec: operator: In values: {{- toYaml .Values.masterNode.values | nindent 18 }} - serviceAccountName: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + serviceAccountName: {{ include "easyhaproxy.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} containers: diff --git a/helm/easyhaproxy/templates/serviceaccount.yaml b/helm/easyhaproxy/templates/serviceaccount.yaml index 9d1310e..5182461 100644 --- a/helm/easyhaproxy/templates/serviceaccount.yaml +++ b/helm/easyhaproxy/templates/serviceaccount.yaml @@ -2,10 +2,10 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: {{ include "easyhaproxy-ingress.serviceAccountName" . }} + name: {{ include "easyhaproxy.serviceAccountName" . }} namespace: {{ .Release.Namespace }} labels: - {{- include "easyhaproxy-ingress.labels" . | nindent 4 }} + {{- include "easyhaproxy.labels" . | nindent 4 }} {{- with .Values.serviceAccount.annotations }} annotations: {{- toYaml . | nindent 4 }} diff --git a/helm/easyhaproxy/values.yaml b/helm/easyhaproxy/values.yaml index 213937f..2bf5a1e 100644 --- a/helm/easyhaproxy/values.yaml +++ b/helm/easyhaproxy/values.yaml @@ -1,4 +1,4 @@ -# Default values for easyhaproxy-ingress. +# Default values for easyhaproxy. # This is a YAML-formatted file. # Declare variables to be passed into your templates. From 72b40a3c6627de3688792724642cb51ff10f7dc8 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sun, 28 Aug 2022 15:20:16 -0500 Subject: [PATCH 40/45] Add Listen Port to Ingress --- docs/kubernetes.md | 7 ++++++- helm/easyhaproxy/Chart.yaml | 2 +- helm/easyhaproxy/templates/deployment.yaml | 5 +++++ helm/easyhaproxy/values.yaml | 2 ++ src/processor/__init__.py | 5 ++++- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/kubernetes.md b/docs/kubernetes.md index 9063a85..bc20b63 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -33,6 +33,8 @@ There are two ways to install EasyHAProxy in a Kubernetes cluster. You can use K 3.1. Using Kubernetes Manifest ```bash +kubectl create namespace easyhaproxy + kubectl apply -f \ https://raw.githubusercontent.com/haproxytech/kubernetes-ingress/master/deploy/haproxy-ingress-daemonset.yaml ``` @@ -45,7 +47,7 @@ Minimal configuration ```bash helm repo add byjg https://opensource.byjg.com/helm -helm repo update +helm repo update byjg kubectl create namespace easyhaproxy helm upgrade --install ingress byjg/easyhaproxy \ --namespace easyhaproxy \ @@ -68,6 +70,8 @@ easyhaproxy: easyhaproxy: DEBUG haproxy: DEBUG +listen_extra_ports: [] + # Make sure to create this masterNode: label: easyhaproxy/node @@ -120,6 +124,7 @@ Caveats: | easyhaproxy.letsencrypt | (optional) Boolean. It will request letsencript certificates for the ingresses domains. | false | true or false | easyhaproxy.redirect | (optional) Json. Specific a domain and its destination. | *empty* | {"domain":"redirect_url"} | easyhaproxy.mode | (optional) Set the HTTP mode for that connection. | http | http or tcp +| easyhaproxy.listen_port | (optional) Set the an additional port for that ingress | http | http or tcp **Important**: The annotations are per ingress and applied to all hosts in that ingress configuration. diff --git a/helm/easyhaproxy/Chart.yaml b/helm/easyhaproxy/Chart.yaml index 7bc7817..eb5db7d 100644 --- a/helm/easyhaproxy/Chart.yaml +++ b/helm/easyhaproxy/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 +version: 0.1.1 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/easyhaproxy/templates/deployment.yaml b/helm/easyhaproxy/templates/deployment.yaml index df86012..23d518e 100644 --- a/helm/easyhaproxy/templates/deployment.yaml +++ b/helm/easyhaproxy/templates/deployment.yaml @@ -43,6 +43,11 @@ spec: - name: stats containerPort: 1936 hostPort: 1936 + {{ range .Values.listen_extra_ports }} + - name: extra_{{ . }} + containerPort: {{ . }} + hostPort: {{ . }} + {{- end }} resources: {{- toYaml .Values.resources | nindent 12 }} env: diff --git a/helm/easyhaproxy/values.yaml b/helm/easyhaproxy/values.yaml index 2bf5a1e..907fe91 100644 --- a/helm/easyhaproxy/values.yaml +++ b/helm/easyhaproxy/values.yaml @@ -58,6 +58,8 @@ easyhaproxy: easyhaproxy: DEBUG haproxy: DEBUG +listen_extra_ports: [] + # Make sure to create this masterNode: label: easyhaproxy/node diff --git a/src/processor/__init__.py b/src/processor/__init__.py index ed4733c..0aee377 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -158,6 +158,9 @@ class Kubernetes(ProcessorInterface): redirect_ssl = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.redirect_ssl") redirect = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.redirect") mode = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.mode") + listen_port = self._check_annotation(ingress.metadata.annotations, "easyhaproxy.listen_port") + if listen_port is None: + listen_port = 80 data = {} data["creation_timestamp"] = ingress.metadata.creation_timestamp.strftime("%x %X") @@ -191,7 +194,7 @@ class Kubernetes(ProcessorInterface): port_number = rule.http.paths[0].backend.service.port.number definition = "easyhaproxy.%s_%s" % (rule.host.replace(".", "-"), port_number) rule_data["%s.host" % (definition)] = rule.host - rule_data["%s.port" % (definition)] = "80" + rule_data["%s.port" % (definition)] = listen_port rule_data["%s.localport" % (definition)] = port_number if rule.host in ssl_hosts: rule_data["%s.clone_to_ssl" % (definition)] = 'true' From 98c11142447936c6a2aa95388d1d713efc9290c7 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sun, 28 Aug 2022 15:31:27 -0500 Subject: [PATCH 41/45] Fix naming --- helm/easyhaproxy/templates/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/easyhaproxy/templates/deployment.yaml b/helm/easyhaproxy/templates/deployment.yaml index 23d518e..b4c978e 100644 --- a/helm/easyhaproxy/templates/deployment.yaml +++ b/helm/easyhaproxy/templates/deployment.yaml @@ -44,7 +44,7 @@ spec: containerPort: 1936 hostPort: 1936 {{ range .Values.listen_extra_ports }} - - name: extra_{{ . }} + - name: extra{{ . }} containerPort: {{ . }} hostPort: {{ . }} {{- end }} From fa9a9767c925fcca435ff503a2ce677ed9e883c3 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Mon, 29 Aug 2022 18:08:15 -0500 Subject: [PATCH 42/45] Add ClusterIP and NodePort deployment --- .gitignore | 3 +- deploy/kubernetes/easyhaproxy-clusterip.yml | 208 ++++++++++++++++++ ...yhaproxy.yml => easyhaproxy-daemonset.yml} | 14 +- deploy/kubernetes/easyhaproxy-nodeport.yml | 208 ++++++++++++++++++ docs/kubernetes.md | 38 ++-- helm/easyhaproxy/Chart.yaml | 2 +- helm/easyhaproxy/templates/deployment.yaml | 16 +- helm/easyhaproxy/templates/service.yaml | 34 +++ helm/easyhaproxy/values.schema.json | 19 ++ helm/easyhaproxy/values.yaml | 14 +- 10 files changed, 525 insertions(+), 31 deletions(-) create mode 100644 deploy/kubernetes/easyhaproxy-clusterip.yml rename deploy/kubernetes/{easyhaproxy.yml => easyhaproxy-daemonset.yml} (94%) create mode 100644 deploy/kubernetes/easyhaproxy-nodeport.yml create mode 100644 helm/easyhaproxy/templates/service.yaml create mode 100644 helm/easyhaproxy/values.schema.json diff --git a/.gitignore b/.gitignore index 835d304..1610fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ venv .docker_data __pycache__ .pytest_cache -*.pyc \ No newline at end of file +*.pyc +.env diff --git a/deploy/kubernetes/easyhaproxy-clusterip.yml b/deploy/kubernetes/easyhaproxy-clusterip.yml new file mode 100644 index 0000000..93d00bc --- /dev/null +++ b/deploy/kubernetes/easyhaproxy-clusterip.yml @@ -0,0 +1,208 @@ +--- +# Source: easyhaproxy/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +--- +# Source: easyhaproxy/templates/clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +rules: +- apiGroups: + - "" + resources: + # - configmaps + # - endpoints + # - nodes + - pods + - services + - namespaces + # - events + - serviceaccounts + verbs: + - get + - list + - watch +- apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses + # - ingresses/status + # - ingressclasses + verbs: + - get + - list + - watch +# - apiGroups: +# - "extensions" +# - "networking.k8s.io" +# resources: +# - ingresses/status +# verbs: +# - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + # - watch + # - create + # - patch + # - update +# - apiGroups: +# - "discovery.k8s.io" +# resources: +# - endpointslices +# verbs: +# - get +# - list +# - watch +--- +# Source: easyhaproxy/templates/clusterrolebinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ingress-easyhaproxy +subjects: +- kind: ServiceAccount + name: ingress-easyhaproxy + namespace: easyhaproxy +--- +# Source: easyhaproxy/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: ClusterIP + ports: + - name: http + port: 80 + + - name: https + port: 443 + + - name: stats + port: 1936 + + + + selector: + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress +--- +# Source: easyhaproxy/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + template: + metadata: + labels: + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: easyhaproxy/node + operator: In + values: + - master + serviceAccountName: ingress-easyhaproxy + securityContext: + {} + containers: + - name: easyhaproxy + securityContext: + {} + image: "byjg/easy-haproxy:test" + imagePullPolicy: Always + ports: + - name: http + containerPort: 80 + + - name: https + containerPort: 443 + + - name: stats + containerPort: 1936 + + resources: + requests: + cpu: 100m + memory: 128Mi + env: + - name: EASYHAPROXY_DISCOVER + value: kubernetes + - name: HAPROXY_USERNAME + value: admin + - name: HAPROXY_PASSWORD + value: password + - name: EASYHAPROXY_REFRESH_CONF + value: "10" + - name: HAPROXY_CUSTOMERRORS + value: "true" + - name: EASYHAPROXY_SSL_MODE + value: loose + - name: EASYHAPROXY_LOG_LEVEL + value: DEBUG + - name: HAPROXY_LOG_LEVEL + value: DEBUG + - name: CERTBOT_LOG_LEVEL + value: DEBUG diff --git a/deploy/kubernetes/easyhaproxy.yml b/deploy/kubernetes/easyhaproxy-daemonset.yml similarity index 94% rename from deploy/kubernetes/easyhaproxy.yml rename to deploy/kubernetes/easyhaproxy-daemonset.yml index f44626d..208eeb5 100644 --- a/deploy/kubernetes/easyhaproxy.yml +++ b/deploy/kubernetes/easyhaproxy-daemonset.yml @@ -6,7 +6,7 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.0 + helm.sh/chart: easyhaproxy-0.1.2 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" @@ -19,7 +19,7 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.0 + helm.sh/chart: easyhaproxy-0.1.2 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" @@ -85,7 +85,7 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.0 + helm.sh/chart: easyhaproxy-0.1.2 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" @@ -106,7 +106,7 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.0 + helm.sh/chart: easyhaproxy-0.1.2 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress app.kubernetes.io/version: "test" @@ -151,7 +151,9 @@ spec: containerPort: 1936 hostPort: 1936 resources: - {} + requests: + cpu: 100m + memory: 128Mi env: - name: EASYHAPROXY_DISCOVER value: kubernetes @@ -170,4 +172,4 @@ spec: - name: HAPROXY_LOG_LEVEL value: DEBUG - name: CERTBOT_LOG_LEVEL - value: DEBUG \ No newline at end of file + value: DEBUG diff --git a/deploy/kubernetes/easyhaproxy-nodeport.yml b/deploy/kubernetes/easyhaproxy-nodeport.yml new file mode 100644 index 0000000..cc0d2a3 --- /dev/null +++ b/deploy/kubernetes/easyhaproxy-nodeport.yml @@ -0,0 +1,208 @@ +--- +# Source: easyhaproxy/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +--- +# Source: easyhaproxy/templates/clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +rules: +- apiGroups: + - "" + resources: + # - configmaps + # - endpoints + # - nodes + - pods + - services + - namespaces + # - events + - serviceaccounts + verbs: + - get + - list + - watch +- apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses + # - ingresses/status + # - ingressclasses + verbs: + - get + - list + - watch +# - apiGroups: +# - "extensions" +# - "networking.k8s.io" +# resources: +# - ingresses/status +# verbs: +# - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + # - watch + # - create + # - patch + # - update +# - apiGroups: +# - "discovery.k8s.io" +# resources: +# - endpointslices +# verbs: +# - get +# - list +# - watch +--- +# Source: easyhaproxy/templates/clusterrolebinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ingress-easyhaproxy +subjects: +- kind: ServiceAccount + name: ingress-easyhaproxy + namespace: easyhaproxy +--- +# Source: easyhaproxy/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: NodePort + ports: + - name: http + port: 80 + nodePort: 31080 + - name: https + port: 443 + nodePort: 31443 + - name: stats + port: 1936 + nodePort: 31936 + + + selector: + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress +--- +# Source: easyhaproxy/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ingress-easyhaproxy + namespace: easyhaproxy + labels: + helm.sh/chart: easyhaproxy-0.1.2 + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + app.kubernetes.io/version: "test" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + template: + metadata: + labels: + app.kubernetes.io/name: easyhaproxy + app.kubernetes.io/instance: ingress + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: easyhaproxy/node + operator: In + values: + - master + serviceAccountName: ingress-easyhaproxy + securityContext: + {} + containers: + - name: easyhaproxy + securityContext: + {} + image: "byjg/easy-haproxy:test" + imagePullPolicy: Always + ports: + - name: http + containerPort: 80 + + - name: https + containerPort: 443 + + - name: stats + containerPort: 1936 + + resources: + requests: + cpu: 100m + memory: 128Mi + env: + - name: EASYHAPROXY_DISCOVER + value: kubernetes + - name: HAPROXY_USERNAME + value: admin + - name: HAPROXY_PASSWORD + value: password + - name: EASYHAPROXY_REFRESH_CONF + value: "10" + - name: HAPROXY_CUSTOMERRORS + value: "true" + - name: EASYHAPROXY_SSL_MODE + value: loose + - name: EASYHAPROXY_LOG_LEVEL + value: DEBUG + - name: HAPROXY_LOG_LEVEL + value: DEBUG + - name: CERTBOT_LOG_LEVEL + value: DEBUG diff --git a/docs/kubernetes.md b/docs/kubernetes.md index bc20b63..7181454 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -2,15 +2,19 @@ ## Setup Kubernetes EasyHAProxy -EasyHAProxy is a Daemonset and it will query all ingress definitions with the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`. +EasyHAProxy query all ingress definitions with the annotation `kubernetes.io/ingress.class: easyhaproxy-ingress`.Once find the annotation, it will immediatelly setup HAProxy and start to serve it. -Once find the annotation, it will immediatelly setup HAProxy and start to serve it. +There are three installation modes: + +- DaemonSet: It will expose the ports 80, 443 and 1936 +- NodePort: It will expose the ports 31080, 31443 and 31936 +- ClusterIP it will node expose any port. The HAProxy will be accessible only inside the cluster. To install the daemonset in your cluster follow these steps: -1. Identify the node where your EasyHAProxy container will run. +### 1) Identify the node where your EasyHAProxy container will run. -EasyHAProxy is a daemonset but it will be limited to a single node. To understand that see [limitations](limitations.md) page. +Doesn't matter if you choose DaemonSet or ClusterIP, EasyHAProxy will be limited to a single node. To understand that see [limitations](limitations.md) page. ```bash $ kubectl get nodes @@ -20,28 +24,28 @@ node-01 Ready 561d v1.21.13-3 node-02 Ready 561d v1.21.13-3 ``` -2. Add the EasyHAProxy label to the node +Add the EasyHAProxy label to the node ```bash kubectl label nodes node-01 "easyhaproxy/node=master" ``` -3. Install EasyHAProxy +### 2) Install EasyHAProxy There are two ways to install EasyHAProxy in a Kubernetes cluster. You can use Kubernetes Manifest or Helm 3. -3.1. Using Kubernetes Manifest +#### 2.1.) Using Kubernetes Manifest ```bash kubectl create namespace easyhaproxy kubectl apply -f \ - https://raw.githubusercontent.com/haproxytech/kubernetes-ingress/master/deploy/haproxy-ingress-daemonset.yaml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/kubernetes/deploy/kubernetes/easyhaproxy-daemonset.yml ``` You can configure the behavior of the EasyHAProxy by setup specific environment variables. To get a list of the variables please follow the [docker container environment](docker-environment.md) -3.2. Using HELM 3 +#### 2.2) Using HELM 3 Minimal configuration @@ -49,6 +53,7 @@ Minimal configuration helm repo add byjg https://opensource.byjg.com/helm helm repo update byjg kubectl create namespace easyhaproxy + helm upgrade --install ingress byjg/easyhaproxy \ --namespace easyhaproxy \ --set resources.requests.cpu=100m \ @@ -70,7 +75,17 @@ easyhaproxy: easyhaproxy: DEBUG haproxy: DEBUG -listen_extra_ports: [] +service: + create: false # If false, it will create a Daemonset with hostPort. The easiest. + type: ClusterIP # or NodePort + annotations: {} + +binding: + ports: + http: 80 + https: 443 + stats: 1936 + additionalPorts: [] # Make sure to create this masterNode: @@ -179,8 +194,5 @@ spec: ... ``` - - - ---- [Open source ByJG](http://opensource.byjg.com) diff --git a/helm/easyhaproxy/Chart.yaml b/helm/easyhaproxy/Chart.yaml index eb5db7d..07e4928 100644 --- a/helm/easyhaproxy/Chart.yaml +++ b/helm/easyhaproxy/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.1 +version: 0.1.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/easyhaproxy/templates/deployment.yaml b/helm/easyhaproxy/templates/deployment.yaml index b4c978e..86fb22c 100644 --- a/helm/easyhaproxy/templates/deployment.yaml +++ b/helm/easyhaproxy/templates/deployment.yaml @@ -1,6 +1,6 @@ --- apiVersion: apps/v1 -kind: DaemonSet +kind: {{ ternary "Deployment" "DaemonSet" .Values.service.create }} metadata: name: {{ include "easyhaproxy.fullname" . }} namespace: {{ .Release.Namespace }} @@ -36,17 +36,17 @@ spec: ports: - name: http containerPort: 80 - hostPort: 80 + {{ if not .Values.service.create }}hostPort: {{ .Values.binding.ports.http }}{{ end }} - name: https containerPort: 443 - hostPort: 443 + {{ if not .Values.service.create }}hostPort: {{ .Values.binding.ports.https }}{{ end }} - name: stats containerPort: 1936 - hostPort: 1936 - {{ range .Values.listen_extra_ports }} - - name: extra{{ . }} - containerPort: {{ . }} - hostPort: {{ . }} + {{ if not .Values.service.create }}hostPort: {{ .Values.binding.ports.stats }}{{ end }} + {{- range $port := .Values.binding.additionalPorts }} + - name: extra{{ $port }} + containerPort: {{ $port }} + {{ if not $.Values.service.create }}hostPort: {{ $port }}{{ end }} {{- end }} resources: {{- toYaml .Values.resources | nindent 12 }} diff --git a/helm/easyhaproxy/templates/service.yaml b/helm/easyhaproxy/templates/service.yaml new file mode 100644 index 0000000..81b2985 --- /dev/null +++ b/helm/easyhaproxy/templates/service.yaml @@ -0,0 +1,34 @@ +{{ if .Values.service.create }} +--- +apiVersion: v1 +kind: Service +metadata: +metadata: + name: {{ include "easyhaproxy.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "easyhaproxy.labels" . | nindent 4 }} + annotations: + {{- toYaml .Values.service.annotations | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - name: http + port: 80 + {{ if eq .Values.service.type "NodePort" }}nodePort: {{ .Values.binding.ports.http }}{{ end }} + - name: https + port: 443 + {{ if eq .Values.service.type "NodePort" }}nodePort: {{ .Values.binding.ports.https }}{{ end }} + - name: stats + port: 1936 + {{ if eq .Values.service.type "NodePort" }}nodePort: {{ .Values.binding.ports.stats }}{{ end }} + {{- range $port := .Values.binding.additionalPorts }} + - name: extra{{ $port }} + port: {{ $port }} + {{ if eq $.Values.service.type "NodePort" }}nodePort: {{ $port }}{{ end }} + {{- end }} + + + selector: + {{- include "easyhaproxy.selectorLabels" . | nindent 4 }} +{{ end }} \ No newline at end of file diff --git a/helm/easyhaproxy/values.schema.json b/helm/easyhaproxy/values.schema.json new file mode 100644 index 0000000..9018523 --- /dev/null +++ b/helm/easyhaproxy/values.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "required": [], + "properties": { + "service": { + "type": "object", + "required": [], + "properties": { + "create": { + "type": "boolean" + }, + "type": { + "type": "string", + "enum": ["ClusterIP", "NodePort"] + } + } + } + } +} \ No newline at end of file diff --git a/helm/easyhaproxy/values.yaml b/helm/easyhaproxy/values.yaml index 907fe91..9f1b413 100644 --- a/helm/easyhaproxy/values.yaml +++ b/helm/easyhaproxy/values.yaml @@ -14,6 +14,18 @@ imagePullSecrets: [] nameOverride: "" fullnameOverride: "" +service: + create: false # If false, it will create a Daemonset with hostPort. The easiest. + type: ClusterIP # or NodePort + annotations: {} + +binding: + ports: + http: 80 + https: 443 + stats: 1936 + additionalPorts: [] + serviceAccount: create: true annotations: {} @@ -58,8 +70,6 @@ easyhaproxy: easyhaproxy: DEBUG haproxy: DEBUG -listen_extra_ports: [] - # Make sure to create this masterNode: label: easyhaproxy/node From 89ab1339975310087fb67ff767d6ad9a3e1ebd68 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Tue, 30 Aug 2022 15:06:07 -0500 Subject: [PATCH 43/45] Reload Static --- src/easymapping/__init__.py | 4 +- src/processor/__init__.py | 17 +++++- .../expected/services-multiple-hosts.txt | 12 ++-- src/tests/test_static.py | 57 +++++++++++++++++-- 4 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index e2d6eeb..6ad8af7 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -90,7 +90,7 @@ class HaproxyConfigGenerator: self.label.set_data(d) # Parse each definition found. - for definition in definitions.keys(): + for definition in sorted(definitions.keys()): mode = self.label.get( self.label.create([definition, "mode"]), "http" @@ -134,7 +134,7 @@ class HaproxyConfigGenerator: "" ) - for hostname in d[host_label].split(","): + for hostname in sorted(d[host_label].split(",")): hostname = hostname.strip() self.serving_hosts.append("%s:%s" % (hostname, port)) easymapping[port]["hosts"].setdefault(hostname, {}) diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 0aee377..eacebbd 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -101,10 +101,21 @@ class ProcessorInterface: class Static(ProcessorInterface): def inspect_network(self): self.parsed_object = {} - + self.static_content = None + + def get_parsed_object(self): + return self.static_content["easymapping"] if "easymapping" in self.static_content else [] + + def get_hosts(self): + hosts = [] + for object in self.get_parsed_object(): + for host in object["hosts"].keys(): + hosts.append("%s:%s" % (host, object["port"])) + return hosts + def parse(self): - static_content = yaml.load(Functions.load(self.filename), Loader=yaml.FullLoader) - self.cfg = HaproxyConfigGenerator(static_content) + self.static_content = yaml.load(Functions.load(self.filename), Loader=yaml.FullLoader) + self.cfg = HaproxyConfigGenerator(self.static_content) class Docker(ProcessorInterface): diff --git a/src/tests/expected/services-multiple-hosts.txt b/src/tests/expected/services-multiple-hosts.txt index 8c356cd..954dde1 100644 --- a/src/tests/expected/services-multiple-hosts.txt +++ b/src/tests/expected/services-multiple-hosts.txt @@ -48,15 +48,15 @@ frontend http_in_19901 mode http redirect prefix www.google.com code 301 if { hdr(host) -i google.helloworld.com } - acl is_rule_hello_com_19901_1 hdr(host) -i hello.com - acl is_rule_hello_com_19901_2 hdr(host) -i hello.com:19901 - use_backend srv_hello_com_19901 if is_rule_hello_com_19901_1 OR is_rule_hello_com_19901_2 - acl is_rule_www_helloworld_com_19901_1 hdr(host) -i www.helloworld.com acl is_rule_www_helloworld_com_19901_2 hdr(host) -i www.helloworld.com:19901 use_backend srv_www_helloworld_com_19901 if is_rule_www_helloworld_com_19901_1 OR is_rule_www_helloworld_com_19901_2 -backend srv_hello_com_19901 + acl is_rule_hello_com_19901_1 hdr(host) -i hello.com + acl is_rule_hello_com_19901_2 hdr(host) -i hello.com:19901 + use_backend srv_hello_com_19901 if is_rule_hello_com_19901_1 OR is_rule_hello_com_19901_2 + +backend srv_www_helloworld_com_19901 balance roundrobin mode http option forwardfor @@ -64,7 +64,7 @@ backend srv_hello_com_19901 http-request add-header X-Forwarded-Proto https if { ssl_fc } server srv-0 3e63154954b0:80 check weight 1 server srv-1 eb294c110eb1:80 check weight 1 -backend srv_www_helloworld_com_19901 +backend srv_hello_com_19901 balance roundrobin mode http option forwardfor diff --git a/src/tests/test_static.py b/src/tests/test_static.py index a68c2e4..c21593c 100644 --- a/src/tests/test_static.py +++ b/src/tests/test_static.py @@ -8,9 +8,58 @@ def test_processor_static(): ProcessorInterface.static_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "./fixtures/static.yml") static = ProcessorInterface.factory("static") + parsed_object = [ + { + "hosts":{ + "host1.com.br":{ + "containers":[ + "container:5000" + ], + "letsencrypt": True + }, + "host2.com.br":{ + "containers":[ + "other:3000" + ] + } + }, + "port":80, + "redirect":{ + "www.host1.com.br":"http://host1.com.br" + } + }, + { + "hosts":{ + "host1.com.br":{ + "containers":[ + "container:80" + ] + } + }, + "port":443, + "ssl": True + }, + { + "hosts":{ + "host3.com.br":{ + "containers":[ + "domain:8181" + ] + } + }, + "port":8080 + } + ] + hosts = [ + 'host1.com.br:80', + 'host2.com.br:80', + 'host1.com.br:443', + 'host3.com.br:8080' + ] + assert static.get_letsencrypt_hosts() is None - assert static.get_parsed_object() == {} - assert static.get_hosts() is None + assert static.get_parsed_object() == parsed_object + assert static.get_hosts() == hosts haproxy_cfg = static.get_haproxy_conf() @@ -18,7 +67,7 @@ def test_processor_static(): # @todo: Static doesnt populate this fields assert static.get_letsencrypt_hosts() == [] - assert static.get_parsed_object() == {} - assert static.get_hosts() == [] + assert static.get_parsed_object() == parsed_object + assert static.get_hosts() == hosts # test_processor_static() \ No newline at end of file From c5f9857a6f4fe81a159577d7f2c0314fcc07e771 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Wed, 31 Aug 2022 23:23:11 -0500 Subject: [PATCH 44/45] Preparing to pack to create a version --- .github/workflows/build.yml | 2 +- deploy/kubernetes/easyhaproxy-clusterip.yml | 22 ++++++++++----------- deploy/kubernetes/easyhaproxy-daemonset.yml | 18 ++++++++--------- deploy/kubernetes/easyhaproxy-nodeport.yml | 22 ++++++++++----------- helm/easyhaproxy/Chart.yaml | 4 ++-- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7991d5f..3efaf4c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -110,7 +110,7 @@ jobs: Helm: runs-on: 'ubuntu-latest' needs: Build - # if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v') env: DOC_GITHUB_TOKEN: '${{ secrets.DOC_TOKEN }}' steps: diff --git a/deploy/kubernetes/easyhaproxy-clusterip.yml b/deploy/kubernetes/easyhaproxy-clusterip.yml index 93d00bc..ee8d8a7 100644 --- a/deploy/kubernetes/easyhaproxy-clusterip.yml +++ b/deploy/kubernetes/easyhaproxy-clusterip.yml @@ -6,10 +6,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm --- # Source: easyhaproxy/templates/clusterrole.yaml @@ -19,10 +19,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm rules: - apiGroups: @@ -85,10 +85,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io @@ -107,10 +107,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm annotations: {} @@ -139,10 +139,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm spec: selector: @@ -171,7 +171,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:test" + image: "byjg/easy-haproxy:master" imagePullPolicy: Always ports: - name: http diff --git a/deploy/kubernetes/easyhaproxy-daemonset.yml b/deploy/kubernetes/easyhaproxy-daemonset.yml index 208eeb5..7631fc0 100644 --- a/deploy/kubernetes/easyhaproxy-daemonset.yml +++ b/deploy/kubernetes/easyhaproxy-daemonset.yml @@ -6,10 +6,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm --- # Source: easyhaproxy/templates/clusterrole.yaml @@ -19,10 +19,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm rules: - apiGroups: @@ -85,10 +85,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io @@ -106,10 +106,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm spec: selector: @@ -138,7 +138,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:test" + image: "byjg/easy-haproxy:master" imagePullPolicy: Always ports: - name: http diff --git a/deploy/kubernetes/easyhaproxy-nodeport.yml b/deploy/kubernetes/easyhaproxy-nodeport.yml index cc0d2a3..542d94b 100644 --- a/deploy/kubernetes/easyhaproxy-nodeport.yml +++ b/deploy/kubernetes/easyhaproxy-nodeport.yml @@ -6,10 +6,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm --- # Source: easyhaproxy/templates/clusterrole.yaml @@ -19,10 +19,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm rules: - apiGroups: @@ -85,10 +85,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io @@ -107,10 +107,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm annotations: {} @@ -139,10 +139,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-0.1.2 + helm.sh/chart: easyhaproxy-0.1.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "test" + app.kubernetes.io/version: "master" app.kubernetes.io/managed-by: Helm spec: selector: @@ -171,7 +171,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:test" + image: "byjg/easy-haproxy:master" imagePullPolicy: Always ports: - name: http diff --git a/helm/easyhaproxy/Chart.yaml b/helm/easyhaproxy/Chart.yaml index 07e4928..dcbbe33 100644 --- a/helm/easyhaproxy/Chart.yaml +++ b/helm/easyhaproxy/Chart.yaml @@ -15,10 +15,10 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.2 +version: 0.1.3 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "test" +appVersion: "master" From 26cf0af714a3b2750ae2ac3c7aa0aa5f5aa0fcad Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Wed, 31 Aug 2022 23:30:42 -0500 Subject: [PATCH 45/45] Change image --- deploy/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml index 90b0a3e..ad01297 100644 --- a/deploy/docker/docker-compose.yml +++ b/deploy/docker/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: easyhaproxy: - image: byjg/easy-haproxy:4.1.0 + image: byjg/easy-haproxy:master volumes: - /var/run/docker.sock:/var/run/docker.sock - certs_letsencrypt:/certs/letsencrypt