From 9c40818a461e39cde2a7f5ba0415f641574237fd Mon Sep 17 00:00:00 2001 From: tacf Date: Thu, 4 Jul 2019 10:41:59 +0100 Subject: [PATCH] [FEAT] Root domain support --- Pipfile | 1 + .../deployment/k8s/applied_blockchain.sls | 6 ++- .../dev/states/deployment/k8s/v1_0/init.sls | 45 ++++++++++++++----- .../v1_0/templates/ingress_service.yaml.j2 | 27 ++++++++++- salt/ext/_modules/dns_dnsimple/__init__.py | 12 +++++ salt/ext/_modules/dns_dnsimple/provider.py | 38 ++++++++++++++++ salt/ext/_states/dnsimple.py | 19 ++++++++ 7 files changed, 133 insertions(+), 15 deletions(-) diff --git a/Pipfile b/Pipfile index c1b5ec5..6f49d5a 100755 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,7 @@ name = "pypi" "flake8" = "==3.3.0" "pytest-flake8" = "==0.8.1" pytest = "==3.1.1" +autopep8 = "*" [packages] salt = "==2019.2.0" diff --git a/salt/environments/dev/pillars/deployment/k8s/applied_blockchain.sls b/salt/environments/dev/pillars/deployment/k8s/applied_blockchain.sls index 4e66a6b..3a69bd0 100644 --- a/salt/environments/dev/pillars/deployment/k8s/applied_blockchain.sls +++ b/salt/environments/dev/pillars/deployment/k8s/applied_blockchain.sls @@ -4,8 +4,10 @@ applied_blockchain: provider: aws domain: name: abtech.dev - cert64: {{ salt.nacl.dec('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') }} - cert_key64: {{ salt.nacl.dec('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')}} + cert64: {{ salt.nacl.dec('mE71sB3HI0bG04jbqwGrZhnDCMdJ3Vl2L2wsqBZ2OFiUooOryiGShxGDY4LOXs5RoB/oir1PKBvlTl4xlmZW9LGGd7ICd6PDkfaXsPO55ej4PqYonG8NDh4kCDfg9mowU2aWFja+YbT5x0GYeq+31snTc7awFMQUr3AzxP2NKnZpCOUUK7P2QqwRe+NnUtt+z/RXo+J0UUf65jYU75uHqQWujE3dc0JReq7xR3+4SgBoRAiQv39GcyoDJg1uwAnU4MRzikvS/NWAeuLSuirMo2ALDOh3zWPLCIBnSA+Z75aTRRJgvUxFRbvs5s1cv4oRH50uQfkHClK5tgpvW6iqVq/jydDehpxfMvYPaOVf8Vbz3sOfV4KiYJ84eIjy0NcxQdSR/UHVoNhoz0s3PHT6Avf/xVnSJeJcxwnK+MS4++amP+RTv//9N+WF2QTCJz3ukEyvs2hU2Y2jztDyLgae1wKm8TbANIlksi5jBDWctCKLo2/Gy8GKwMv1Mqldes/4uLjPEHFq7JyWWvq0XkTMFgHzYBjBzcEJZog+H2wRa6j0DUYkwGs0u1/keDVcwzwXrBZEWRKNFJaJ6RrzEjzFwxDO3tcBtQUhCzpRdfOjlWV87hxdsfN0wKJ8irMdWr/2nL9Doqeh0cR7uYTRZbq0xDQVnZs0hwPFFmbFQ/SdAMezL/0+MzWA28Gia6T0MMyNFLFkM7WvB5iVvOM3Oaof+imUsQpjX43n/GT93bhHlriAJKvM3LMYnk8E/jshGJNi1w0Rg/mIq3vArn98Pqd89ceHqXFGeLBK9aKatpkrIYtla12DRL9syhS/Jg0IkJGV97FiaI6zdevFZdtEwu05IaoxCx/hX9gnxcligfGqgmQG/e2oq75Ly9UgqxNlwz+iWV0Ux/XcOPZaekdHxg1VlLf6EndxWHlyVm96SWi8PNKZ3FlcJSmgpjDcgn2JEB05b9sPgmyP46kmhAmbcQ3KcTKraZxOybYP/LieNYDN+RKvIy7DvyxP5qKExnRg7ypOtYH3wr/IkC1l7UpGqwYMVdh+U7JpFLQLU3OMUCg/PyyjizTxtA/SAZt2Wp0OGgwzDPwg8S5MVoDJ82TQIp/uQqS0DLDFIxklcZXW8PkKFfPMpzP0vClBf4iAQsFXO4HqyBvLJwBdl/B2LlXktGCzoYW4ELF+ThO3+BOyD6N2F7xW/4D+Z995xrB4p00RatjKebEspUxYhB046t4h00Ivpm4j7Nc1y9/KOI3u1SDGJ4GnlM3Jytyh3z3LH4LUFZ2RNSQtOBczAF07+LZ1nw4UZYcXCjcGUAp7lbZEgm3bQFjdwJhQJvyAM9fbgpm/GhhXsBEm+Y9jXQvcCXNf4DaK7qIM2KI9Ti5Vyw9ey0J+tt/8d+/ujFKx0n8n69JTE8pi8NwAtTaw/zqcY335jx9MeGfeiM4doLRyPzuULGTageTT8Szvd+yHqQzOhi/eq9ieh2R2n890C2sZI/j8VFbNk6pIxUyg5+RB7WrJ1T91RHc2ixISXaPYPrY1jSBq96GIu7WuyyIom2BLvMrCCcv2gRb+F2Fsqdj28CZ5QQUrEyxIWkRF2xGad1kGIWwp0Ok1Pocw+tfI0rp9Fxx5hQJVrTlO9de+uiCh1ru6RinWWOk23KbmRcLlyzqaS0paxIrAcpZ+R4DdKCyuuOvwFEzaiNhGnFZvS/0vGovplTyV/W84cRHwxUzFRpGK3xwBnUasl356lLUmk2NOwPMXI41aFCCIMpRUHIb5LyTkoUy2RzeHRGL6xCHyUZnSrhoc+tywOdDOWExk4hfZKvfKJT7hGv++OOPeTPFvTr6xITFgRT1pqeTjLzU7Q4ek3VUuusF6iTkJtqYrx0NYzRx6j5hefRkDGpBwHc/eI64YBBltaVQ/8Fy51BT3+qAWUOj4iyPm2J5HgA/ejctLuiiiwkE4zHatYRO10QJsx9J0PMrYxR51dRTn2SISf+5AQ8fF2cnOtOZP0NlSi5o0h9OrjdDo3cjMBOf7g7d9QB29MgGuYMN8BJg2QJORDIKCp2OHtRPYHDkI6zrfQYWY/vzLBkxNhKcMJzSak4LLh6qOj1S9Fui5E2rqHyYfpb704ZFxDW92PKRpvqeZhrnqjbxkzboxNkxVBoS/FlNjsihVPfkBj/j2hWl+eAvZ8e2GYcb33sl3II4VdKfDcWU4AkUiHQX4wi0t5mgFpN4f84xZoJij5xz5uqLcw3XT1pkB6xbATnNZT9wCtKNC2Mkxm7tiZqzsBqCCIuAc089jI3Q6xLCF1K108aHqaFeaQpPZmBGJZBXwl8TVtMTAm+cLVlLArxjoxWVAqWFh3xtFKFERtuRUYexRabYsnTq1lASxzHWWEkBAOIgedh8ckTt843Xy9rA/Zcd04fItC6dGc/p7jBGTPaSi1EiHFapJJVAL4VrHIiRkehWArbkAnhDzOCznrK93AnSZCPFxU0hMYJA+D0Dl2zJnLbx8wRB/yLxP0BbH96se2D/SYqVGxCXgOOsKgnkpTwb1+m6IrxVuGLf9DbWkI9W5dYSafST1YvJN218z5f4Rz6+nfcrVGbrgT5AyHVUN1E51Pr9TrI7NVpUB3byyQJ/g0PEcWGP7HTH/OH5oNvvR3Xwe8gKxKAPIBu8UPNdp8swpf+uuJ0/Zbw29Ywz34cW1mykkkSOD1qqoTm8utw/VUpgGFACoYdi83K6YWQrrbAqbvcZ+IHAgv8bk66+VJpVrYtCp/8eg+1zZfiFBxHrqFCuR7gaUFsI95fTL1GVy4zjjXhgWSsxe3h2u9jFrP/DslLZ0ZawbxUDj4uEfkDaeeFgt25CnW1ek33Nggu7JWOX7eKdsOaSZ8i/p7Pjmo6LemR5kv3V5jM+8YtTID1oa4NSRZ3JbPBCOYHWL5CicVODlW9z59IMZZgcm6H5+UVthhgYnYw8y0zJqiEwyD4YVRZ4chesojjKI3DfzB/GkWFNNhAobU2YzB08+3dmrye9CjXRv9fYv8s67FtsAucPOzfJDxWSUovcYM9lWaqGZoQSNCeRPIzVRH9foyUzp0djxIF82hxvPLJ9TbKxU7MgPA9IyGPq9CsgvfJXUAyy7ZMUAPJ/rAaWktMnwO3gPSlMxy7g3eETJrdk9NIQcAn7p5TDrDdEvrBcVROufSqC+5cd0Yu6sk9FioCz1uyvmrVMGyrarFJ4Y6I8R7YV8PgA9YxIFKsdpdpyWodozTQxO9MBSzetyMaCkjrVJjZ4IGDkJ5pbyRMGSKeKTDxoybUNIN4JB5twwYd96ArLiTCtqY5Xcve2pNOpzdwKNn9lfN25+3XmrxSsCLKPVpWiyfreUzSiEWv3+Snn5q5CxhIj7jLT8oUcrmspW9mHPvRe/bc8nLccfE8zdwhFqZ475C+p2JQkF+4BcCYZYE0mZ+aGATAyjZbIuzo2H3FVHODzeBZxgKk7d') }} + cert_key64: {{ salt.nacl.dec('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')}} + wildcard_cert64: {{ salt.nacl.dec('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') }} + wildcard_cert_key64: {{ salt.nacl.dec('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')}} apps: - name: k8s-deploy-test replicas: 1 diff --git a/salt/environments/dev/states/deployment/k8s/v1_0/init.sls b/salt/environments/dev/states/deployment/k8s/v1_0/init.sls index ea6d29f..f46d441 100644 --- a/salt/environments/dev/states/deployment/k8s/v1_0/init.sls +++ b/salt/environments/dev/states/deployment/k8s/v1_0/init.sls @@ -31,7 +31,7 @@ domain_test_pillar: - present: - {{ client_id }}:deployment:k8s:domain:name - {{ client_id }}:deployment:k8s:domain:cert64 - - {{ client_id }}:deployment:k8s:domain:cert_key64 + - {{ client_id }}:deployment:k8s:domain:wildcard_cert_key64 - failhard: true {%- set _auth = salt.pillar.get([client_id, 'authentication', _cluster.provider]|join(':')) %} @@ -92,9 +92,11 @@ nginx_ingress_deploy: {%- set apps_namespace = client_id|replace('_','-') %} # Setup Certificates -{%- set cert_file = [base_app_dir, client_id + "_cert.pem"] | join("/") %} -{%- set cert_key = [base_app_dir, client_id + "_cert.key"] | join("/") %} -{{ cert_file }}: +{%- set root_cert_file = [base_app_dir, client_id + "_root_cert.pem"] | join("/") %} +{%- set root_cert_key = [base_app_dir, client_id + "_root_cert.key"] | join("/") %} +{%- set wildcard_cert_file = [base_app_dir, client_id + "_cert.pem"] | join("/") %} +{%- set wildcard_cert_key = [base_app_dir, client_id + "_cert.key"] | join("/") %} +{{ root_cert_file }}: file.managed: - template: jinja - source: salt://{{tpldir}}/templates/base64_decode.j2 @@ -102,7 +104,7 @@ nginx_ingress_deploy: - defaults: content: {{ _deploy.domain.cert64 }} -{{ cert_key }}: +{{ root_cert_key }}: file.managed: - template: jinja - source: salt://{{tpldir}}/templates/base64_decode.j2 @@ -110,6 +112,24 @@ nginx_ingress_deploy: - defaults: content: {{ _deploy.domain.cert_key64 }} +{%- if _deploy.domain.wildcard_cert64 is defined %} +{{ wildcard_cert_file }}: + file.managed: + - template: jinja + - source: salt://{{tpldir}}/templates/base64_decode.j2 + - failhard: true + - defaults: + content: {{ _deploy.domain.wildcard_cert64 }} + +{{ wildcard_cert_key }}: + file.managed: + - template: jinja + - source: salt://{{tpldir}}/templates/base64_decode.j2 + - failhard: true + - defaults: + content: {{ _deploy.domain.wildcard_cert_key64 }} +{%- endif %} + # Setup EFS Provisioner # https://github.com/kubernetes-incubator/external-storage/tree/master/aws/efs {%- set efs_yaml = [base_app_dir, client_id + "_efs.yaml"] | join("/") %} @@ -244,7 +264,8 @@ nginx_ingress_deploy: {{ ingress_service }}_deploy: cmd.run: - name: | - kubectl create secret tls {{ _deploy.domain.name }} --key {{ cert_key }} --cert {{ cert_file }} -n {{ apps_namespace }} + {% if _deploy.domain.wildcard_cert64 is defined %}kubectl create secret tls wildcard.{{ _deploy.domain.name }} --key {{ wildcard_cert_key }} --cert {{ wildcard_cert_file }} -n {{ apps_namespace }}{% endif %} + kubectl create secret tls {{ _deploy.domain.name }} --key {{ root_cert_key }} --cert {{ root_cert_file }} -n {{ apps_namespace }} kubectl apply -f {{ ingress_service }} -n {{ apps_namespace }} - env: - PATH: {{ path_var }} @@ -253,8 +274,8 @@ nginx_ingress_deploy: - AWS_SECRET_ACCESS_KEY: {{ _auth.saltstack.aws_secret_access_key}} - require: - {{ kubeconfig }} - - {{ cert_key }} - - {{ cert_file }} + - {{ wildcard_cert_key }} + - {{ wildcard_cert_file }} - {{ ingress_service }} {%- for app in _deploy.apps %} - {{ app.name }}_deploy @@ -280,19 +301,21 @@ nginx_ingress_deploy: {% for app in _deploy.apps %} {{ app.name }}_{{ client_id }}_dns: - dnsimple.cname_present: + dnsimple.{%- if app.root_application is defined and app.root_application %}alias{% else %}cname{% endif %}_present: - client_id: {{ client_id }} - domain: {{ _deploy.domain.name }} + {%- if app.root_application is defined and app.root_application %} + - name: "" + {% else %} - name: {{ app.name }} + {%- endif %} - content_file: {{ _configs.work_dir+"/"+ client_id + "/external_ip" }} - require: - {{ client_id }}_get_external_ip - domain_test_pillar {% endfor %} - {% for job in _deploy.job %} - {%- set env_vars = {} -%} {%- if job.requires_database is defined and job.requires_database -%} {%- set rds_name = _cluster.cluster_name|replace('-','') -%} # As defined in rds_configs.j2 diff --git a/salt/environments/dev/states/deployment/k8s/v1_0/templates/ingress_service.yaml.j2 b/salt/environments/dev/states/deployment/k8s/v1_0/templates/ingress_service.yaml.j2 index b44e1d0..7affcf9 100644 --- a/salt/environments/dev/states/deployment/k8s/v1_0/templates/ingress_service.yaml.j2 +++ b/salt/environments/dev/states/deployment/k8s/v1_0/templates/ingress_service.yaml.j2 @@ -11,17 +11,40 @@ metadata: nginx.ingress.kubernetes.io/use-proxy-protocol: "true" spec: tls: - - hosts: + {%- set apps_on_wildcard = [] %} + {%- set apps_on_root = [] %} {%- for app in apps %} + {%- if app.root_application is defined and app.root_application %} + {%- do apps_on_root.append(app) %} + {%- else %} + {%- do apps_on_wildcard.append(app) %} + {%- endif %} + {%- endfor -%} + + {%- if apps_on_wildcard is defined %} + - hosts: + {%- for app in apps_on_wildcard %} {%- if app.public_access is defined and app.public_access %} - {{ app.name }}.{{ domain }} {%- endif %} + {%- endfor %} + secretName: wildcard.{{ domain }} + {%- endif -%} + + {%- if apps_on_wildcard is defined %} + - hosts: + {%- for app in apps_on_root %} + {%- if app.public_access is defined and app.public_access %} + - {{ domain }} + {%- endif %} {%- endfor %} secretName: {{ domain }} + {%- endif %} + rules: {%- for app in apps %} {%- if app.public_access is defined and app.public_access %} - - host: {{ app.name }}.{{ domain }} + - host: {% if app.root_application is defined and app.root_application %}{{ domain }}{% else %}{{ app.name }}.{{ domain }}{% endif %} http: paths: - path: {% if app.path is defined %}{{app.path}}{% else %}/{% endif %} diff --git a/salt/ext/_modules/dns_dnsimple/__init__.py b/salt/ext/_modules/dns_dnsimple/__init__.py index 3a9994b..446a2fb 100644 --- a/salt/ext/_modules/dns_dnsimple/__init__.py +++ b/salt/ext/_modules/dns_dnsimple/__init__.py @@ -20,3 +20,15 @@ def cname_record_add(client_id, domain, name, content): def cname_record_update(client_id, domain, name, content): return DNSimpleProvider(account_id=_confs(client_id).get('account_id'), api_token=_confs(client_id).get('api_token')).cname_record_update(domain=domain, name=name, content=content) + + +def alias_record_exists(client_id, domain, name): + return DNSimpleProvider(account_id=_confs(client_id).get('account_id'), api_token=_confs(client_id).get('api_token')).alias_record_exists(domain=domain, name=name) + + +def alias_record_add(client_id, domain, name, content): + return DNSimpleProvider(account_id=_confs(client_id).get('account_id'), api_token=_confs(client_id).get('api_token')).alias_record_add(domain=domain, name=name, content=content) + + +def alias_record_update(client_id, domain, name, content): + return DNSimpleProvider(account_id=_confs(client_id).get('account_id'), api_token=_confs(client_id).get('api_token')).alias_record_update(domain=domain, name=name, content=content) diff --git a/salt/ext/_modules/dns_dnsimple/provider.py b/salt/ext/_modules/dns_dnsimple/provider.py index 8c6b8f8..da68d6e 100755 --- a/salt/ext/_modules/dns_dnsimple/provider.py +++ b/salt/ext/_modules/dns_dnsimple/provider.py @@ -43,3 +43,41 @@ def rfilter(x): return {'result': False, 'data': str(e)} except IndexError: return {'result': False, 'data': 'record not found'} + + def alias_record_exists(self, domain, name=None): + records = self.dnsimple_client.records(domain) + try: + def rfilter(x): + rtype, rname, rzoneid = x.get('record').get('type'), x.get('record').get('name'), x.get('record').get('zone_id') + return rtype == "ALIAS" and (rname == name if (name and name != "") else True) and (rzoneid == domain) + record = list(filter(rfilter, records))[0] + return record + except DNSimpleException as e: + return {'result': True, 'data': '{}{} alias not found'.format(name + '.' if name else '', domain)} + except IndexError as e: + return {'result': True, 'data': '{} alias not found'.format(name + '.' if name else '', domain)} + + def alias_record_add(self, domain, name, content): + try: + return {'result': True, 'data': self.dnsimple_client.add_record(domain, {'type': 'ALIAS', 'name': name, 'content': content})} + except DNSimpleException as e: + return {'result': False, 'data': str(e)} + + def alias_record_update(self, domain, name=None, content=""): + records = self.dnsimple_client.records(domain) + try: + def rfilter(x): + rtype, rname, rzoneid = x.get('record').get('type'), x.get('record').get('name'), x.get('record').get('zone_id') + return rtype == "ALIAS" and (rname == name if (name and name != "") else True) and (rzoneid == domain) + log.error(">>>>>>>>") + log.error(domain) + log.error(name) + log.error(content) + log.error(records) + record_id = list(filter(rfilter, records))[0].get('record').get('id') + log.error(list(filter(rfilter, records))[0].get('record')) + return {'result': True, 'data': self.dnsimple_client.update_record(domain, record_id, {'content': content})} + except DNSimpleException as e: + return {'result': False, 'data': str(e)} + except IndexError: + return {'result': False, 'data': 'record not found'} diff --git a/salt/ext/_states/dnsimple.py b/salt/ext/_states/dnsimple.py index 472ed54..8e3164a 100644 --- a/salt/ext/_states/dnsimple.py +++ b/salt/ext/_states/dnsimple.py @@ -24,3 +24,22 @@ def execute(op): return result_dict(__salt__['dns_dnsimple.cname_record_{0}'.format(op)](client_id=client_id, domain=domain, name=name, content=content)) return execute('update') if exists() else execute('add') + + +def alias_present(client_id, domain, name=None, content_file=None): + content = open(content_file, "r").read() if content_file else None + + def result_dict(result): + return { + 'name': 'alias_present', + 'result': result.get('result'), + 'changes': result.get('data') if result.get('result') else {}, + 'comment': result.get('data') if not result.get('result') else ''} + + def exists(): + return __salt__['dns_dnsimple.alias_record_exists'](client_id=client_id, domain=domain, name=name) + + def execute(op): + return result_dict(__salt__['dns_dnsimple.alias_record_{0}'.format(op)](client_id=client_id, domain=domain, name=name, content=content)) + + return execute('update') if exists() else execute('add')