From 720ed1a5e8feba9895072c3c2271319e021894ea Mon Sep 17 00:00:00 2001 From: Michaela Mattes Date: Thu, 14 Sep 2023 13:54:13 +0200 Subject: [PATCH 1/2] refactor module --- .github/release-drafter.yml | 52 --- .github/settings.json | 18 + .github/workflows/codespell.yml | 12 + .github/workflows/linting.yml | 12 + .github/workflows/prettier-md.yml | 24 -- .github/workflows/release.yml | 89 +---- .github/workflows/settings.yml | 18 + .github/workflows/terraform.yml | 23 -- .github/workflows/terrascan.yml | 18 + .github/workflows/terratest.yml | 21 ++ .terraform-docs.yml | 46 --- LICENSE | 562 ++++++++++++++++-------------- default.json | 12 + examples/.tflint.hcl | 9 + examples/apply_main.tf | 50 +++ examples/full_main.tf | 90 +++++ examples/main.tf | 80 ----- examples/min_main.tf | 50 +++ main.tf | 60 +++- outputs.tf | 84 +++-- renovate.json | 4 +- tests/terratest.yaml | 3 + variables.tf | 86 +++-- versions.tf | 4 +- 24 files changed, 786 insertions(+), 641 deletions(-) delete mode 100644 .github/release-drafter.yml create mode 100644 .github/settings.json create mode 100644 .github/workflows/codespell.yml create mode 100644 .github/workflows/linting.yml delete mode 100644 .github/workflows/prettier-md.yml create mode 100644 .github/workflows/settings.yml delete mode 100644 .github/workflows/terraform.yml create mode 100644 .github/workflows/terrascan.yml create mode 100644 .github/workflows/terratest.yml delete mode 100644 .terraform-docs.yml create mode 100644 default.json create mode 100644 examples/.tflint.hcl create mode 100644 examples/apply_main.tf create mode 100644 examples/full_main.tf delete mode 100644 examples/main.tf create mode 100644 examples/min_main.tf create mode 100644 tests/terratest.yaml diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index b9fa321..0000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -# Format and labels used aim to match those used by Ansible project -name-template: '$RESOLVED_VERSION' -tag-template: '$RESOLVED_VERSION' -categories: - - title: 'Major Changes' - labels: - - 'major' # c6476b - - title: 'Minor Changes' - labels: - - 'feature' # 006b75 - - 'enhancement' # ededed - - 'refactoring' - - title: 'Bugfixes' - labels: - - 'bug' # fbca04 - - title: 'Deprecations' - labels: - - 'deprecated' # fef2c0 -exclude-labels: - - 'skip-changelog' - - 'duplicate' -version-resolver: - major: - labels: - - 'major' - minor: - labels: - - 'minor' - - 'feature' - - 'enhancement' - - 'refactoring' - patch: - labels: - - 'patch' - - 'bug' - - 'deprecated' - default: patch -autolabeler: - - label: 'skip-changelog' - title: '/chore/i' - - label: 'bug' - title: '/fix/i' - - label: 'enhancement' - title: '/(enhance|improve)/i' - - label: 'feature' - title: '/feature/i' - - label: 'dreprecated' - title: '/deprecat/i' -template: | - $CHANGES - Kudos goes to: $CONTRIBUTORS diff --git a/.github/settings.json b/.github/settings.json new file mode 100644 index 0000000..529e95f --- /dev/null +++ b/.github/settings.json @@ -0,0 +1,18 @@ +{ + "repos": { + "description": "A Terraform module that manages the container resources from the azurerm provider.", + "visibility": "public", + "default_branch": "main", + "homepage": "https://telekom-mms.github.io/terraform-template", + "topics": [ + "terraform", + "azure", + "azurerm-dns-zone", + "azurerm-private-dns-zone", + "azurerm-dns-a-record", + "azurerm-dns-cname-record", + "azurerm-dns-txt-record", + "azurerm-dns-mx-record" + ] + } +} diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 0000000..c39d7a4 --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,12 @@ +--- +name: codespell + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + call-codespell: + uses: telekom-mms/.github/.github/workflows/codespell.yml@main diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000..412fa25 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,12 @@ +--- +name: linting + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + call-linting: + uses: telekom-mms/.github/.github/workflows/terraform_linting.yml@main diff --git a/.github/workflows/prettier-md.yml b/.github/workflows/prettier-md.yml deleted file mode 100644 index 95ea268..0000000 --- a/.github/workflows/prettier-md.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -# https://github.com/creyD/prettier_action -name: Prettier markdown files - -on: - push: - paths: - - '**.md' - -jobs: - prettier-md: - runs-on: ubuntu-latest - timeout-minutes: 1 - - steps: - - name: Git checkout - uses: actions/checkout@v3 - with: - ref: ${{ github.head_ref }} - - - name: Prettify code - uses: creyD/prettier_action@v4.2 - with: - prettier_options: --write {**/*,*}.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 076d98c..8cdf6ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,80 +1,19 @@ --- -name: New release +name: release -on: # yamllint disable-line rule:truthy - workflow_dispatch: +on: push: - branches: - - main + branches: [main] -jobs: - generate_changelog: - runs-on: ubuntu-latest - name: create release draft - steps: - - uses: actions/checkout@v3.2.0 - with: - fetch-depth: 0 - - - name: 'Get Previous tag' - id: previoustag - uses: "WyriHaximus/github-action-get-previous-tag@master" - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - - - name: calculate next version - id: version - uses: patrickjahns/version-drafter-action@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Generate changelog - uses: charmixer/auto-changelog-action@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - future_release: ${{ steps.version.outputs.next-version }} - - - name: Generate readme - uses: terraform-docs/gh-actions@main - with: - working-dir: . - output-file: README.md - output-method: inject +env: + TEMPLATE_REPOSITORY: telekom-mms/terraform-template - - name: push changelog and readme - uses: github-actions-x/commit@v2.9 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - push-branch: 'main' - commit-message: 'update changelog' - force-add: 'true' - files: CHANGELOG.md README.md - name: T-Systems MMS - email: frage@t-systems-mms.com - - # do a second checkout to prevent race situation - # changelog gets updated but action works on old commit id - - uses: actions/checkout@v3.2.0 - with: - ref: main - - - name: Generate changelog for the release - run: | - sed '/## \[${{ steps.previoustag.outputs.tag }}\]/Q' CHANGELOG.md > CHANGELOGRELEASE.md - - name: Read CHANGELOG.md - id: package - uses: juliangruber/read-file-action@v1 - with: - path: ./CHANGELOGRELEASE.md - - - name: Create Release draft - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token - with: - release_name: ${{ steps.version.outputs.next-version }} - tag_name: ${{ steps.version.outputs.next-version }} - body: | - ${{ steps.package.outputs.content }} - draft: true +jobs: + call-readme: + if: github.repository != '$TEMPLATE_REPOSITORY' + uses: telekom-mms/.github/.github/workflows/terraform_docs.yml@main + call-release: + if: github.repository != '$TEMPLATE_REPOSITORY' + uses: telekom-mms/.github/.github/workflows/release.yml@main + with: + files: README.md diff --git a/.github/workflows/settings.yml b/.github/workflows/settings.yml new file mode 100644 index 0000000..f1b9ecb --- /dev/null +++ b/.github/workflows/settings.yml @@ -0,0 +1,18 @@ +--- +name: settings + +on: + push: + branches: [main] + schedule: + - cron: '0 10 * * *' + +env: + TEMPLATE_REPOSITORY: telekom-mms/terraform-template + +jobs: + call-settings: + if: github.repository != '$TEMPLATE_REPOSITORY' + uses: telekom-mms/.github/.github/workflows/github_repository.yml@main + secrets: + GH_APP_CREDENTIALS_TOKEN: ${{ secrets.GH_APP_CREDENTIALS_TOKEN }} diff --git a/.github/workflows/terraform.yml b/.github/workflows/terraform.yml deleted file mode 100644 index 06826e6..0000000 --- a/.github/workflows/terraform.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- -name: Terraform - -on: [push, pull_request] - -jobs: - terraform-lint: - runs-on: ubuntu-latest - - steps: - # Important: This sets up your GITHUB_WORKSPACE environment variable - - uses: actions/checkout@v3 - - uses: hashicorp/setup-terraform@v2 - - - name: fmt - run: terraform fmt -recursive -check - continue-on-error: true - - - name: init - run: terraform init - - - name: validate - run: terraform validate -no-color diff --git a/.github/workflows/terrascan.yml b/.github/workflows/terrascan.yml new file mode 100644 index 0000000..8fc508c --- /dev/null +++ b/.github/workflows/terrascan.yml @@ -0,0 +1,18 @@ +--- +name: terrascan + +on: + pull_request: + branches: [main] + +env: + TEMPLATE_REPOSITORY: telekom-mms/terraform-template + +jobs: + call-terrascan: + if: github.repository != '$TEMPLATE_REPOSITORY' + uses: telekom-mms/.github/.github/workflows/terrascan.yml@main + with: + iac_type: terraform + policy_type: all + non_recursive: true diff --git a/.github/workflows/terratest.yml b/.github/workflows/terratest.yml new file mode 100644 index 0000000..c1e7547 --- /dev/null +++ b/.github/workflows/terratest.yml @@ -0,0 +1,21 @@ +--- +name: terratest + +on: + pull_request: + branches: [main] + +env: + TEMPLATE_REPOSITORY: telekom-mms/terraform-template + +jobs: + call-terratest: + if: github.repository != '$TEMPLATE_REPOSITORY' + uses: telekom-mms/.github/.github/workflows/terratest.yml@main + with: + test: azure + secrets: + azure_client_id: ${{ secrets.AZURE_CLIENT_ID }} + azure_client_secret: ${{ secrets.AZURE_CLIENT_SECRET }} + azure_subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + azure_tenant_id: ${{ secrets.AZURE_TENANT_ID }} diff --git a/.terraform-docs.yml b/.terraform-docs.yml deleted file mode 100644 index 90d78d0..0000000 --- a/.terraform-docs.yml +++ /dev/null @@ -1,46 +0,0 @@ -formatter: template - -sections: - show: - - header - - requirements - - providers - - resources - - modules - - inputs - - outputs - - footer - -content: |- - {{ .Header }} - - <-- This file is autogenerated, please do not change. --> - - {{ .Requirements }} - - {{ .Providers }} - - {{ .Resources }} - - {{ .Inputs }} - - {{ .Outputs }} - - ## Examples - - ```hcl - {{ include "examples/main.tf" }} - ``` - -sort: - enabled: true - by: required - -settings: - indent: 2 - hide-empty: true - anchor: false - escape: false - required: true - type: true - read-comments: true diff --git a/LICENSE b/LICENSE index 82b4de9..a612ad9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,353 +1,373 @@ -Mozilla Public License, version 2.0 +Mozilla Public License Version 2.0 +================================== 1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. 2. License Grants and Conditions +-------------------------------- 2.1. Grants - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. 2.2. Effective Date - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. 2.3. Limitations on Grant Scope - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: - a. for any code that a Contributor has removed from Covered Software; or +(a) for any code that a Contributor has removed from Covered Software; + or - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). 2.4. Subsequent Licenses - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). 2.5. Representation - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. 2.7. Conditions - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. 3. Responsibilities +------------------- 3.1. Distribution of Source Form - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. 3.2. Distribution of Executable Form - If You distribute Covered Software in Executable Form then: +If You distribute Covered Software in Executable Form then: - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). 3.4. Notices - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. 4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. 5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ 8. Litigation +------------- - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. 9. Miscellaneous +---------------- - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. 10. Versions of the License +--------------------------- 10.1. New Versions - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. 10.2. Effect of New Versions - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. 10.3. Modified Versions - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice +------------------------------------------- - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. You may add additional accurate notices of copyright ownership. -Exhibit B - “Incompatible With Secondary Licenses” Notice +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/default.json b/default.json new file mode 100644 index 0000000..817fd1c --- /dev/null +++ b/default.json @@ -0,0 +1,12 @@ +{ + "regexManagers": [ + { + "description": "Update Terraform Versions", + "fileMatch": ["^versions\\.tf$"], + "matchStrings": [ + "\\s*#\\s*renovate:\\s*datasource=(?.*?) depName=(?.*?)?\\s.*?version\\s.*=\\s.*\"(>=|<=|)(?.*)\"" + ], + "versioningTemplate": "{{#if versioning}}{{versioning}}{{else}}semver{{/if}}" + } + ] +} diff --git a/examples/.tflint.hcl b/examples/.tflint.hcl new file mode 100644 index 0000000..78bf102 --- /dev/null +++ b/examples/.tflint.hcl @@ -0,0 +1,9 @@ +rule "terraform_required_providers" { + enabled = false +} +rule "terraform_required_version" { + enabled = false +} +rule "terraform_module_version" { + enabled = false +} diff --git a/examples/apply_main.tf b/examples/apply_main.tf new file mode 100644 index 0000000..513e6c2 --- /dev/null +++ b/examples/apply_main.tf @@ -0,0 +1,50 @@ +module "dns" { + source = "registry.terraform.io/telekom-mms/dns/azurerm" + dns_zone = { + "mms-github-plattform.com" = { + resource_group_name = "rg-mms-github" + } + } + private_dns_zone = { + "mms-github-privat-plattform.com" = { + resource_group_name = "rg-mms-github" + } + } + dns_a_record = { + "@" = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + records = ["127.0.0.2"] + } + } + dns_cname_record = { + www = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = module.dns.dns_a_record["@"].fqdn + } + } + dns_txt_record = { + dnsauth = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = { + frontdoor = { + value = "frontdoor" + } + } + } + } + dns_mx_record = { + mail = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = { + mail1 = { + preference = 10 + exchange = "mail1.telekom-mms.com" + } + } + } + } +} diff --git a/examples/full_main.tf b/examples/full_main.tf new file mode 100644 index 0000000..d10fa75 --- /dev/null +++ b/examples/full_main.tf @@ -0,0 +1,90 @@ +module "dns" { + source = "registry.terraform.io/telekom-mms/dns/azurerm" + dns_zone = { + "mms-github-plattform.com" = { + resource_group_name = "rg-mms-github" + soa_record = { + email = "telekom-mms.com" + } + tags = { + project = "mms-github" + environment = terraform.workspace + managed-by = "terraform" + } + } + } + private_dns_zone = { + "mms-github-privat-plattform.com" = { + resource_group_name = "rg-mms-github" + soa_record = { + email = "telekom-mms.com" + } + tags = { + project = "mms-github" + environment = terraform.workspace + managed-by = "terraform" + } + } + } + dns_a_record = { + "@" = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + records = ["127.0.0.2"] + tags = { + project = "mms-github" + environment = terraform.workspace + managed-by = "terraform" + } + } + } + dns_cname_record = { + www = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = module.dns.dns_a_record["@"].fqdn + tags = { + project = "mms-github" + environment = terraform.workspace + managed-by = "terraform" + } + } + } + dns_txt_record = { + dnsauth = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = { + frontdoor = { + value = "frontdoor" + } + } + tags = { + project = "mms-github" + environment = terraform.workspace + managed-by = "terraform" + } + } + } + dns_mx_record = { + mail = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = { + mail1 = { + preference = 10 + exchange = "mail1.telekom-mms.com" + } + mail2 = { + preference = 20 + exchange = "mail2.telekom-mms.com" + } + } + tags = { + project = "mms-github" + environment = terraform.workspace + managed-by = "terraform" + } + } + } +} diff --git a/examples/main.tf b/examples/main.tf deleted file mode 100644 index 0cb3018..0000000 --- a/examples/main.tf +++ /dev/null @@ -1,80 +0,0 @@ -module "dns" { - source = "registry.terraform.io/T-Systems-MMS/dns/azurerm" - dns_zone = { - domain_com = { - name = "domain.com" - resource_group_name = "service-infrastructure-rg" - tags = { - service = "service_name" - } - } - domain_de = { - name = "domain.de" - resource_group_name = "service-infrastructure-rg" - tags = { - service = "service_name" - } - } - } - private_dns_zone = { - private_domain_com = { - name = "private.domain.com" - resource_group_name = "service-infrastructure-rg" - tags = { - service = "service_name" - } - } - } - dns_a_record = { - srv_01 = { - name = "srv01.domain.com" - resource_group_name = "service-infrastructure-rg" - zone_name = "domain.com" - records = [ - "172.16.10.10" - ] - tags = { - service = "service_name" - } - } - } - dns_cname_record = { - svc_domain_de = { - name = "service" - resource_group_name = "service-infrastructure-rg" - zone_name = "domain.com" - record = "service.domain.de" - tags = { - service = "service_name" - } - } - } - dns_txt_record = { - txt_domain_com = { - name = "txt1.domain.com" - resource_group_name = "service-infrastructure-rg" - zone_name = "domain.com" - record = { - auth1 = "1234" - auth2 = "7890" - } - tags = { - service = "service_name" - } - } - } - dns_mx_record = { - smtp_domain_com = { - name = "smtp.domain.com" - resource_group_name = "service-infrastructure-rg" - zone_name = "domain.com" - record = { - preference = 10 - exchange = "smtp.domain.com" - } - tags = { - service = "service_name" - } - } - } -} diff --git a/examples/min_main.tf b/examples/min_main.tf new file mode 100644 index 0000000..513e6c2 --- /dev/null +++ b/examples/min_main.tf @@ -0,0 +1,50 @@ +module "dns" { + source = "registry.terraform.io/telekom-mms/dns/azurerm" + dns_zone = { + "mms-github-plattform.com" = { + resource_group_name = "rg-mms-github" + } + } + private_dns_zone = { + "mms-github-privat-plattform.com" = { + resource_group_name = "rg-mms-github" + } + } + dns_a_record = { + "@" = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + records = ["127.0.0.2"] + } + } + dns_cname_record = { + www = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = module.dns.dns_a_record["@"].fqdn + } + } + dns_txt_record = { + dnsauth = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = { + frontdoor = { + value = "frontdoor" + } + } + } + } + dns_mx_record = { + mail = { + resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = { + mail1 = { + preference = 10 + exchange = "mail1.telekom-mms.com" + } + } + } + } +} diff --git a/main.tf b/main.tf index 3ded8cf..0c63ec8 100644 --- a/main.tf +++ b/main.tf @@ -1,31 +1,61 @@ /** - * # dns - * - * This module manages Azure DNS Zones. - * +* # dns +* +* This module manages the hashicorp/azurerm dns resources. +* For more information see https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs > dns +* */ -/** DNS Zone */ resource "azurerm_dns_zone" "dns_zone" { for_each = var.dns_zone name = local.dns_zone[each.key].name == "" ? each.key : local.dns_zone[each.key].name resource_group_name = local.dns_zone[each.key].resource_group_name + dynamic "soa_record" { + for_each = local.dns_zone[each.key].soa_record == null ? [] : [0] + + content { + email = local.dns_zone[each.key].soa_record.email + host_name = local.dns_zone[each.key].soa_record.host_name + expire_time = local.dns_zone[each.key].soa_record.expire_time + minimum_ttl = local.dns_zone[each.key].soa_record.minimum_ttl + refresh_time = local.dns_zone[each.key].soa_record.refresh_time + retry_time = local.dns_zone[each.key].soa_record.retry_time + serial_number = local.dns_zone[each.key].soa_record.serial_number + ttl = local.dns_zone[each.key].soa_record.ttl + tags = local.dns_zone[each.key].soa_record.tags + } + } + tags = local.dns_zone[each.key].tags } -/** Private DNS Zone */ resource "azurerm_private_dns_zone" "private_dns_zone" { for_each = var.private_dns_zone name = local.private_dns_zone[each.key].name == "" ? each.key : local.private_dns_zone[each.key].name resource_group_name = local.private_dns_zone[each.key].resource_group_name + dynamic "soa_record" { + for_each = local.private_dns_zone[each.key].soa_record == null ? [] : [0] + + content { + email = local.private_dns_zone[each.key].soa_record.email + host_name = local.private_dns_zone[each.key].soa_record.host_name + expire_time = local.private_dns_zone[each.key].soa_record.expire_time + minimum_ttl = local.private_dns_zone[each.key].soa_record.minimum_ttl + refresh_time = local.private_dns_zone[each.key].soa_record.refresh_time + retry_time = local.private_dns_zone[each.key].soa_record.retry_time + serial_number = local.private_dns_zone[each.key].soa_record.serial_number + ttl = local.private_dns_zone[each.key].soa_record.ttl + tags = local.private_dns_zone[each.key].soa_record.tags + } + } + tags = local.private_dns_zone[each.key].tags } -/** A Records */ resource "azurerm_dns_a_record" "dns_a_record" { for_each = var.dns_a_record @@ -39,7 +69,6 @@ resource "azurerm_dns_a_record" "dns_a_record" { tags = local.dns_a_record[each.key].tags } -/** CNAME Records */ resource "azurerm_dns_cname_record" "dns_cname_record" { for_each = var.dns_cname_record @@ -48,12 +77,11 @@ resource "azurerm_dns_cname_record" "dns_cname_record" { zone_name = local.dns_cname_record[each.key].zone_name ttl = local.dns_cname_record[each.key].ttl record = local.dns_cname_record[each.key].record + target_resource_id = local.dns_cname_record[each.key].target_resource_id tags = local.dns_cname_record[each.key].tags } - -/** TXT Records */ resource "azurerm_dns_txt_record" "dns_txt_record" { for_each = var.dns_txt_record @@ -64,6 +92,7 @@ resource "azurerm_dns_txt_record" "dns_txt_record" { dynamic "record" { for_each = local.dns_txt_record[each.key].record + content { value = local.dns_txt_record[each.key].record[record.key].value } @@ -72,7 +101,6 @@ resource "azurerm_dns_txt_record" "dns_txt_record" { tags = local.dns_txt_record[each.key].tags } -/** MX Records */ resource "azurerm_dns_mx_record" "dns_mx_record" { for_each = var.dns_mx_record @@ -81,9 +109,13 @@ resource "azurerm_dns_mx_record" "dns_mx_record" { zone_name = local.dns_mx_record[each.key].zone_name ttl = local.dns_mx_record[each.key].ttl - record { - preference = local.dns_mx_record[each.key].record.preference - exchange = local.dns_mx_record[each.key].record.exchange + dynamic "record" { + for_each = local.dns_mx_record[each.key].record + + content { + preference = local.dns_mx_record[each.key].record[record.key].preference + exchange = local.dns_mx_record[each.key].record[record.key].exchange + } } tags = local.dns_mx_record[each.key].tags diff --git a/outputs.tf b/outputs.tf index 7857680..aa77990 100644 --- a/outputs.tf +++ b/outputs.tf @@ -1,67 +1,101 @@ output "dns_zone" { - description = "azurerm_dns_zone results" + description = "Outputs all attributes of resource_type." value = { for dns_zone in keys(azurerm_dns_zone.dns_zone) : dns_zone => { - id = azurerm_dns_zone.dns_zone[dns_zone].id - name = azurerm_dns_zone.dns_zone[dns_zone].name - resource_group_name = azurerm_dns_zone.dns_zone[dns_zone].resource_group_name + for key, value in azurerm_dns_zone.dns_zone[dns_zone] : + key => value } } } + output "private_dns_zone" { - description = "azurerm_private_dns_zone results" + description = "Outputs all attributes of resource_type." value = { for private_dns_zone in keys(azurerm_private_dns_zone.private_dns_zone) : private_dns_zone => { - id = azurerm_private_dns_zone.private_dns_zone[private_dns_zone].id - number_of_record_sets = azurerm_private_dns_zone.private_dns_zone[private_dns_zone].number_of_record_sets - max_number_of_record_sets = azurerm_private_dns_zone.private_dns_zone[private_dns_zone].max_number_of_record_sets - soa_record = azurerm_private_dns_zone.private_dns_zone[private_dns_zone].soa_record + for key, value in azurerm_private_dns_zone.private_dns_zone[private_dns_zone] : + key => value } } } + output "dns_a_record" { - description = "azurerm_dns_a_record results" + description = "Outputs all attributes of resource_type." value = { for dns_a_record in keys(azurerm_dns_a_record.dns_a_record) : dns_a_record => { - id = azurerm_dns_a_record.dns_a_record[dns_a_record].id - name = azurerm_dns_a_record.dns_a_record[dns_a_record].name - fqdn = azurerm_dns_a_record.dns_a_record[dns_a_record].fqdn + for key, value in azurerm_dns_a_record.dns_a_record[dns_a_record] : + key => value } } } + output "dns_cname_record" { - description = "azurerm_dns_cname_record results" + description = "Outputs all attributes of resource_type." value = { for dns_cname_record in keys(azurerm_dns_cname_record.dns_cname_record) : dns_cname_record => { - id = azurerm_dns_cname_record.dns_cname_record[dns_cname_record].id - name = azurerm_dns_cname_record.dns_cname_record[dns_cname_record].name - fqdn = azurerm_dns_cname_record.dns_cname_record[dns_cname_record].fqdn + for key, value in azurerm_dns_cname_record.dns_cname_record[dns_cname_record] : + key => value } } } + output "dns_txt_record" { - description = "azurerm_dns_txt_record results" + description = "Outputs all attributes of resource_type." value = { for dns_txt_record in keys(azurerm_dns_txt_record.dns_txt_record) : dns_txt_record => { - id = azurerm_dns_txt_record.dns_txt_record[dns_txt_record].id - name = azurerm_dns_txt_record.dns_txt_record[dns_txt_record].name - fqdn = azurerm_dns_txt_record.dns_txt_record[dns_txt_record].fqdn + for key, value in azurerm_dns_txt_record.dns_txt_record[dns_txt_record] : + key => value } } } + output "dns_mx_record" { - description = "azurerm_dns_mx_record results" + description = "Outputs all attributes of resource_type." value = { for dns_mx_record in keys(azurerm_dns_mx_record.dns_mx_record) : dns_mx_record => { - id = azurerm_dns_mx_record.dns_mx_record[dns_mx_record].id - name = azurerm_dns_mx_record.dns_mx_record[dns_mx_record].name - fqdn = azurerm_dns_mx_record.dns_mx_record[dns_mx_record].fqdn + for key, value in azurerm_dns_mx_record.dns_mx_record[dns_mx_record] : + key => value + } + } +} + +output "variables" { + description = "Displays all configurable variables passed by the module. __default__ = predefined values per module. __merged__ = result of merging the default values and custom values passed to the module" + value = { + default = { + for variable in keys(local.default) : + variable => local.default[variable] + } + merged = { + dns_zone = { + for key in keys(var.dns_zone) : + key => local.dns_zone[key] + } + private_dns_zone = { + for key in keys(var.private_dns_zone) : + key => local.private_dns_zone[key] + } + dns_a_record = { + for key in keys(var.dns_a_record) : + key => local.dns_a_record[key] + } + dns_cname_record = { + for key in keys(var.dns_cname_record) : + key => local.dns_cname_record[key] + } + dns_txt_record = { + for key in keys(var.dns_txt_record) : + key => local.dns_txt_record[key] + } + dns_mx_record = { + for key in keys(var.dns_mx_record) : + key => local.dns_mx_record[key] + } } } } diff --git a/renovate.json b/renovate.json index a02bfd8..113848c 100644 --- a/renovate.json +++ b/renovate.json @@ -1,8 +1,10 @@ { "extends": [ "config:base", - ":dependencyDashboard" + "github>telekom-mms/terraform-template" ], + "dependencyDashboard": true, + "dependencyDashboardAutoclose": true, "packageRules": [ { "matchUpdateTypes": ["patch"], diff --git a/tests/terratest.yaml b/tests/terratest.yaml new file mode 100644 index 0000000..a36c138 --- /dev/null +++ b/tests/terratest.yaml @@ -0,0 +1,3 @@ +# see https://pkg.go.dev/github.com/gruntwork-io/terratest/modules/[package] +functions: [] +options: {} diff --git a/variables.tf b/variables.tf index f56d569..8b031db 100644 --- a/variables.tf +++ b/variables.tf @@ -31,55 +31,91 @@ variable "dns_mx_record" { locals { default = { - # resource definition + // resource definition dns_zone = { name = "" + soa_record = { + host_name = null + expire_time = null + minimum_ttl = null + refresh_time = null + retry_time = null + serial_number = null + ttl = null + tags = null + } tags = {} } private_dns_zone = { name = "" + soa_record = { + host_name = null + expire_time = null + minimum_ttl = null + refresh_time = null + retry_time = null + serial_number = null + ttl = null + tags = null + } tags = {} } dns_a_record = { name = "" - ttl = "900" + ttl = 3600 // define default records = null target_resource_id = null tags = {} } dns_cname_record = { - name = "" - ttl = "900" - record = "" - tags = {} + name = "" + ttl = 3600 // define default + record = null + target_resource_id = null + tags = {} } dns_txt_record = { - name = "" - ttl = "900" - records = {} - tags = {} + name = "" + ttl = 3600 // define default + tags = {} } dns_mx_record = { - name = "" - ttl = "900" - records = {} - tags = {} + name = "" + ttl = 3600 // define default + tags = {} } } - # compare and merge custom and default values - dns_txt_record_values = { - for dns_txt_record in keys(var.dns_txt_record) : - dns_txt_record => merge(local.default.dns_txt_record, var.dns_txt_record[dns_txt_record]) + // compare and merge custom and default values + dns_zone_values = { + for dns_zone in keys(var.dns_zone) : + dns_zone => merge(local.default.dns_zone, var.dns_zone[dns_zone]) } - # merge all custom and default values + private_dns_zone_values = { + for private_dns_zone in keys(var.private_dns_zone) : + private_dns_zone => merge(local.default.private_dns_zone, var.private_dns_zone[private_dns_zone]) + } + + // deep merge of all custom and default values dns_zone = { for dns_zone in keys(var.dns_zone) : - dns_zone => merge(local.default.dns_zone, var.dns_zone[dns_zone]) + dns_zone => merge( + local.dns_zone_values[dns_zone], + { + for config in ["soa_record"] : + config => keys(local.dns_zone_values[dns_zone][config]) == keys(local.default.dns_zone[config]) ? null : merge(local.default.dns_zone[config], local.dns_zone_values[dns_zone][config]) + } + ) } private_dns_zone = { for private_dns_zone in keys(var.private_dns_zone) : - private_dns_zone => merge(local.default.private_dns_zone, var.private_dns_zone[private_dns_zone]) + private_dns_zone => merge( + local.private_dns_zone_values[private_dns_zone], + { + for config in ["soa_record"] : + config => keys(local.private_dns_zone_values[private_dns_zone][config]) == keys(local.default.private_dns_zone[config]) ? null : merge(local.default.private_dns_zone[config], local.private_dns_zone_values[private_dns_zone][config]) + } + ) } dns_a_record = { for dns_a_record in keys(var.dns_a_record) : @@ -91,13 +127,7 @@ locals { } dns_txt_record = { for dns_txt_record in keys(var.dns_txt_record) : - dns_txt_record => merge( - local.dns_txt_record_values[dns_txt_record], - { - for config in ["records"] : - config => merge(local.default.dns_txt_record[config], local.dns_txt_record_values[dns_txt_record][config]) - } - ) + dns_txt_record => merge(local.default.dns_txt_record, var.dns_txt_record[dns_txt_record]) } dns_mx_record = { for dns_mx_record in keys(var.dns_mx_record) : diff --git a/versions.tf b/versions.tf index 972c38c..cfcb4fb 100644 --- a/versions.tf +++ b/versions.tf @@ -2,8 +2,8 @@ terraform { required_providers { azurerm = { source = "registry.terraform.io/hashicorp/azurerm" - version = ">=2.19.0" + version = ">=3.72.0" } } - required_version = ">=0.12" + required_version = ">=1.5" } From b82c0d493b7ab17d669929618149e686bc722bd5 Mon Sep 17 00:00:00 2001 From: Michaela Mattes Date: Thu, 14 Sep 2023 14:02:32 +0200 Subject: [PATCH 2/2] fmt --- examples/apply_main.tf | 12 ++++++------ examples/full_main.tf | 12 ++++++------ examples/min_main.tf | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/apply_main.tf b/examples/apply_main.tf index 513e6c2..b195218 100644 --- a/examples/apply_main.tf +++ b/examples/apply_main.tf @@ -13,21 +13,21 @@ module "dns" { dns_a_record = { "@" = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name - records = ["127.0.0.2"] + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + records = ["127.0.0.2"] } } dns_cname_record = { www = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name - record = module.dns.dns_a_record["@"].fqdn + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = module.dns.dns_a_record["@"].fqdn } } dns_txt_record = { dnsauth = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name record = { frontdoor = { value = "frontdoor" @@ -38,7 +38,7 @@ module "dns" { dns_mx_record = { mail = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name record = { mail1 = { preference = 10 diff --git a/examples/full_main.tf b/examples/full_main.tf index d10fa75..c4e0b78 100644 --- a/examples/full_main.tf +++ b/examples/full_main.tf @@ -29,8 +29,8 @@ module "dns" { dns_a_record = { "@" = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name - records = ["127.0.0.2"] + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + records = ["127.0.0.2"] tags = { project = "mms-github" environment = terraform.workspace @@ -41,8 +41,8 @@ module "dns" { dns_cname_record = { www = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name - record = module.dns.dns_a_record["@"].fqdn + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = module.dns.dns_a_record["@"].fqdn tags = { project = "mms-github" environment = terraform.workspace @@ -53,7 +53,7 @@ module "dns" { dns_txt_record = { dnsauth = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name record = { frontdoor = { value = "frontdoor" @@ -69,7 +69,7 @@ module "dns" { dns_mx_record = { mail = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name record = { mail1 = { preference = 10 diff --git a/examples/min_main.tf b/examples/min_main.tf index 513e6c2..b195218 100644 --- a/examples/min_main.tf +++ b/examples/min_main.tf @@ -13,21 +13,21 @@ module "dns" { dns_a_record = { "@" = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name - records = ["127.0.0.2"] + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + records = ["127.0.0.2"] } } dns_cname_record = { www = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name - record = module.dns.dns_a_record["@"].fqdn + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + record = module.dns.dns_a_record["@"].fqdn } } dns_txt_record = { dnsauth = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name record = { frontdoor = { value = "frontdoor" @@ -38,7 +38,7 @@ module "dns" { dns_mx_record = { mail = { resource_group_name = module.dns.dns_zone["mms-github-plattform.com"].resource_group_name - zone_name = module.dns.dns_zone["mms-github-plattform.com"].name + zone_name = module.dns.dns_zone["mms-github-plattform.com"].name record = { mail1 = { preference = 10