From a085ac59ae37d4301df91daecc7794526bdc0c15 Mon Sep 17 00:00:00 2001 From: Microsoft GitHub User Date: Thu, 18 Jan 2018 10:36:41 -0800 Subject: [PATCH 001/559] Initial commit --- .gitignore | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..7bbc71c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,101 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ From 1e01eee2788285dacf7cae2bcc23e2e6f6cd604c Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Thu, 18 Jan 2018 10:36:44 -0800 Subject: [PATCH 002/559] Initial commit --- LICENSE | 395 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..a2c95fc1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. \ No newline at end of file From bd0a9fb2e5ef1d851eb18762ee2526a911d9baf8 Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Thu, 18 Jan 2018 10:36:45 -0800 Subject: [PATCH 003/559] Initial commit --- LICENSE-CODE | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 LICENSE-CODE diff --git a/LICENSE-CODE b/LICENSE-CODE new file mode 100644 index 00000000..b17b032a --- /dev/null +++ b/LICENSE-CODE @@ -0,0 +1,17 @@ +The MIT License (MIT) +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From 5c3f435842cb5b571feb42b2c7eaaafa51e10fe6 Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Thu, 18 Jan 2018 10:36:46 -0800 Subject: [PATCH 004/559] Initial commit --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..f88d52f7 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ + +# Contributing + +This project welcomes contributions and suggestions. Most contributions require you to agree to a +Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us +the rights to use your contribution. For details, visit https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need to provide +a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions +provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +# Legal Notices + +Microsoft and any contributors grant you a license to the Microsoft documentation and other content +in this repository under the [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/legalcode), +see the [LICENSE](LICENSE) file, and grant you a license to any code in the repository under the [MIT License](https://opensource.org/licenses/MIT), see the +[LICENSE-CODE](LICENSE-CODE) file. + +Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the documentation +may be either trademarks or registered trademarks of Microsoft in the United States and/or other countries. +The licenses for this project do not grant you rights to use any Microsoft names, logos, or trademarks. +Microsoft's general trademark guidelines can be found at http://go.microsoft.com/fwlink/?LinkID=254653. + +Privacy information can be found at https://privacy.microsoft.com/en-us/ + +Microsoft and any contributors reserve all others rights, whether under their respective copyrights, patents, +or trademarks, whether by implication, estoppel or otherwise. From a2f02826a1e3899c4fb0dc57b9c701ac5ff72f3d Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 18:44:08 +0000 Subject: [PATCH 005/559] swap license names since we will have more code than docs --- LICENSE | 412 +++------------------------------------------------ LICENSE-CODE | 17 --- LICENSE-DOCS | 395 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 412 insertions(+), 412 deletions(-) delete mode 100644 LICENSE-CODE create mode 100644 LICENSE-DOCS diff --git a/LICENSE b/LICENSE index a2c95fc1..b17b032a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,395 +1,17 @@ -Attribution 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution 4.0 International Public License ("Public License"). To the -extent this Public License may be interpreted as a contract, You are -granted the Licensed Rights in consideration of Your acceptance of -these terms and conditions, and the Licensor grants You such rights in -consideration of benefits the Licensor receives from making the -Licensed Material available under these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - d. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - e. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - f. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - g. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - h. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - i. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - j. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - k. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's - License You apply must not prevent recipients of the Adapted - Material from complying with this Public License. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. \ No newline at end of file +The MIT License (MIT) +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/LICENSE-CODE b/LICENSE-CODE deleted file mode 100644 index b17b032a..00000000 --- a/LICENSE-CODE +++ /dev/null @@ -1,17 +0,0 @@ -The MIT License (MIT) -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/LICENSE-DOCS b/LICENSE-DOCS new file mode 100644 index 00000000..a2c95fc1 --- /dev/null +++ b/LICENSE-DOCS @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. \ No newline at end of file From 12bfbdf23930c97f3927ddccb3c05bcffe2b34ab Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 19:16:44 +0000 Subject: [PATCH 006/559] remove license file that came from upstream quickstarts repo as it's duplicated here --- LICENSE-quickstarts | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 LICENSE-quickstarts diff --git a/LICENSE-quickstarts b/LICENSE-quickstarts deleted file mode 100644 index a72d004e..00000000 --- a/LICENSE-quickstarts +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Paulo Teixeira - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. From cec313e9a77001d74c2edf4ec88fe389db9daba4 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 19:36:45 +0000 Subject: [PATCH 007/559] update the README to include introductory material and break the original lengthy README down into a number of smaller docs --- README.md | 98 +++++++++++++++++----- README.md.quickstarts | 172 --------------------------------------- docs/Delete.md | 8 ++ docs/Deploy.md | 165 +++++++++++++++++++++++++++++++++++++ docs/Get-Intasll-Data.md | 149 +++++++++++++++++++++++++++++++++ docs/Manage.md | 144 ++++++++++++++++++++++++++++++++ env.json | 5 ++ 7 files changed, 549 insertions(+), 192 deletions(-) delete mode 100644 README.md.quickstarts create mode 100644 docs/Delete.md create mode 100644 docs/Deploy.md create mode 100644 docs/Get-Intasll-Data.md create mode 100644 docs/Manage.md create mode 100644 env.json diff --git a/README.md b/README.md index f88d52f7..cd87565b 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,89 @@ +# Deploy and Manage a Scalable Moodle Cluster on Azure -# Contributing +This repo contains guides on how to deploy and manage a scalable +[Moodle](https://moodle.com) cluster on Azure. -This project welcomes contributions and suggestions. Most contributions require you to agree to a -Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.microsoft.com. +This document is designed to be "executed" by Simdem to produce an +interactive tutorial or a demo environment. However, it can also be +read as standard documentation. -When you submit a pull request, a CLA-bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. +## What this stack will give you -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. +This template set deploys the following infrastructure: +- Autoscaling web frontend layer (Nginx, php-fpm, Varnish) +- Private virtual network for frontend instances +- Controller instance running cron and handling syslog for the autoscaled site +- Load balancer to balance across the autoscaled instances +- Postgres or MySQL database +- Azure Redis instance for Moodle caching +- ObjectFS in Azure blobs (Moodle sitedata) +- Three Elasticsearch VMs for search indexing in Moodle +- Dual gluster nodes for high availability access to Moodle files -# Legal Notices +![network_diagram](images/stack_diagram.jpg "Diagram of deployed stack") -Microsoft and any contributors grant you a license to the Microsoft documentation and other content -in this repository under the [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/legalcode), -see the [LICENSE](LICENSE) file, and grant you a license to any code in the repository under the [MIT License](https://opensource.org/licenses/MIT), see the +## Configuration + +We will use a number of environment variables to configure our +deployment. To customize them for your environment copy `env.json` +into `env.local.json` and edit the contents accordingly. The values +set within that file are: + +``` shell +echo "Resource Group Name : $MOODLE_RG_NAME" +echo "Resource Group Location : $MOODLE_RG_LOCATION" +echo "Deployment Name : $MOODLE_DEPLOYMENT_NAME" +``` + +## Contributing + +This project welcomes contributions and suggestions. Most +contributions require you to agree to a Contributor License Agreement +(CLA) declaring that you have the right to, and actually do, grant us +the rights to use your contribution. For details, visit +https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine +whether you need to provide a CLA and decorate the PR appropriately +(e.g., label, comment). Simply follow the instructions provided by the +bot. You will only need to do this once across all repos using our +CLA. + +This project has adopted the [Microsoft Open Source Code of +Conduct](https://opensource.microsoft.com/codeofconduct/). For more +information see the [Code of Conduct +FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact +[opencode@microsoft.com](mailto:opencode@microsoft.com) with any +additional questions or comments. + +## Legal Notices + +Microsoft and any contributors grant you a license to the Microsoft +documentation and other content in this repository under the [Creative +Commons Attribution 4.0 International Public +License](https://creativecommons.org/licenses/by/4.0/legalcode), see +the [LICENSE](LICENSE) file, and grant you a license to any code in +the repository under the [MIT +License](https://opensource.org/licenses/MIT), see the [LICENSE-CODE](LICENSE-CODE) file. -Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the documentation -may be either trademarks or registered trademarks of Microsoft in the United States and/or other countries. -The licenses for this project do not grant you rights to use any Microsoft names, logos, or trademarks. -Microsoft's general trademark guidelines can be found at http://go.microsoft.com/fwlink/?LinkID=254653. +Microsoft, Windows, Microsoft Azure and/or other Microsoft products +and services referenced in the documentation may be either trademarks +or registered trademarks of Microsoft in the United States and/or +other countries. The licenses for this project do not grant you rights +to use any Microsoft names, logos, or trademarks. Microsoft's general +trademark guidelines can be found at +http://go.microsoft.com/fwlink/?LinkID=254653. Privacy information can be found at https://privacy.microsoft.com/en-us/ -Microsoft and any contributors reserve all others rights, whether under their respective copyrights, patents, -or trademarks, whether by implication, estoppel or otherwise. +Microsoft and any contributors reserve all others rights, whether +under their respective copyrights, patents, or trademarks, whether by +implication, estoppel or otherwise. + +## Next Steps + + 1. [Deploy a Moodle Cluster](docs/Deploy.md) + 1. [Obtain Deployment Details about a Moodle Cluster](docs/Get-Install-Data.md) + 1. [Delete a Moodle Cluster](docs/Delete.md) + diff --git a/README.md.quickstarts b/README.md.quickstarts deleted file mode 100644 index 8d88fd07..00000000 --- a/README.md.quickstarts +++ /dev/null @@ -1,172 +0,0 @@ -# *Autoscaling Moodle stack for Postgres or MySQL databases* - -After deploying, these templates will provide you with a new Moodle site with caching for speed and scaling frontends to handle PHP load. The filesystem behind it is mirrored for high availability and optionally backed up through Azure. Filesystem permissions and options have also been tuned to make Moodle more secure than a default install. - -[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-quickstart-templates%2Fmaster%2Fmoodle-scalable-cluster-ubuntu%2Fazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-quickstart-templates%2Fmaster%2Fmoodle-scalable-cluster-ubuntu%2Fazuredeploy.json) - -`Tags: cluster, ha, moodle, autoscale, linux, ubuntu` - -## *What this stack will give you* - -This template set deploys the following infrastructure: -- Autoscaling web frontend layer (Nginx, php-fpm, Varnish) -- Private virtual network for frontend instances -- Controller instance running cron and handling syslog for the autoscaled site -- Load balancer to balance across the autoscaled instances -- Postgres or MySQL database -- Azure Redis instance for Moodle caching -- ObjectFS in Azure blobs (Moodle sitedata) -- Three Elasticsearch VMs for search indexing in Moodle -- Dual gluster nodes for high availability access to Moodle files - -![network_diagram](images/stack_diagram.jpg "Diagram of deployed stack") - -## *Deployment steps* - -You can click the "deploy to Azure" button at the beginning of this document or alternatively perform a deploy from the command line: - -### *Command line deploys* -Once you've checked out the templates from git, you'll want to use the [Azure CLI tool](https://docs.microsoft.com/en-us/cli/azure/overview?view=azure-cli-latest) to deploy them. First off you'll want to create a group with these: - -`az group create --name --location ` - -Note that some locations in Azure might not support features or certain VM tiers. - -Next you'll want to either deploy and enter in all parameters manually: - -`az group deployment create --name moodle-autoscale --resource-group --template-file azuredeploy.json` - -Alternatively, you can configure all your variables in the "azuredeploy.parameters.json" file and run: - -`az group deployment create --name moodle-autoscale --resource-group --template-file azuredeploy.json --parameters azuredeploy.parameters.json` - -Note that `siteURL` is a special case in the `azuredeploy.parameters.json` files. If you do not define a value for `siteURL` or if you leave it as the default "www.example.org" this value will be overwritten by the template to be a calculated value for the public load balancers of your deployment. This allows you to experiment with this Moodle template without configuring a new domain name whilst still enabling Moodle to be configured with a production URL when appropriate. See the next section for instructions on retrieving the generated DNS name if necesary. - -Depending on what tiers you selected for VMs and the database you will be looking at roughly 1-2 hours for a full deploy. See below for selectable parameters. - -## *Using the created stack* - -In testing, stacks typically took between 1 and 2 hours to finish, -depending on spec. Once this is done you will receive a JSON with -outputs needed to continue setup. You can also retrieve these from the -portal or the CLI, more information below. The available parameters -are: - -- siteURL: If you provided a `siteURL` parameter when deploying this - will be set to the supplied value. Otherwise it will be the same as - the loadBalancerDNS, see below. -- loadBalancerDNS: This is the address of your load balancer. If you - provided a `siteURL` parameter when deploying you'll need to add a - DNS entry CNAMEs to this. -- moodleAdminPassword: The password for the "admin" user in your - Moodle install. -- controllerInstanceIP: This is the address of the controller. You - will need to SSH into this to make changes to your moodle code or - view logs. -- databaseDNS: This is the public DNS of your database instance. If - you wish to set up local backups or access the db directly, you'll - need to use this. -- databaseAdminUsername: The master account (not Moodle) username for - your database. -- databaseAdminPassword: The master account password for your - database. - -Once Moodle has been created, and (if necessary) with your custom -`siteURL` DNS pointing to the load balancer, you should be able to -load the `siteURL` and login with "admin" and the password supplied in -the moodleAdminPassword. - -#### Retrieving Deployment Configuration - -The outputs provided by your deployment should include everytyrhing -you need to manage your Moodle deployment. These are available in the -portal by clicking on the deployment for your resource group. They are -also available in via the Azure CLI. For example: - -Retrieve all the outputs in JSON format: - -``` -az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out json --query *.outputs -``` - -Retrieve just the database password - -``` -az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.databaseAdminPassword.value -``` - -Assign the database password to a variable (BASH): - -``` -MOODLE_DATABASE_DNS="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.databaseDNS.value)" -``` - -### *Updating Moodle code/settings* - -Your controller VM has Moodle code and data stored on /moodle. The code is stored in /moodle/html/moodle/. This is also mounted to your autoscaled frontends so all changes are instant. Depending on how large your Gluster disks are sized, it may be helpful to keep multiple older versions (/moodle/html1, /moodle/html2, etc) to roll back if needed. - -### *Getting an SQL dump* - -A daily sql dump of your database is taken at 02:22 and saved to /moodle/db-backup.sql(.gz). If your database is small enough to fit, you may be able to get a more current SQL dump of your Moodle db by dumping it to /moodle/. Otherwise, you'll want to do this remotely by connecting to the hostname shown in the database-dns output using the database-admin-username and database-admin-password. - -While Azure does not currently back up Postgres/MySQL databases, by dumping it to /moodle it is included in the Gluster VM backups should you enable Recovery Services in your parameters. - -### *Azure Recovery Services* - -If you have set azureBackupSwitch to 1 then Azure will provide VM backups of your Gluster node. This is recommended as it contains both your Moodle code and your sitedata. Restoring a backed up VM is outside the scope of this doc, but Azure's documentation on Recovery Services can be found here: https://docs.microsoft.com/en-us/azure/backup/backup-azure-vms-first-look-arm - -### *Resizing your Database* - -Note: This involves a lengthy site downtime. - -As mentioned above, Azure does not currently support resizing databases. You can, however, create a new database instance and change your config to point to that. To get a different size database you'll need to: - -1. Place your Moodle site into maintenance mode. You can do this either via the web interface or the command line on the controller VM. -2. Perform an SQL dump of your database, either to /moodle or remotely to your machine. -3. Create a new Azure database of the size you want inside your existing resource group. -4. Using the details in your /moodle/html/moodle/config.php create a new user and database matching the details in config.php. Make sure to grant all rights on the db to the user. -5. On the controller instance, change the db setting in /moodle/html/moodle/config.php to point to the new database. -6. Take Moodle site out of maintenance mode. -7. Once confirmed working, delete the previous database instance. - -How long this takes depends entirely on the size of your database and the speed of your VM tier. It will always be a large enough window to make a noticeable outage. - -### *Changing the SSL cert* - -The self-signed cert generated by the template is suitable for very basic testing, but a public website will want a real cert. After purchasing a trusted certificate, it can be copied to the following files to be ready immediately: - -- /moodle/certs/nginx.key: Your certificate's private key -- /moodle/certs/nginx.crt: Your combined signed certificate and trust chain certificate(s). - -Once replaced these changes become effective immediately. - - -## *Sizing Considerations and Limitations* - -Depending on what you're doing with Moodle, there are several considerations to make when configuring. The defaults included produce a cluster that is inexpensive but probably too low spec to use beyond single-user Moodle testing. - -It should be noted that as of the time of this writing both Postgres and MySQL databases are in preview at Azure. In the future larger DB sizes or different VM sizes will be available. The templates will allow you to select whatever size you want, but there are restrictions in place (VMs with certain storage types, disk size for database tiers, etc) that may prevent certains selections from working together. - -### *Database Sizing* - -As of the time of this writing, Azure supports "Basic" and "Standard" tiers for database instances. In addition the skuCapacityDTU defines Compute Units, and the number of those you can use is limited by database tier: - -- Basic: 50, 100 -- Standard: 100, 200, 400, 800 - -This value also limits the maximum number of connections, as defined here: https://docs.microsoft.com/en-us/azure/mysql/concepts-limits - -As the Moodle database will handle cron processes as well as the website, any public facing website with more than 10 users will likely require upgrading to 100. Once the site reaches 30+ users it will require upgrading to Standard for more compute units. This depends entirely on the individual site. As MySQL databases cannot change (or be restored to a different tier) once deployed it is a good idea to slightly overspec your database. - -Standard instances have a minimum storage requirement of 128000MB. All database storage, regardless of tier, has a hard upper limit of 1 terrabyte. After 128GB you gain additional iops for each GB, so if you're expecting a heavy amount of traffic you will want to oversize your storage. The current maximum iops with a 1TB disk is 3000. - -### *Controller instance sizing* - -The controller handles both syslog and cron duties. Depending on how big your Moodle cron runs are this may not be sufficient. If cron jobs are very delayed and cron processes are building up on the controller then an upgrade in tier is needed. - -### *Frontend instances* - -In general the frontend instances will not be the source of any bottlenecks unless they are severely undersized versus the rest of the cluster. More powerful instances will be needed should fpm processes spawn and exhaust memory during periods of heavy site load. This can also be mitigated against by increasing the number of VMs but spawning new VMs is slower (and potentially more expensive) than having that capacity already available. - -It is worth noting that the memory allowances on these instances allow for more memory than they may be able to provide with lower instance tiers. This is intentional as you can opt to run larger VMs with more memory and not require manual configuration. FPM also allows for a very large number of threads which prevents the system from failing during many small jobs. - diff --git a/docs/Delete.md b/docs/Delete.md new file mode 100644 index 00000000..9220c9aa --- /dev/null +++ b/docs/Delete.md @@ -0,0 +1,8 @@ +# Delete a Moodle Cluster + +If you want to remove all resources associated with a Moodle Cluster +simply delete the assocaited resource group as follows: + +``` +az group delete --name $MOODLE_RG_NAME +``` diff --git a/docs/Deploy.md b/docs/Deploy.md new file mode 100644 index 00000000..cefe9ad7 --- /dev/null +++ b/docs/Deploy.md @@ -0,0 +1,165 @@ +# Deploy Autoscaling Moodle Stack to Azure + +After following the steps in this this document you with awill have a +new Moodle site with caching for speed and scaling frontends to handle +load. The filesystem behind it is mirrored for high availability and +optionally backed up through Azure. Filesystem permissions and options +have also been tuned to make Moodle more secure than a default +install. + +## Prerequisites + +You will need a local copy of the Moodle ARM templates. These are +published on GitHub so you should clone them locally (possibly after +forking them on GitHub). + +## Create Resource Group + +When you create the Moodle cluster you will create many resources. On +Azure it is a best practice to collect such resources together in a +Resource Group. The first thing we need to do, therefore, is create a +resource group: + +``` +az group create --name $MOODLE_RG_NAME --location $MOODLE_RG_LOCATION +``` + +Results: + +```expected_similarity=0.4 +{ + "id": "/subscriptions/325e7c34-99fb-4190-aa87-1df746c67705/resourceGroups/rgmoodlearm3", + "location": "westus2", + "managedBy": null, + "name": "rgmoodlearm3", + "properties": { + "provisioningState": "Succeeded" + }, + "tags": null +} +``` + +## Create Azure Deployment Paramaters + +Your deployment will be configured using an +`azuredeploy.parameters.json` file. It is possible to provide these +parameters interactively via the command line by simply omitting the +paramaters file in the command in the next section. However, it is +more reproducible if we use a paramaters file. + +A good set of defaults are provided in the git repository. These +defaults create a scalable cluster that is suitable for low volume +testing. If you are building out a production service you should +review the section below on sizing considerations. For now we will +proceed with the defaults, but there is one value, the `sshPublicKey` +that **must** be provided. To automatically add your default SSH key +(in Bash) use the following command: + +``` +FIXME: sed command to add SSH key +``` + +## Deploy cluster + +Now that we have a resource group and a configuration file we can +create the cluster itself. This is done with a single command: + +``` +az group deployment create --name $MOODLE_DEPLOYMENT_NAME --resource-group $MOODLE_RG_NAME --template-file ~/projects/azure-quickstart-templates/moodle-scalable-cluster-ubuntu/azuredeploy.json --parameters azuredeploy.parameters.json +``` + +## Using the created stack + +In testing, stacks typically took between 1 and 2 hours to finish, +depending on spec. Once complete you will receive a JSON output +containing information needed to manage your Moodle install (see +`outputs`). You can also retrieve this infromation from the portal or +the CLI. + +Once Moodle has been created, and (where necessary) you have +configured your custom `siteURL` DNS to point to the +`loadBalancerDNS`, you should be able to load the `siteURL` in a +browser and login with the username "admin" and the +`moodleAdminPassword`. Note that the values for each of these +parameters are avialble in the portal or the `outputs` section of the +JSON response from the previous deploy command. See [documentation on +how to retrieve configuration data](./Get-Install-Data.md) along +with full details of all the output parameters avialble to you. + +Note that by default the deployment uses a self-signed certificate, +consequently you will recieve a warning when accessing the site. To +add a genuine certificate see the documentation on [managing your +cluster](./Manage.md). + +## Sizing Considerations and Limitations + +Depending on what you're doing with Moodle you will want to configure +your deployment appropriately.The defaults included produce a cluster +that is inexpensive but probably too low spec to use beyond simple +testing scenarios. This section includes an overview of how to size +the database and VM instances for your use case. + +It should be noted that as of the time of this writing both Postgres +and MySQL databases are in preview at Azure. In the future larger DB +sizes or different VM sizes will be available. The templates will +allow you to select whatever size you want, but there are restrictions +in place (VMs with certain storage types, disk size for database +tiers, etc) that may prevent certains selections from working +together. + +### Database Sizing + +As of the time of this writing, Azure supports "Basic" and "Standard" +tiers for database instances. In addition the skuCapacityDTU defines +Compute Units, and the number of those you can use is limited by +database tier: + +- Basic: 50, 100 +- Standard: 100, 200, 400, 800 + +This value also limits the maximum number of connections, as defined +here: https://docs.microsoft.com/en-us/azure/mysql/concepts-limits + +As the Moodle database will handle cron processes as well as the +website, any public facing website with more than 10 users will likely +require upgrading to 100. Once the site reaches 30+ users it will +require upgrading to Standard for more compute units. This depends +entirely on the individual site. As MySQL databases cannot change (or +be restored to a different tier) once deployed it is a good idea to +slightly overspec your database. + +Standard instances have a minimum storage requirement of 128000MB. All +database storage, regardless of tier, has a hard upper limit of 1 +terrabyte. After 128GB you gain additional iops for each GB, so if +you're expecting a heavy amount of traffic you will want to oversize +your storage. The current maximum iops with a 1TB disk is 3000. + +### Controller instance sizing + +The controller handles both syslog and cron duties. Depending on how +big your Moodle cron runs are this may not be sufficient. If cron jobs +are very delayed and cron processes are building up on the controller +then an upgrade in tier is needed. + +### Frontend instances + +In general the frontend instances will not be the source of any +bottlenecks unless they are severely undersized versus the rest of the +cluster. More powerful instances will be needed should fpm processes +spawn and exhaust memory during periods of heavy site load. This can +also be mitigated against by increasing the number of VMs but spawning +new VMs is slower (and potentially more expensive) than having that +capacity already available. + +It is worth noting that the memory allowances on these instances allow +for more memory than they may be able to provide with lower instance +tiers. This is intentional as you can opt to run larger VMs with more +memory and not require manual configuration. FPM also allows for a +very large number of threads which prevents the system from failing +during many small jobs. + + +## Next Steps + + 1. [Retrieve configuration details using CLI](./Get-Install-Data.md) + 1. [Manage the Moodle cluster](./Manage.md) diff --git a/docs/Get-Intasll-Data.md b/docs/Get-Intasll-Data.md new file mode 100644 index 00000000..51e3a050 --- /dev/null +++ b/docs/Get-Intasll-Data.md @@ -0,0 +1,149 @@ +# Retrieve essential install details + +Once a deployment has completed the ARM template will output some +values that you will need for managing your Moodle instalation. These +are available in the portal, but in this document we will retrieve +them using the AZ command line tools and through the AZ CLI tool. This +document describes the available parameters and how to retrieve them. + +## Output Paramater Overview + +The available output parameters are: + + - **siteURL**: If you provided a `siteURL` parameter when deploying this + will be set to the supplied value. Otherwise it will be the same as + the loadBalancerDNS, see below. + - **loadBalancerDNS**: This is the DNS name of your application load + balancer. If you provided a `siteURL` parameter when deploying + you'll need to add a DNS entry to its CNAMEs pointing to this address. + - **moodleAdminPassword**: The generated password for the "admin" user + in your Moodle install. + - **controllerInstanceIP**: This is the IP address of the controller + Virtual Machine. You will need to SSH into this to make changes to + your Moodle code or view logs. + - **databaseDNS**: This is the public DNS of your database instance. If + you wish to set up local backups or access the DB directly, you'll + need to use this. + - **databaseAdminUsername**: The admin username for your database + (this is not the same as your Moodle username). + - **databaseAdminPassword**: The admin password for your + database (this is not the same as your Moodle password). + +## Retrieving Output Parameters Using the CLI + +To get a complete list of outputs in json format use: + +```bash +az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out json --query *.outputs +``` + +Individual outputs can be retrieved by filtering, for example, to get +just the value of the `siteURL` use: + +``` bash +az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out json --query *.outputs.siteURL.value +``` + +However, since we are reqeusting JSON output (the default) the value +is enclosed in quotes. In order to remove these we can output as a tab +separated list (TSV): + +``` bash +az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.siteURL +``` + +Now we can assign individual values to environment variables, for example: + +``` bash +MOODLE_SITE_URL="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.siteURL.value)" +``` + +### Retrieving Moodle Site URL + +The Site URL is the value used to configure Moodle's base URL. The +site URL can be provided as an input to the template via the parameter +`siteURL`, in which case you will not need to retrieve this from the +outputs. However, if you do not define this, or if you leave it as the +default "www.example.org" you will need to retrieve this value from +Azure using the following command: + +```bash +MOODLE_SITE_URL="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.siteURL.value)" +``` + +#### Retrieving Moodle Site Load Balancer URL + +The load balancer DNS is the publicly registered DNS name for your +Moodle DNS. If this is different from the site URL it is important to +ensure that you configure your DNS entry for site URL to point at the +load balancer. + +```bash +MOODLE_LOAD_BALANCER_DNS="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.loadBalancerDNS.value)" +``` + +### Retrieving Moodle Administrator Password + +Moodle admin password (username is "admin"): + +```bash +MOODLE_ADMIN_PASSWORD="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.moodleAdminPassword.value)" +``` + +### Retriving Controller Virtual Machine Details + +The controller VM runs management tasks for the cluster, such as cron jobs and syslog. + +```bash +MOODLE_CONTROLLER_INSTANCE_IP="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.controllerInstanceIP.value)" +``` + +There is no username and password for this VM since a username and SSH +key are provided as input parameters to the template. + +### Retreiving Database Information + +#### Database URL + +``` bash +MOODLE_DATABASE_DNS="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.databaseDNS.value)" +``` +#### Database admin username + +``` bash +MOODLE_DATABASE_ADMIN_USERNAME="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.databaseAdminUsername.value)" +``` + +#### Database admin password + +``` bash +MOODLE_DATABASE_ADMIN_PASSWORD="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.databaseAdminPassword.value)" +``` + +### Retrieving Moodle Application VNET Information + +First frontend VM IP: + +``` bash +MOODLE_FIRST_FRONTEND_VM_IP="$(az group deployment show --resource-group $MOODLE_RG_NAME --name $MOODLE_DEPLOYMENT_NAME --out tsv --query *.outputs.firstFrontendVmIP.value)" +``` + +# Validation + +After having run each of the commands in this document you should have +each of the output parameters available in environment variable: + +``` bash +echo $MOODLE_SITE_URL +echo $MOODLE_LOAD_BALANCER_DNS +echo $MOODLE_ADMIN_PASSWORD +echo $MOODLE_CONTROLLER_INSTANCE_IP +echo $MOODLE_DATABASE_DNS +echo $MOODLE_DATABASE_ADMIN_USERNAME +echo $MOODLE_DATABASE_ADMIN_PASSWORD +echo $MOODLE_FIRST_FRONTEND_VM_IP +``` + +## Next Steps + + 1. [Manage the Moodle cluster](./Manage.md) diff --git a/docs/Manage.md b/docs/Manage.md new file mode 100644 index 00000000..954749cd --- /dev/null +++ b/docs/Manage.md @@ -0,0 +1,144 @@ +# Managing a Scalable Moodle Cluster in Azure + +This document provides an overview of how to perform various +management tasks on a scalable Moodle cluster on Azure. + +## Prerequisites + +In order to manage a cluster it is clearly necessary to first [deploy +a scalable Moodle cluster on Azure](../Deploy/README.md). + +For convenience and readability this document also assumes that essential [deployment details for your cluster have been assigned to environment variables](../GetInstallData/README.md). + +## Updating Moodle code/settings + +Your controller Virtual Machine has Moodle code and data stored in +`/moodle`. The site code is stored in `/moodle/html/moodle/`. This +data is replicated across dual gluster nodes to provide high +availability. This directory is also mounted to your autoscaled +frontends so all changes to files on the controller VM are immediately +available to all frontend machines. + +Depending on how large your Gluster disks are sized, it may be helpful +to keep multiple older versions (/moodle/html1, /moodle/html2, etc) to +roll back if needed. + +To connect to your Controller VM use SSH with a username of +'azureuser' and the SSH provided in the `sshPublicKey` input +parameter. For example, to retrieve a listing of files and directories +in the `/moodle` directory use: + +``` +ssh -o StrictHostKeyChecking=no azureadmin@$MOODLE_CONTROLLER_INSTANCE_IP ls -l /moodle +``` + +Results: + +``` +Warning: Permanently added '52.228.45.38' (ECDSA) to the list of known hosts. +total 12 +drwxr-xr-x 2 www-data www-data 4096 Jan 17 00:59 certs +-rw-r--r-- 1 root root 0 Jan 17 02:22 db-backup.sql +drwxr-xr-x 3 www-data www-data 4096 Jan 17 00:54 html +drwxrwx--- 10 www-data www-data 4096 Jan 17 06:55 moodledata +``` + +**IMPORTANT NOTE** + +It is important to realize that the `-o StrictHostKeyChecking=no` +option in the above SSH command presents a security risk. It is +included here to facilitate automated validation of these commands. It +is not recommended to use this option in production environments, +instead run the command mannually and validate the host key. +Subsequent executions of an SSH command will not require this +validation step. For more information there is an excellent +[superuser.com +Q&A](https://superuser.com/questions/421074/ssh-the-authenticity-of-host-host-cant-be-established/421084#421084). + +## Getting an SQL dump + +By default a daily sql dump of your database is taken at 02:22 and +saved to `/moodle/db-backup.sql`(.gz). This file can be retrieved +using SCP or similar. For example: + +``` bash +scp azureadmin@$MOODLE_CONTROLLER_INSTANCE_IP:/moodle/db-backup.sql /tmp/moodle-db-backup.sql +``` + +To obtain a more recent SQL dump you run the commands appropriate for +your chosen database on the Controller VM. The following sections will +help with this task. + +#### Postgres + +Postgress provides a `pg_dump` command that can be used to take a +snapshot of the database via SSH. For example, use the following +command: + +``` bash +ssh azureadmin@$MOODLE_CONTROLLER_INSTANCE_IP 'pg_dump -Fc -h $MOODLE_DATABASE_DNS -U $MOODLE_DATABASE_ADMIN_USERNAME moodle > /moodle/db-snapshot.sql' +``` + +See the Postgres documentation for full details of the [`pg_dump`](https://www.postgresql.org/docs/9.5/static/backup-dump.html) command. + +#### MySQL + +MySQL provides a `mysql_dump` command that can be used to take a +snapshot of the database via SSH. For example, use the following +command: + +``` bash +ssh azureadmin@$MOODLE_CONTROLLER_INSTANCE_IP 'mysqldump -h $mysqlIP -u ${azuremoodledbuser} -p'${moodledbpass}' --databases ${moodledbname} | gzip > /moodle/db-backup.sql.gz' +``` + +## Backup and Recovery + +If you have set the `azureBackupSwitch` in the input parameters to `1` +then Azure will provide VM backups of your Gluster node. This is +recommended as it contains both your Moodle code and your sitedata. +Restoring a backed up VM is outside the scope of this doc, but Azure's +documentation on Recovery Services can be found here: +https://docs.microsoft.com/en-us/azure/backup/backup-azure-vms-first-look-arm + +## Resizing your Database + +Note: This process involves site downtime and should therefore only be +carried out during a planned maintenance window. + +At the time of writing Azure does not support resizing MySQL or +Postgres databases. You can, however, create a new database instance, +with a different size, and change your config to point to that. To get +a different size database you'll need to: + + 1. [Place your Moodle site into maintenance + mode](https://docs.moodle.org/34/en/Maintenance_mode). You can do + this either via the web interface or the command line on the + controller VM. + 2. Perform an SQL dump of your database. See above for more details. + 3. Create a new Azure database of the size you want inside your + existing resource group. + 4. Using the details in your /moodle/html/moodle/config.php create a + new user and database matching the details in config.php. Make + sure to grant all rights on the db to the user. + 5. On the controller instance, change the db setting in + /moodle/html/moodle/config.php to point to the new database. + 6. Take Moodle site out of maintenance mode. + 7. Once confirmed working, delete the previous database instance. + +How long this takes depends entirely on the size of your database and +the speed of your VM tier. It will always be a large enough window to +make a noticeable outage. + +## Changing the SSL cert + +The self-signed cert generated by the template is suitable for very +basic testing, but a public website will want a real cert. After +purchasing a trusted certificate, it can be copied to the following +files to be ready immediately: + + - /moodle/certs/nginx.key: Your certificate's private key + - /moodle/certs/nginx.crt: Your combined signed certificate and trust chain certificate(s). + +## Next Steps + + 1. [Retrieve configuration details using CLI](./Get-Install-Data.md) diff --git a/env.json b/env.json new file mode 100644 index 00000000..838d537a --- /dev/null +++ b/env.json @@ -0,0 +1,5 @@ +{ + "MOODLE_RG_NAME": "rgmoodlearm12", + "MOODLE_RG_LOCATION": "canadacentral", + "MOODLE_DEPLOYMENT_NAME": "MainDeployment" +} From c158268031107c30e26ca9e381ae575f5072e372 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 19:57:26 +0000 Subject: [PATCH 008/559] move config information into the deploy doc and link prominently to it --- README.md | 16 ++++------------ docs/Deploy.md | 13 +++++++++++++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index cd87565b..77b991eb 100644 --- a/README.md +++ b/README.md @@ -22,18 +22,10 @@ This template set deploys the following infrastructure: ![network_diagram](images/stack_diagram.jpg "Diagram of deployed stack") -## Configuration - -We will use a number of environment variables to configure our -deployment. To customize them for your environment copy `env.json` -into `env.local.json` and edit the contents accordingly. The values -set within that file are: - -``` shell -echo "Resource Group Name : $MOODLE_RG_NAME" -echo "Resource Group Location : $MOODLE_RG_LOCATION" -echo "Deployment Name : $MOODLE_DEPLOYMENT_NAME" -``` +## Quickstart + +Why not get started with [deploying a Moodle cluster on +Azure](docs/Deploy.md) right now. ## Contributing diff --git a/docs/Deploy.md b/docs/Deploy.md index cefe9ad7..f59cb26b 100644 --- a/docs/Deploy.md +++ b/docs/Deploy.md @@ -13,6 +13,19 @@ You will need a local copy of the Moodle ARM templates. These are published on GitHub so you should clone them locally (possibly after forking them on GitHub). +## Configuration + +We will use a number of environment variables to configure our +deployment. To customize them for your environment copy `env.json` +into `env.local.json` and edit the contents accordingly. The values +set within that file are: + +``` shell +echo "Resource Group Name : $MOODLE_RG_NAME" +echo "Resource Group Location : $MOODLE_RG_LOCATION" +echo "Deployment Name : $MOODLE_DEPLOYMENT_NAME" +``` + ## Create Resource Group When you create the Moodle cluster you will create many resources. On From 5c8d06ef4d1bf00e76fcd9f584150f08dfcda975 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 19:58:49 +0000 Subject: [PATCH 009/559] Fix typo in document name --- docs/{Get-Intasll-Data.md => Get-Install-Data.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{Get-Intasll-Data.md => Get-Install-Data.md} (100%) diff --git a/docs/Get-Intasll-Data.md b/docs/Get-Install-Data.md similarity index 100% rename from docs/Get-Intasll-Data.md rename to docs/Get-Install-Data.md From df1602e48d5f7759470a84112bf877b77f9e4d28 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 21:18:07 +0000 Subject: [PATCH 010/559] add deploy to azure buttons and use this repo as the baseTemplateUrl and scriptUrl --- README.md | 11 +++++++---- azuredeploy.json | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 77b991eb..46c2f4ba 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # Deploy and Manage a Scalable Moodle Cluster on Azure This repo contains guides on how to deploy and manage a scalable -[Moodle](https://moodle.com) cluster on Azure. +[Moodle](https://moodle.com) cluster on Azure. You can use an [Azure +free account](https://azure.microsoft.com/en-us/free/) to get started. -This document is designed to be "executed" by Simdem to produce an -interactive tutorial or a demo environment. However, it can also be -read as standard documentation. +Once you have an Azure account you can deploy Moodle via the Azure +portal using the button below, or you can [deploy Moodle via the +CLI](docs/Deploy.md). + +[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fmoodle-scalable-cluster-ubuntu%2Fazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fmoodle-scalable-cluster-ubuntu%2Fazuredeploy.json) ## What this stack will give you diff --git a/azuredeploy.json b/azuredeploy.json index 78797e82..dc4c0fda 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -504,8 +504,8 @@ "documentation10": " controller - creates a jumpbox and deploys code", "documentation11": "GlusterFS Sizing guidance", "moodleCommon": { - "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/moodle-scalable-cluster-ubuntu/nested/", - "scriptLocation": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/moodle-scalable-cluster-ubuntu/scripts/", + "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/Moodle/master/moodle-scalable-cluster-ubuntu/nested/", + "scriptLocation": "https://raw.githubusercontent.com/Azure/Moodle/master/moodle-scalable-cluster-ubuntu/scripts/", "applyScriptsSwitch": "[parameters('applyScriptsSwitch')]", "autoscaleVmCount": "[parameters('autoscaleVmCount')]", From 627cf6fdb39d23a98195d2e98c78d2f9db66ffe8 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 21:22:01 +0000 Subject: [PATCH 011/559] add deploy to azure buttons and use this repo as the baseTemplateUrl and scriptUrl --- README.md | 2 +- azuredeploy.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 46c2f4ba..f7a2c2d8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Once you have an Azure account you can deploy Moodle via the Azure portal using the button below, or you can [deploy Moodle via the CLI](docs/Deploy.md). -[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fmoodle-scalable-cluster-ubuntu%2Fazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fmoodle-scalable-cluster-ubuntu%2Fazuredeploy.json) +[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2FFazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2FFazuredeploy.json) ## What this stack will give you diff --git a/azuredeploy.json b/azuredeploy.json index dc4c0fda..49a83501 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -504,8 +504,8 @@ "documentation10": " controller - creates a jumpbox and deploys code", "documentation11": "GlusterFS Sizing guidance", "moodleCommon": { - "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/Moodle/master/moodle-scalable-cluster-ubuntu/nested/", - "scriptLocation": "https://raw.githubusercontent.com/Azure/Moodle/master/moodle-scalable-cluster-ubuntu/scripts/", + "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/Moodle/master/nested/", + "scriptLocation": "https://raw.githubusercontent.com/Azure/Moodle/master/scripts/", "applyScriptsSwitch": "[parameters('applyScriptsSwitch')]", "autoscaleVmCount": "[parameters('autoscaleVmCount')]", From c881d490fcd1947d069d5a07ecc79e8b6df0e860 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 21:22:56 +0000 Subject: [PATCH 012/559] add deploy to azure buttons and use this repo as the baseTemplateUrl and scriptUrl --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f7a2c2d8..c6abe171 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Once you have an Azure account you can deploy Moodle via the Azure portal using the button below, or you can [deploy Moodle via the CLI](docs/Deploy.md). -[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2FFazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2FFazuredeploy.json) +[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fazuredeploy.json) ## What this stack will give you From f4883cdb30190045216a6ab4e25a63efe5eb83be Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Thu, 18 Jan 2018 13:24:10 -0800 Subject: [PATCH 013/559] Add deploy to azure buttons and use this repo as the baseTemplateUrl and scriptUrl (#3) * add deploy to azure buttons and use this repo as the baseTemplateUrl and scriptUrl --- README.md | 11 +++++++---- azuredeploy.json | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 77b991eb..c6abe171 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # Deploy and Manage a Scalable Moodle Cluster on Azure This repo contains guides on how to deploy and manage a scalable -[Moodle](https://moodle.com) cluster on Azure. +[Moodle](https://moodle.com) cluster on Azure. You can use an [Azure +free account](https://azure.microsoft.com/en-us/free/) to get started. -This document is designed to be "executed" by Simdem to produce an -interactive tutorial or a demo environment. However, it can also be -read as standard documentation. +Once you have an Azure account you can deploy Moodle via the Azure +portal using the button below, or you can [deploy Moodle via the +CLI](docs/Deploy.md). + +[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fazuredeploy.json) [![Visualize](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2Fmaster%2Fazuredeploy.json) ## What this stack will give you diff --git a/azuredeploy.json b/azuredeploy.json index 78797e82..49a83501 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -504,8 +504,8 @@ "documentation10": " controller - creates a jumpbox and deploys code", "documentation11": "GlusterFS Sizing guidance", "moodleCommon": { - "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/moodle-scalable-cluster-ubuntu/nested/", - "scriptLocation": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/moodle-scalable-cluster-ubuntu/scripts/", + "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/Moodle/master/nested/", + "scriptLocation": "https://raw.githubusercontent.com/Azure/Moodle/master/scripts/", "applyScriptsSwitch": "[parameters('applyScriptsSwitch')]", "autoscaleVmCount": "[parameters('autoscaleVmCount')]", From f7c0dc62882816e50804ffc49dbc039801fe0ef5 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Thu, 18 Jan 2018 14:28:52 -0800 Subject: [PATCH 014/559] Allow choice of apache or nginx --- README.md | 2 +- azuredeploy.json | 14 +++++++- azuredeploy.parameters.json | 1 + nested/webvmssconfig1.json | 2 +- scripts/setup_moodle.sh | 68 ++++++++++++++++++++++++++++++++----- 5 files changed, 76 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c6abe171..aebad362 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ CLI](docs/Deploy.md). ## What this stack will give you This template set deploys the following infrastructure: -- Autoscaling web frontend layer (Nginx, php-fpm, Varnish) +- Autoscaling web frontend layer (Nginx for https termination, Varnish for caching, Nginx/php-fpm or Apache/php) - Private virtual network for frontend instances - Controller instance running cron and handling syslog for the autoscaled site - Load balancer to balance across the autoscaled instances diff --git a/azuredeploy.json b/azuredeploy.json index 49a83501..2afc94bf 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -48,6 +48,17 @@ }, "type": "string" }, + "webServerType": { + "defaultValue": "apache", + "allowedValues": [ + "apache", + "nginx" + ], + "metadata": { + "description": "Web server type" + }, + "type": "string" + }, "controllerVmSku": { "defaultValue": "Standard_DS1_v2", "metadata": { @@ -606,7 +617,8 @@ "vmssName": "[concat('vmss-',variables('resourceprefix'))]", "vmssdStorageAccounttName": "[concat('vmss',uniqueString(resourceGroup().id))]", "vnetName": "[concat('vnet-',variables('resourceprefix'))]", - "vpnType": "[parameters('vpnType')]" + "vpnType": "[parameters('vpnType')]", + "webServerType": "[parameters('webServerType')]" }, "octets": "[split(parameters('vNetAddressSpace'), '.')]", "resourceprefix": "[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]" diff --git a/azuredeploy.parameters.json b/azuredeploy.parameters.json index 7beb4cd8..525cada7 100644 --- a/azuredeploy.parameters.json +++ b/azuredeploy.parameters.json @@ -8,6 +8,7 @@ "blobStorageAccountType": { "value": "Standard_LRS"}, "controllerVmSku": { "value": "Standard_DS1_v2" }, "dbServerType": { "value": "postgres" }, + "webServerType": { "value": "apache" }, "elasticVmSku": { "value": "Standard_DS2_v2" }, "glusterDiskCount": { "value": 4 }, "glusterDiskSize": { "value": 127 }, diff --git a/nested/webvmssconfig1.json b/nested/webvmssconfig1.json index 9cf91e03..6a9ca112 100644 --- a/nested/webvmssconfig1.json +++ b/nested/webvmssconfig1.json @@ -34,7 +34,7 @@ ], "variables": { - "cmdExec": "[concat('bash ',parameters('moodleCommon').moodleSetupScriptFilename,' ',parameters('moodleCommon').gfsNameRoot,'0', ' ','data', ' ', parameters('moodleCommon').siteURL, ' ', concat('jumpbox-vm-',parameters('moodleCommon').resourcesPrefix))]", + "cmdExec": "[concat('bash ',parameters('moodleCommon').moodleSetupScriptFilename,' ',parameters('moodleCommon').gfsNameRoot,'0', ' ','data', ' ', parameters('moodleCommon').siteURL, ' ', concat('jumpbox-vm-',parameters('moodleCommon').resourcesPrefix), ' ', parameters('moodleCommon').webServerType)]", "scriptUri": "[concat(parameters('moodleCommon').ScriptLocation,parameters('moodleCommon').moodleSetupScriptFilename)]" } } diff --git a/scripts/setup_moodle.sh b/scripts/setup_moodle.sh index 8dd129c4..a9493a87 100644 --- a/scripts/setup_moodle.sh +++ b/scripts/setup_moodle.sh @@ -26,10 +26,13 @@ glusterNode=$1 glusterVolume=$2 siteFQDN=$3 syslogserver=$4 +webServerType=$5 -echo $glusterNode >> /tmp/vars.txt +echo $glusterNode > /tmp/vars.txt echo $glusterVolume >> /tmp/vars.txt echo $siteFQDN >> /tmp/vars.txt +echo $syslogserver >> /tmp/vars.txt +echo $webServerType >> /tmp/vars.txt { # make sure the system does automatic update @@ -45,7 +48,15 @@ echo $siteFQDN >> /tmp/vars.txt sudo apt-get -y install glusterfs-client postgresql-client mysql-client git # install the base stack - sudo apt-get -y install nginx php-fpm varnish php php-cli php-curl php-zip + sudo apt-get -y install nginx varnish php php-cli php-curl php-zip + + if [ "$webServerType" = "apache" ]; then + # install apache pacakges + sudo apt-get -y install apache2 libapache2-mod-php + else + # for nginx-only option + sudo apt-get -y install php-fpm + fi # Moodle requirements sudo apt-get install -y graphviz aspell php-soap php-json php-redis php-bcmath php-gd php-pgsql php-mysql php-xmlrpc php-intl php-xml php-bz2 @@ -129,6 +140,7 @@ http { } EOF + if [ "$webServerType" = "nginx" ]; then cat <> /etc/nginx/sites-enabled/${siteFQDN}.conf server { listen 81 default; @@ -181,6 +193,10 @@ server { } } +EOF + fi + + cat < /etc/nginx/sites-enabled/${siteFQDN}.conf server { listen 443 ssl; root /moodle/html/moodle; @@ -214,8 +230,35 @@ server { } EOF + if [ "$webServerType" = "apache" ]; then + sed -i "s/Listen 80/Listen 81/" /etc/apache2/ports.conf + + cat < /etc/apache2/sites-enabled/${siteFQDN}.conf + + ServerName ${siteFQDN} + + ServerAdmin webmaster@localhost + DocumentRoot /moodle/html/moodle + + + Options FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog "|/usr/bin/logger -t moodle -p local1.error" + CustomLog "|/usr/bin/logger -t moodle -p local1.notice" combined + + +EOF + fi + # php config - PhpIni=/etc/php/7.0/fpm/php.ini + if [ "$webServerType" = "apache" ]; then + PhpIni=/etc/php/7.0/apache2/php.ini + else + PhpIni=/etc/php/7.0/fpm/php.ini + fi sed -i "s/memory_limit.*/memory_limit = 512M/" $PhpIni sed -i "s/max_execution_time.*/max_execution_time = 18000/" $PhpIni sed -i "s/max_input_vars.*/max_input_vars = 100000/" $PhpIni @@ -232,12 +275,16 @@ EOF # Remove the default site. Moodle is the only site we want rm -f /etc/nginx/sites-enabled/default + if [ "$webServerType" = "apache" ]; then + rm -f /etc/apache2/sites-enabled/000-default.conf + fi # restart Nginx sudo service nginx restart - # fpm config - overload this - cat < /etc/php/7.0/fpm/pool.d/www.conf + if [ "$webServerType" = "nginx" ]; then + # fpm config - overload this + cat < /etc/php/7.0/fpm/pool.d/www.conf [www] user = www-data group = www-data @@ -251,15 +298,20 @@ pm.min_spare_servers = 20 pm.max_spare_servers = 30 EOF - # Restart fpm - service php7.0-fpm restart + # Restart fpm + service php7.0-fpm restart + fi + + if [ "$webServerType" = "apache" ]; then + sudo service apache2 restart + fi # Configure varnish startup for 16.04 VARNISHSTART="ExecStart=\/usr\/sbin\/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f \/etc\/varnish\/moodle.vcl -S \/etc\/varnish\/secret -s malloc,1024m -p thread_pool_min=200 -p thread_pool_max=4000 -p thread_pool_add_delay=2 -p timeout_linger=100 -p timeout_idle=30 -p send_timeout=1800 -p thread_pools=4 -p http_max_hdr=512 -p workspace_backend=512k" sed -i "s/^ExecStart.*/${VARNISHSTART}/" /lib/systemd/system/varnish.service # Configure varnish VCL for moodle - cat <> /etc/varnish/moodle.vcl + cat < /etc/varnish/moodle.vcl vcl 4.0; import std; From 195e47f14aad5104889fa3740244ecce565bd468 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Thu, 18 Jan 2018 15:31:38 -0800 Subject: [PATCH 015/559] Revert to original append-redirect --- scripts/setup_moodle.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/setup_moodle.sh b/scripts/setup_moodle.sh index a9493a87..b05ac79c 100644 --- a/scripts/setup_moodle.sh +++ b/scripts/setup_moodle.sh @@ -28,7 +28,7 @@ siteFQDN=$3 syslogserver=$4 webServerType=$5 -echo $glusterNode > /tmp/vars.txt +echo $glusterNode >> /tmp/vars.txt echo $glusterVolume >> /tmp/vars.txt echo $siteFQDN >> /tmp/vars.txt echo $syslogserver >> /tmp/vars.txt @@ -311,7 +311,7 @@ EOF sed -i "s/^ExecStart.*/${VARNISHSTART}/" /lib/systemd/system/varnish.service # Configure varnish VCL for moodle - cat < /etc/varnish/moodle.vcl + cat <> /etc/varnish/moodle.vcl vcl 4.0; import std; From 4621ac35af9dd17e90cfc60808d0b2f5def83125 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Thu, 18 Jan 2018 16:19:21 -0800 Subject: [PATCH 016/559] Modify base URL for testing with my own fork --- azuredeploy.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azuredeploy.json b/azuredeploy.json index 2afc94bf..ab64b0c3 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -515,8 +515,8 @@ "documentation10": " controller - creates a jumpbox and deploys code", "documentation11": "GlusterFS Sizing guidance", "moodleCommon": { - "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/Moodle/master/nested/", - "scriptLocation": "https://raw.githubusercontent.com/Azure/Moodle/master/scripts/", + "baseTemplateUrl": "https://raw.githubusercontent.com/hosungsmsft/Moodle/master/nested/", + "scriptLocation": "https://raw.githubusercontent.com/hosungsmsft/Moodle/master/scripts/", "applyScriptsSwitch": "[parameters('applyScriptsSwitch')]", "autoscaleVmCount": "[parameters('autoscaleVmCount')]", From a2b1c91cc83942031380065e8db48ba8428ec080 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Fri, 19 Jan 2018 08:35:53 -0800 Subject: [PATCH 017/559] Fix ordering, change syslog dest for debug --- scripts/setup_moodle.sh | 78 ++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/scripts/setup_moodle.sh b/scripts/setup_moodle.sh index b05ac79c..1852f7e5 100644 --- a/scripts/setup_moodle.sh +++ b/scripts/setup_moodle.sh @@ -138,6 +138,40 @@ http { include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } +EOF + + cat <> /etc/nginx/sites-enabled/${siteFQDN}.conf +server { + listen 443 ssl; + root /moodle/html/moodle; + index index.php index.html index.htm; + + ssl on; + ssl_certificate /moodle/certs/nginx.crt; + ssl_certificate_key /moodle/certs/nginx.key; + + # Log to syslog + error_log syslog:server=localhost,facility=local1,severity=error,tag=moodle; + access_log syslog:server=localhost,facility=local1,severity=notice,tag=moodle moodle_combined; + + # Log XFF IP instead of varnish + set_real_ip_from 10.0.0.0/8; + set_real_ip_from 127.0.0.1; + set_real_ip_from 172.16.0.0/12; + set_real_ip_from 192.168.0.0/16; + real_ip_header X-Forwarded-For; + real_ip_recursive on; + + location / { + proxy_set_header Host \$host; + proxy_set_header HTTP_REFERER \$http_referer; + proxy_set_header X-Forwarded-Host \$host; + proxy_set_header X-Forwarded-Server \$host; + proxy_set_header X-Forwarded-Proto https; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_pass http://localhost:80; + } +} EOF if [ "$webServerType" = "nginx" ]; then @@ -196,44 +230,10 @@ server { EOF fi - cat < /etc/nginx/sites-enabled/${siteFQDN}.conf -server { - listen 443 ssl; - root /moodle/html/moodle; - index index.php index.html index.htm; - - ssl on; - ssl_certificate /moodle/certs/nginx.crt; - ssl_certificate_key /moodle/certs/nginx.key; - - # Log to syslog - error_log syslog:server=localhost,facility=local1,severity=error,tag=moodle; - access_log syslog:server=localhost,facility=local1,severity=notice,tag=moodle moodle_combined; - - # Log XFF IP instead of varnish - set_real_ip_from 10.0.0.0/8; - set_real_ip_from 127.0.0.1; - set_real_ip_from 172.16.0.0/12; - set_real_ip_from 192.168.0.0/16; - real_ip_header X-Forwarded-For; - real_ip_recursive on; - - location / { - proxy_set_header Host \$host; - proxy_set_header HTTP_REFERER \$http_referer; - proxy_set_header X-Forwarded-Host \$host; - proxy_set_header X-Forwarded-Server \$host; - proxy_set_header X-Forwarded-Proto https; - proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; - proxy_pass http://localhost:80; - } -} -EOF - - if [ "$webServerType" = "apache" ]; then - sed -i "s/Listen 80/Listen 81/" /etc/apache2/ports.conf + if [ "$webServerType" = "apache" ]; then + sed -i "s/Listen 80/Listen 81/" /etc/apache2/ports.conf - cat < /etc/apache2/sites-enabled/${siteFQDN}.conf + cat <> /etc/apache2/sites-enabled/${siteFQDN}.conf ServerName ${siteFQDN} @@ -246,8 +246,8 @@ EOF Require all granted - ErrorLog "|/usr/bin/logger -t moodle -p local1.error" - CustomLog "|/usr/bin/logger -t moodle -p local1.notice" combined + ErrorLog \${APACHE_LOG_DIR}/error.log + CustomLog \${APACHE_LOG_DIR}/access.log combined combined EOF From 7a30a1342420751b4ef0038798c85bddf47d0251 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Fri, 19 Jan 2018 10:17:09 -0800 Subject: [PATCH 018/559] Update the correct cmdExec for new webServerType param, try syslog forward --- nested/webvmss.json | 2 +- scripts/setup_moodle.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nested/webvmss.json b/nested/webvmss.json index c792ee10..7fec1356 100644 --- a/nested/webvmss.json +++ b/nested/webvmss.json @@ -197,7 +197,7 @@ } ], "variables": { - "cmdExec": "[concat('bash ',parameters('moodleCommon').moodleSetupScriptFilename,' ',parameters('moodleCommon').gfsNameRoot,'0', ' ','data', ' ', parameters('moodleCommon').siteURL, ' ', concat('jumpbox-vm-',parameters('moodleCommon').resourcesPrefix))]", + "cmdExec": "[concat('bash ',parameters('moodleCommon').moodleSetupScriptFilename,' ',parameters('moodleCommon').gfsNameRoot,'0', ' ','data', ' ', parameters('moodleCommon').siteURL, ' ', concat('jumpbox-vm-',parameters('moodleCommon').resourcesPrefix), ' ', parameters('moodleCommon').webServerType)]", "dstorID": "[resourceId('Microsoft.Storage/storageAccounts',parameters('moodleCommon').vmssdStorageAccounttName)]", "extBeID": "[concat(variables('extLbID'),'/backendAddressPools/',parameters('moodleCommon').extBeName)]", "extFeID": "[concat(variables('extLbID'),'/frontendIPConfigurations/',parameters('moodleCommon').extFeName)]", diff --git a/scripts/setup_moodle.sh b/scripts/setup_moodle.sh index 1852f7e5..dd22217e 100644 --- a/scripts/setup_moodle.sh +++ b/scripts/setup_moodle.sh @@ -246,8 +246,8 @@ EOF Require all granted - ErrorLog \${APACHE_LOG_DIR}/error.log - CustomLog \${APACHE_LOG_DIR}/access.log combined combined + ErrorLog "|/usr/bin/logger -t moodle -p local1.error" + CustomLog "|/usr/bin/logger -t moodle -p local1.notice" combined EOF From be137683919df2d718c163426d0c787dbea2dd1c Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Fri, 19 Jan 2018 19:27:43 +0000 Subject: [PATCH 019/559] Add initial Contribution guide --- CONTRIBUTE.md | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 37 ++++++++++++++------- 2 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 CONTRIBUTE.md diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md new file mode 100644 index 00000000..be90f45e --- /dev/null +++ b/CONTRIBUTE.md @@ -0,0 +1,91 @@ +# Contributing to Moodle on Azure + +This project welcomes contributions and suggestions. Our goal is to +work on Azure specific tooling for deploying and managing the open +source [Moodle](http://moodle.org) learning management system on +Azure. We do not work on Moodle itself here, instead we work upstream +as appropriate. + +The short version of how to contribute to this project is "just do +it". Where "it" can be defined as any valuable contribution (and to be +clear, asking questions is a valuable contribution): + + * ask questions + * provide feedback + * write or update documentation + * help new users + * recommend the project to others + * test the code and report bugs + * fix bugs and issue pull requests + * give us feedback on required features + * write and update the software + * create artwork + * translate to different languages + * anything you can see that needs doing + +Most contributions require you to agree to a Contributor License +Agreement (CLA) declaring that you have the right to, and actually do, +grant us the rights to use your contribution. For details, visit +https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine +whether you need to provide a CLA and decorate the PR appropriately +(e.g., label, comment). Simply follow the instructions provided by the +bot. You will only need to do this once across all repos using our +CLA. + +# Planning + +This is an open source project. We have a few mantras to ensure +efficient collaboration, these mostly boil down to ensuring good +visibility into the communities goals. These include: + + * If it didn't happen in public, it didn't happen + * Scratch your own itch + +## If it didn't happen in public, it didn't happen (aka full transparency) + +The goal of this mantra is to ensure maximum visibility into our +communities work in order to: + + 1. Provide an opportunity for community feedback in order to ensure + our plans are good + 2. Provide a clear indication of what will be done, what may be done + and what won't be done + +Both of these goals lead to the second mantra "Scratch your own itch". + +## Scratch your own itch (aka getting what you want) + +This is an open source project. We welcome feature requests and, as a +community, we will provide feedback on whether we intend to work on it +or not. To this end we categories feature requests in one of 4 ways: + + * Priority 0 (will address) + * Priority 1 (may address) + * Priority 2 (maybe one day) + * wontfix (out of scope) + +Using these priorities it is easy for community members to decide +where to spend their time. For example: + + * Priority 0 items are actively being worked on by at least one + community member. Others are welcome to contribute as appropriate + (reviews are particularly important) + * Priority 1 items are seen as important and are likely to be worked + on in the short to medium term, but there is no community member + active on the project at this time. Community members are welcome + to take ownership of these issues and propose a solution that they + intend to implement. If the community accepts the proposal then it + will become a Priority 0 issue. + * Priority 2 items are seen as interesting proposals that are not in + conflict with the projects goals but are unlikely to be worked on + by any existing communty members. Community members who have a + need for these items are strongly encouraged to identify + themselves and offer a proposal for a solution. If there is enough + support within the existing community this item can become a + Priority 0 under your leadership. + * Wontfix items are considered out of scope for this project. + Community members should seek to solve the problem in different + ways. Often this will mean contribution to Moodle itself or a + plugin that is external to this community. diff --git a/README.md b/README.md index c6abe171..6a0d76cd 100644 --- a/README.md +++ b/README.md @@ -32,17 +32,32 @@ Azure](docs/Deploy.md) right now. ## Contributing -This project welcomes contributions and suggestions. Most -contributions require you to agree to a Contributor License Agreement -(CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit -https://cla.microsoft.com. - -When you submit a pull request, a CLA-bot will automatically determine -whether you need to provide a CLA and decorate the PR appropriately -(e.g., label, comment). Simply follow the instructions provided by the -bot. You will only need to do this once across all repos using our -CLA. +This project welcomes contributions and suggestions. Our goal is to +work on Azure specific tooling for deploying and managing the open +source [Moodle](http://moodle.org) learning management system on +Azure. We do not work on Moodle itself here, instead we work upstream +as appropriate. + +The short version of how to contribute to this project is "just do +it". Where "it" can be defined as any valuable contribution (and to be +clear, asking questions is a valuable contribution): + + * ask questions + * provide feedback + * write or update documentation + * help new users + * recommend the project to others + * test the code and report bugs + * fix bugs and issue pull requests + * give us feedback on required features + * write and update the software + * create artwork + * translate to different languages + * anything you can see that needs doing + +For a more detailed discussion of how to contribute see our [Contribution Guide](CONTRIBUTE.md). + +## Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more From 0ee04575efb7e2ec1246efb061d21314144c5973 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Fri, 19 Jan 2018 19:36:15 +0000 Subject: [PATCH 020/559] script to check ARM related URLs, see #7 --- etc/checkBaseUrls.sh | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 etc/checkBaseUrls.sh diff --git a/etc/checkBaseUrls.sh b/etc/checkBaseUrls.sh new file mode 100755 index 00000000..5b2ed9af --- /dev/null +++ b/etc/checkBaseUrls.sh @@ -0,0 +1,58 @@ +# Ensure that the Base URL for templates, scripts and deploy to Azure buttons +# is correctly set for the current git branch. + +# Correct values for locations +CURRENT_BRANCH=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p') +echo "Current git branch is '$CURRENT_BRANCH'" + +BASE_TEMPLATE_URL=https://raw.githubusercontent.com/Azure/Moodle/$CURRENT_BRANCH/nested/ +echo "Base template URL: $BASE_TEMPLATE_URL" + +SCRIPT_LOCATION=https://raw.githubusercontent.com/Azure/Moodle/master/scripts/ +echo "Script location: $SCRIPT_LOCATION" + +DEPLOY_TO_AZURE_URL=https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2F$CURRENT_BRANCH%2Fazuredeploy.json +echo "Deploy to Azure URL: $DEPLOY_TO_AZURE_URL" + +VISUALIZE_URL=http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2F$CURRENT_BRANCH%2Fmaster%2Fazuredeploy.json +echo "Visualize template URL: $VISUALIZE_URL" + +# Check values in README.md + +VALUE=$(sed -n -e 's/.*deploybutton.png)](\(.*\))/\1/p' README.md) +if [[ "$VALUE" = "$DEPLOY_TO_AZURE_URL" ]] +then + echo "Deploy to Azure URL is set correctly" +else + echo "Deploy to Azure URL is not set correctly in README.md, it is currently:" + echo $VALUE +fi + +VALUE=$(sed -n -e 's/.*visualizebutton.png)](\(.*\))/\1/p' README.md) +if [[ "$VALUE" = "$VISUALIZE_URL" ]] +then + echo "Visualize URL is set correctly" +else + echo "Visualize URL is not set correctly in README.md, it is currently:" + echo $VALUE +fi + +# Check values in azuredeploy.json + +VALUE=$(sed -n -e 's/\"baseTemplateUrl\": \"\(.*\)\",/\1/p' azuredeploy.json) +if [[ "$VALUE" = "$BASE_TEMPLATE_URL" ]] +then + echo "baseTemplateURL is set correctly" +else + echo "baseTemplateURL is not set correctly, it is currently:" + echo $VALUE +fi + +VALUE=$(sed -n -e 's/\"scriptLocation\": \"\(.*\)\",/\1/p' azuredeploy.json) +if [[ "$VALUE" = "$BASE_TEMPLATE_URL" ]] +then + echo "scriptLocation is set correctly" +else + echo "scriptLocation is not set correctly, it is currently:" + echo $VALUE +fi From a0d91e4eaa58c3d4740c968a176d87be5df8afcf Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Fri, 19 Jan 2018 20:23:01 +0000 Subject: [PATCH 021/559] document roles and review process --- CONTRIBUTE.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index be90f45e..69f67bea 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -89,3 +89,108 @@ where to spend their time. For example: Community members should seek to solve the problem in different ways. Often this will mean contribution to Moodle itself or a plugin that is external to this community. + +# Community roles + +This section outlines roles and responsibilities within the community. + +## Users + +Users self-identify by using our software and documentation. Their +responsibilities are to benefit from our work, but we welcome +contributions from users, such as: + + * Ask questions + * Answer questions + * Feature requests + * Bug reports + * Design reviews + * Planning reviews + * Evangelize the project + * and more... + +Some users will become more involved with the project, those users +become Contributors. + +## Contributors + +Contributes self-identify by making longer term commitments to our +project. Their responsibilities are to help the project be succesful +by ensuring that our work matches the needs of our users. +Possible contributions can include: + + * Everything a User might contribute + * Remove blocks for users + * Provide design input + * Review pull requests + * Implement features + * Triage questions, feature requests and bug reports + * and more... + +Some contributors will become very engaged and therefore become an +essential part of the community, these contributors will become +Maintainers. + +## Maintainers + +We are fans of efficient processes. Maintainers are people who insert +themselves into our process to ensure they run well. The goal is to +empower our contributors who in turn focus on delighting our users. +Maintainers contributions may include: + + * Everyting Users and Contributors do + * Merge pull requests where appropriate + * Seek community consensus where conflict occurs + * Remove blocks for contributors + * and more... + +# Pull requests, Review and Merges + +We like efficient processes. Anyone is welcome to issue pull requests. +Everyone is encouraged to review pull requests. Maintainers are +responsible for merging pull requests but they are not responsible for +reviews, that is a community wide responsibility. + +We operate under two models of review process as appropriate to each +circumstance: + + * Merge then Review (our preferred model) + * Review then Merge + +## Merge Then Review + +In the "merge then review" model a maintainer will merge the pull +request into with minimal review. Community members are still expected +to review the code, but it is done after the fact. + +The goal is to get the code into a shared repository as early as +possible. This allows people, including advanced users, to start +testing it. This ensures we have the maximum possible exposure to +testing in real scenarios early in the process. Encouragin bug reports +from the whole community ensures we have visibility into breaks as +early as possible. + +This model has its risks, however. If a PR is on the critical path or +it is controversial in some way it is expected that maintainers will +ensure it recieves a thorough review before merging (see next section +on "Review then Merge". This decision is at the discretion of the +maintainer who first triages the pull request. + +Should a mistake be made and a bad merge be performed then it can +often be easier and faster to fix it under the "Merge then Review" +model than it is to provide feedback to the original author and await +a fix from them. Should the mistake have a high impact and/or no easy +fix is available we simply roll back the merge and provide feedback +via the review process. + +It should be noted that this model means that maintainers have the +right to simply merge their own code and expect others to review it +*after*. Maintainers are expected to use their best judgement when +excercising this priviledge. + +## Review Then Merge + +Where a change is on the critical path or it is potentiall +contriversial maintainers should request reviews using the GitHub +tooling. The last reviewer to sign-off on the pull request will merge +the pull request. From b732567ec1f17955b3572a47b3fba2a81d0c2a81 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Fri, 19 Jan 2018 14:33:45 -0800 Subject: [PATCH 022/559] Update repo name for merging to Azure:Moodle --- azuredeploy.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azuredeploy.json b/azuredeploy.json index ab64b0c3..2afc94bf 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -515,8 +515,8 @@ "documentation10": " controller - creates a jumpbox and deploys code", "documentation11": "GlusterFS Sizing guidance", "moodleCommon": { - "baseTemplateUrl": "https://raw.githubusercontent.com/hosungsmsft/Moodle/master/nested/", - "scriptLocation": "https://raw.githubusercontent.com/hosungsmsft/Moodle/master/scripts/", + "baseTemplateUrl": "https://raw.githubusercontent.com/Azure/Moodle/master/nested/", + "scriptLocation": "https://raw.githubusercontent.com/Azure/Moodle/master/scripts/", "applyScriptsSwitch": "[parameters('applyScriptsSwitch')]", "autoscaleVmCount": "[parameters('autoscaleVmCount')]", From 1d743f18aec0aff4baf76d4df2f2da25bc7715a8 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Sat, 20 Jan 2018 17:42:03 -0800 Subject: [PATCH 023/559] Fix etc/checkBaseUrls.sh --- etc/checkBaseUrls.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/etc/checkBaseUrls.sh b/etc/checkBaseUrls.sh index 5b2ed9af..c71dd6c4 100755 --- a/etc/checkBaseUrls.sh +++ b/etc/checkBaseUrls.sh @@ -8,51 +8,51 @@ echo "Current git branch is '$CURRENT_BRANCH'" BASE_TEMPLATE_URL=https://raw.githubusercontent.com/Azure/Moodle/$CURRENT_BRANCH/nested/ echo "Base template URL: $BASE_TEMPLATE_URL" -SCRIPT_LOCATION=https://raw.githubusercontent.com/Azure/Moodle/master/scripts/ +SCRIPT_LOCATION=https://raw.githubusercontent.com/Azure/Moodle/$CURRENT_BRANCH/scripts/ echo "Script location: $SCRIPT_LOCATION" DEPLOY_TO_AZURE_URL=https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2F$CURRENT_BRANCH%2Fazuredeploy.json echo "Deploy to Azure URL: $DEPLOY_TO_AZURE_URL" -VISUALIZE_URL=http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2F$CURRENT_BRANCH%2Fmaster%2Fazuredeploy.json +VISUALIZE_URL=http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FMoodle%2F$CURRENT_BRANCH%2Fazuredeploy.json echo "Visualize template URL: $VISUALIZE_URL" # Check values in README.md -VALUE=$(sed -n -e 's/.*deploybutton.png)](\(.*\))/\1/p' README.md) +VALUE=$(sed -n -e 's/.*deploybutton.png)](\([^)]*\)).*/\1/p' README.md) if [[ "$VALUE" = "$DEPLOY_TO_AZURE_URL" ]] then echo "Deploy to Azure URL is set correctly" else - echo "Deploy to Azure URL is not set correctly in README.md, it is currently:" + echo "!!!!! Deploy to Azure URL is not set correctly in README.md, it is currently:" echo $VALUE fi -VALUE=$(sed -n -e 's/.*visualizebutton.png)](\(.*\))/\1/p' README.md) +VALUE=$(sed -n -e 's/.*visualizebutton.png)](\([^)]*\)).*/\1/p' README.md) if [[ "$VALUE" = "$VISUALIZE_URL" ]] then echo "Visualize URL is set correctly" else - echo "Visualize URL is not set correctly in README.md, it is currently:" + echo "!!!!! Visualize URL is not set correctly in README.md, it is currently:" echo $VALUE fi # Check values in azuredeploy.json -VALUE=$(sed -n -e 's/\"baseTemplateUrl\": \"\(.*\)\",/\1/p' azuredeploy.json) +VALUE=$(sed -n -e 's/.*\"baseTemplateUrl\": \"\([^\"]*\)\",/\1/p' azuredeploy.json) if [[ "$VALUE" = "$BASE_TEMPLATE_URL" ]] then echo "baseTemplateURL is set correctly" else - echo "baseTemplateURL is not set correctly, it is currently:" + echo "!!!!! baseTemplateURL is not set correctly, it is currently:" echo $VALUE fi -VALUE=$(sed -n -e 's/\"scriptLocation\": \"\(.*\)\",/\1/p' azuredeploy.json) -if [[ "$VALUE" = "$BASE_TEMPLATE_URL" ]] +VALUE=$(sed -n -e 's/.*\"scriptLocation\": \"\([^\"]*\)\",/\1/p' azuredeploy.json) +if [[ "$VALUE" = "$SCRIPT_LOCATION" ]] then echo "scriptLocation is set correctly" else - echo "scriptLocation is not set correctly, it is currently:" + echo "!!!!! scriptLocation is not set correctly, it is currently:" echo $VALUE fi From 6b0d0f78296e8f19252ed908c6c9d01555309e68 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Fri, 26 Jan 2018 15:00:19 -0800 Subject: [PATCH 024/559] Misc updates (#18) - Use host metrics without diagnostic extension for VMSS scaling - Use CustomScript extension 2.0 - Redirect outside http traffic to https - Log real IPs instead of varnish (localhost) - Change default DB type to mysql --- README.md | 2 +- azuredeploy.json | 6 +++--- azuredeploy.parameters.json | 2 +- nested/webvmss.json | 32 +++++--------------------------- scripts/setup_moodle.sh | 19 +++++++++++++++++-- 5 files changed, 27 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 8d6c52c8..8e471d20 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ CLI](docs/Deploy.md). ## What this stack will give you This template set deploys the following infrastructure: -- Autoscaling web frontend layer (Nginx for https termination, Varnish for caching, Nginx/php-fpm or Apache/php) +- Autoscaling web frontend layer (Nginx for https termination, Varnish for caching, Apache/php or nginx/php-fpm) - Private virtual network for frontend instances - Controller instance running cron and handling syslog for the autoscaled site - Load balancer to balance across the autoscaled instances diff --git a/azuredeploy.json b/azuredeploy.json index 2afc94bf..71d278cf 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -38,10 +38,10 @@ "type": "string" }, "dbServerType": { - "defaultValue": "postgres", + "defaultValue": "mysql", "allowedValues": [ - "postgres", - "mysql" + "mysql", + "postgres" ], "metadata": { "description": "Database type" diff --git a/azuredeploy.parameters.json b/azuredeploy.parameters.json index 525cada7..ef4c8219 100644 --- a/azuredeploy.parameters.json +++ b/azuredeploy.parameters.json @@ -7,7 +7,7 @@ "azureBackupSwitch": { "value": 0 }, "blobStorageAccountType": { "value": "Standard_LRS"}, "controllerVmSku": { "value": "Standard_DS1_v2" }, - "dbServerType": { "value": "postgres" }, + "dbServerType": { "value": "mysql" }, "webServerType": { "value": "apache" }, "elasticVmSku": { "value": "Standard_DS2_v2" }, "glusterDiskCount": { "value": 4 }, diff --git a/nested/webvmss.json b/nested/webvmss.json index 7fec1356..3862ad0b 100644 --- a/nested/webvmss.json +++ b/nested/webvmss.json @@ -34,37 +34,19 @@ "virtualMachineProfile": { "extensionProfile": { "extensions": [ - { - "name": "LinuxDiagnostic", - "properties": { - "autoUpgradeMinorVersion": true, - "protectedSettings": { - "storageAccountEndPoint": "https://core.windows.net", - "storageAccountKey": "[listkeys(variables('dstorID'), variables('storageApiVersion')).key1]", - "storageAccountName": "[parameters('moodleCommon').vmssdStorageAccounttName]" - }, - "publisher": "Microsoft.OSTCExtensions", - "settings": { - "storageAccount": "[parameters('moodleCommon').vmssdStorageAccounttName]", - "xmlCfg": "[base64(concat(variables('wadCfgxStart'), variables('vmssID'), variables('wadCfgxEnd')))]" - }, - "type": "LinuxDiagnostic", - "typeHandlerVersion": "2.3" - } - }, { "name": "setup_moodle", "properties": { "autoUpgradeMinorVersion": true, - "publisher": "Microsoft.OSTCExtensions", + "publisher": "Microsoft.Azure.Extensions", "settings": { "commandToExecute": "[variables('cmdExec')]", "fileUris": [ "[variables('scriptUri')]" ] }, - "type": "CustomScriptForLinux", - "typeHandlerVersion": "1.4" + "type": "CustomScript", + "typeHandlerVersion": "2.0" } } ] @@ -152,7 +134,7 @@ "rules": [ { "metricTrigger": { - "metricName": "\\Processor\\PercentProcessorTime", + "metricName": "Percentage CPU", "metricNamespace": "", "metricResourceUri": "[variables('vmssID')]", "operator": "GreaterThan", @@ -171,7 +153,7 @@ }, { "metricTrigger": { - "metricName": "\\Processor\\PercentProcessorTime", + "metricName": "Percentage CPU", "metricNamespace": "", "metricResourceUri": "[variables('vmssID')]", "operator": "LessThan", @@ -208,10 +190,6 @@ "storageApiVersion": "2015-06-15", "subnetWebRef": "[concat(resourceId('Microsoft.Network/virtualNetworks',parameters('moodleCommon').vnetName),'/subnets/',parameters('moodleCommon').subnetWeb)]", "vmssID": "[resourceId('Microsoft.Compute/virtualMachineScaleSets',parameters('moodleCommon').vmssName)]", - "wadCfgxEnd": "[concat('\">')]", - "wadCfgxStart": "[concat(variables('wadLogs'),variables('wadPerfCounter'),'", - "wadPerfCounter": "", "webvmss1NIC": "[concat('Microsoft.Compute/virtualMachineScaleSets/', parameters('moodleCommon').vmssName, '/virtualMachines/0/networkInterfaces/vmssnic')]" }, "outputs": { diff --git a/scripts/setup_moodle.sh b/scripts/setup_moodle.sh index dd22217e..e314897f 100644 --- a/scripts/setup_moodle.sh +++ b/scripts/setup_moodle.sh @@ -140,7 +140,8 @@ http { } EOF - cat <> /etc/nginx/sites-enabled/${siteFQDN}.conf + # Configure nginx/https + cat <> /etc/nginx/sites-enabled/${siteFQDN}.conf server { listen 443 ssl; root /moodle/html/moodle; @@ -231,7 +232,9 @@ EOF fi if [ "$webServerType" = "apache" ]; then + # Configure Apache/php sed -i "s/Listen 80/Listen 81/" /etc/apache2/ports.conf + a2enmod rewrite && a2enmod remoteip && a2enmod headers cat <> /etc/apache2/sites-enabled/${siteFQDN}.conf @@ -246,8 +249,20 @@ EOF Require all granted + # Redirect unencrypted direct connections to HTTPS + + RewriteEngine on + RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC] + RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301] + + + # Log X-Forwarded-For IP address instead of varnish (127.0.0.1) + SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" forwarded ErrorLog "|/usr/bin/logger -t moodle -p local1.error" - CustomLog "|/usr/bin/logger -t moodle -p local1.notice" combined + CustomLog "|/usr/bin/logger -t moodle -p local1.notice" combined env=!forwarded + CustomLog "|/usr/bin/logger -t moodle -p local1.notice" forwarded env=forwarded EOF From a248e3f98abdd68e2f7effcc8bad5e43c7a2f381 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Fri, 26 Jan 2018 23:06:23 +0000 Subject: [PATCH 025/559] put the ENV variables into the main script (need to be extracted later), correct links for dependent projects: --- docs/Deploy.md | 8 +++++--- docs/Manage.md | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/Deploy.md b/docs/Deploy.md index f59cb26b..5fabcb19 100644 --- a/docs/Deploy.md +++ b/docs/Deploy.md @@ -21,6 +21,10 @@ into `env.local.json` and edit the contents accordingly. The values set within that file are: ``` shell +TIME=$(date +%s) +MOODLE_RG_NAME=moodle_$TIME +MOODLE_RG_LOCATION=southcentralus +MOODLE_DEPLOYMENT_NAME="MasterDeploy" echo "Resource Group Name : $MOODLE_RG_NAME" echo "Resource Group Location : $MOODLE_RG_LOCATION" echo "Deployment Name : $MOODLE_DEPLOYMENT_NAME" @@ -68,9 +72,7 @@ proceed with the defaults, but there is one value, the `sshPublicKey` that **must** be provided. To automatically add your default SSH key (in Bash) use the following command: -``` FIXME: sed command to add SSH key -``` ## Deploy cluster @@ -78,7 +80,7 @@ Now that we have a resource group and a configuration file we can create the cluster itself. This is done with a single command: ``` -az group deployment create --name $MOODLE_DEPLOYMENT_NAME --resource-group $MOODLE_RG_NAME --template-file ~/projects/azure-quickstart-templates/moodle-scalable-cluster-ubuntu/azuredeploy.json --parameters azuredeploy.parameters.json +az group deployment create --name $MOODLE_DEPLOYMENT_NAME --resource-group $MOODLE_RG_NAME --template-file ../azuredeploy.json --parameters azuredeploy.parameters.json ``` ## Using the created stack diff --git a/docs/Manage.md b/docs/Manage.md index 954749cd..5c5ad423 100644 --- a/docs/Manage.md +++ b/docs/Manage.md @@ -6,9 +6,9 @@ management tasks on a scalable Moodle cluster on Azure. ## Prerequisites In order to manage a cluster it is clearly necessary to first [deploy -a scalable Moodle cluster on Azure](../Deploy/README.md). +a scalable Moodle cluster on Azure](./Deploy.md). -For convenience and readability this document also assumes that essential [deployment details for your cluster have been assigned to environment variables](../GetInstallData/README.md). +For convenience and readability this document also assumes that essential [deployment details for your cluster have been assigned to environment variables](./Get-Install-Data.md). ## Updating Moodle code/settings From 49a2b5c51f8d36142423172e9180d7be8610a597 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Fri, 26 Jan 2018 23:07:15 +0000 Subject: [PATCH 026/559] beginings of a test document --- docs/Test.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/Test.md diff --git a/docs/Test.md b/docs/Test.md new file mode 100644 index 00000000..09925873 --- /dev/null +++ b/docs/Test.md @@ -0,0 +1,9 @@ +# Test a Moodle Instance + +## Prerequisites + +It is obviously necessary to have a [Moodle cluster up and running](./Deploy.md). + +## Next Steps + + * [Delete all Resources](./Delete.md) From 951c2c0b35d24b728e6ae62d7c36a5ce2017d4ad Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Sat, 27 Jan 2018 00:50:00 +0000 Subject: [PATCH 027/559] add a PID to the template --- azuredeploy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azuredeploy.json b/azuredeploy.json index 71d278cf..983ad1d2 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -410,7 +410,7 @@ "Microsoft.Resources/deployments/redisTemplate", "Microsoft.Resources/deployments/blobStorageAccountTemplate" ], - "name": "controllerTemplate", + "name": "pid-738e3eec-68d4-4667-8377-c05c77c21f1b", "properties": { "mode": "Incremental", "parameters": { From 5e3025dda7cfa678496f64b5db7233437e13fd1d Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Tue, 30 Jan 2018 00:50:31 +0000 Subject: [PATCH 028/559] rather than change the name of an existing deployment add an empty deployment --- azuredeploy.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/azuredeploy.json b/azuredeploy.json index 983ad1d2..f223d601 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -294,6 +294,18 @@ } }, "resources": [ + { + "name": "pid-738e3eec-68d4-4667-8377-c05c77c21f1b", + "type": "Microsoft.Resources/deployments", + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [] + } + } + }, { "apiVersion": "2015-01-01", "name": "dbTemplate", @@ -410,7 +422,7 @@ "Microsoft.Resources/deployments/redisTemplate", "Microsoft.Resources/deployments/blobStorageAccountTemplate" ], - "name": "pid-738e3eec-68d4-4667-8377-c05c77c21f1b", + "name": "controllerTemplate", "properties": { "mode": "Incremental", "parameters": { From b153af34174a3fe6c8635887aa316e80b988bc47 Mon Sep 17 00:00:00 2001 From: Hosung Song Date: Mon, 29 Jan 2018 21:04:55 -0800 Subject: [PATCH 029/559] Update stack diagram for Apache --- README.md | 2 +- images/stack_diagram.jpg | Bin 227027 -> 0 bytes images/stack_diagram.png | Bin 0 -> 118339 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 images/stack_diagram.jpg create mode 100644 images/stack_diagram.png diff --git a/README.md b/README.md index 8e471d20..019fdd36 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ This template set deploys the following infrastructure: - Three Elasticsearch VMs for search indexing in Moodle - Dual gluster nodes for high availability access to Moodle files -![network_diagram](images/stack_diagram.jpg "Diagram of deployed stack") +![network_diagram](images/stack_diagram.png "Diagram of deployed stack") ## Quickstart diff --git a/images/stack_diagram.jpg b/images/stack_diagram.jpg deleted file mode 100644 index bda6c3f7ea4ada360d7a803ecfb042df455417e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227027 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%0DyeL2K815 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