├── LICENSE ├── NOTICE ├── README.md ├── bosh-lite ├── cloud-config.yml └── default-vars.yml ├── cf-mysql-deployment.yml ├── docs └── using-cf-mysql.md ├── githooks └── pre-push ├── operations ├── README.md ├── add-broker.yml ├── add-roadmin.yml ├── add-tls.yml ├── add-xenial-default-stemcell.yml ├── bosh-dns.yml ├── bosh-lite.yml ├── configure-broker-load-balancer.yml ├── disable-broker-route-registrar-cross-deployment-links.yml ├── disable-proxy-consul-cross-deployment-links.yml ├── disable-proxy-route-registrar-cross-deployment-links.yml ├── disable-smoke-tests-cross-deployment-links.yml ├── enable-syslog.yml ├── latest-versions.yml ├── no-arbitrator.yml ├── proxy-consul.yml ├── proxy-elb.yml ├── register-proxy-route.yml ├── syslog-tls.yml ├── test │ ├── enable-remote-admin-access.yml │ └── minimal-mode.yml └── xenial-stemcell.yml └── scripts ├── deploy-cf-mysql-to-bosh-lite └── deploy-cf-mysql-with-broker-to-bosh-lite /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. 2 | 3 | This project is licensed to you under the Apache License, Version 2.0 (the "License"). 4 | 5 | You may not use this project except in compliance with the License. 6 | 7 | This project may include a number of subcomponents with separate copyright notices 8 | and license terms. Your use of these subcomponents is subject to the terms and 9 | conditions of the subcomponent's license, as noted in the LICENSE file. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DEPRECATED: cf-mysql-release is deprecated and this repo is no longer maintained. 2 | 3 | See [pxc-release](https://github.com/cloudfoundry/pxc-release) 4 | 5 | # Cloud Foundry MySQL Bosh Deployment 6 | 7 | ## Table of contents 8 | 9 | [Usage](#usage) 10 | 11 | [Deploying](#deploying) 12 | 13 | [Security Groups](#security-groups) 14 | 15 | [Registering the Service Broker](#registering-broker) 16 | 17 | [Smoke Tests](#smoke-tests) 18 | 19 | [Deregistering the Service Broker](#deregistering-broker) 20 | 21 | 22 | This repo contains a BOSH 2 manifest that defines tested topologies of cf-mysql-release. 23 | 24 | It serves as the reference for the compatible release and stemcell versions. 25 | 26 | This repo takes advantage of new features such as: 27 | 28 | - [cloud config](https://bosh.io/docs/cloud-config.html) 29 | - [job links](https://bosh.io/docs/links.html) 30 | - [new CLI](https://github.com/cloudfoundry/bosh-cli) 31 | - The new BOSH CLI must be installed according to the instructions [here](https://bosh.io/docs/cli-v2.html). 32 | 33 | Please refer to BOSH documentation for more details. If you're having troubles 34 | with the pre-requisites, please contact the BOSH team for help 35 | (perhaps on [slack](https://slack.cloudfoundry.org/)). 36 | 37 | 38 | ## Usage 39 | 40 | ### Prerequisites 41 | 42 | - A deployment of [BOSH](https://github.com/cloudfoundry/bosh) 43 | - A deployment of [Cloud Foundry](https://github.com/cloudfoundry/cf-release), [final release 193](https://github.com/cloudfoundry/cf-release/tree/v193) or greater 44 | - Instructions for installing BOSH and Cloud Foundry can be found at http://docs.cloudfoundry.org/. 45 | - [Routing release](https://github.com/cloudfoundry-incubator/routing-release) 46 | v0.145.0 or later is required to register the proxy and broker routes with 47 | Cloud Foundry: 48 | 49 | ```bash 50 | bosh upload release https://bosh.io/d/github.com/cloudfoundry-incubator/cf-routing-release?v=0.145.0 51 | ``` 52 | 53 | Standalone deployments (i.e. deployments that do not interact with Cloud Foundry) 54 | do not require the routing release. 55 | 56 | 57 | ### Upload Stemcell 58 | 59 | The latest final release expects the Ubuntu Trusty (14.04) go_agent stemcell version [2859](https://github.com/cloudfoundry/bosh/blob/master/CHANGELOG.md#2859) by default. Older stemcells are not recommended. Stemcells can be downloaded from http://bosh.io/stemcells; choose the appropriate stemcell for your infrastructure ([vsphere esxi](https://d26ekeud912fhb.cloudfront.net/bosh-stemcell/vsphere/bosh-stemcell-2859-vsphere-esxi-ubuntu-trusty-go_agent.tgz), [aws hvm](https://d26ekeud912fhb.cloudfront.net/bosh-stemcell/aws/light-bosh-stemcell-2859-aws-xen-hvm-ubuntu-trusty-go_agent.tgz), or [openstack kvm](https://d26ekeud912fhb.cloudfront.net/bosh-stemcell/openstack/bosh-stemcell-2859-openstack-kvm-ubuntu-trusty-go_agent.tgz)). 60 | 61 | 62 | ### Upload Release 63 | 64 | You can use a pre-built final release or build a dev release from any of the branches described in Getting the Code. 65 | 66 | Final releases are stable releases created periodically for completed features. They also contain pre-compiled packages, which makes deployment much faster. To deploy the latest final release, simply check out the **master** branch. This will contain the latest final release and accompanying materials to generate a manifest. If you would like to deploy an earlier final release, use `git checkout ` to obtain both the release and corresponding manifest generation materials. It's important that the manifest generation materials are consistent with the release. 67 | 68 | If you'd like to deploy the latest code, build a release yourself from the **develop** branch. 69 | 70 | #### Create and upload a BOSH Release: 71 | 72 | 1. Build the development release. 73 | 74 | ``` 75 | $ cd ~/workspace/cf-mysql-release 76 | $ git checkout release-candidate 77 | $ ./scripts/update 78 | $ bosh2 create-release 79 | ``` 80 | 81 | 1. Upload the release to your bosh environment: 82 | 83 | ``` 84 | $ bosh2 -e YOUR_ENV upload-release 85 | ``` 86 | 87 | 88 | ### Create Infrastructure 89 | 90 | #### Define subnets 91 | 92 | Prior to deployment, the operator should define three subnets via their infrastructure provider. 93 | The MySQL release is designed to be deployed across three subnets to ensure availability in the event of a subnet failure. 94 | 95 | #### Create load balancer 96 | 97 | In order to route requests to both proxies, the operator should create a load balancer. 98 | Manifest changes required to configure a load balancer can be found in the 99 | [proxy](https://github.com/cloudfoundry/cf-mysql-release/blob/master/docs/proxy.md#configuring-load-balancer) documentation. 100 | Once a load balancer is configured, the brokers will hand out the address of the load balancer rather than the IP of the first proxy. 101 | 102 | - **Note:** When using an Elastic Load Balancer (ELB) on Amazon, make sure to create the ELB in the same VPC as your cf-mysql deployment 103 | - **Note:** For all load balancers, take special care to configure health checks to use the health_port of the proxies (default 1936). Do not configure the load balancer health check to use port 3306. 104 | - **You must use the IP address(es) of your load balancer in the p-mysql [security group](#security-groups)**, below. Otherwise, applications will not be able to connect to the database. 105 | 106 | There are two ways to configure a load balancer, either automatically through your IaaS or by supplying static IPs for the proxies 107 | 108 | ##### For IaaS native load balancers (AWS elb, GCP target_pool, etc) 109 | 110 | In order for the MySQL deployment to attach the proxy instances to your configured load balancer, you need to use the [proxy-elb.yml](https://github.com/cloudfoundry/cf-mysql-deployment/blob/develop/operations/proxy-elb.yml) opsfile. This opsfile requires a [vm_extension](https://bosh.io/docs/cloud-config.html#vm-extensions) in your [cloud-config](https://bosh.io/docs/cloud-config.html) which references your load balancer and also defines the specific requirements for your IaaS. You'll need to consult your IaaS documentation as well as your BOSH CPI documentation for the specifics of the `cloud_properties` definitions for use in your `vm_extension`. You can read more specifics about configuration of the proxies [here](https://github.com/cloudfoundry/cf-mysql-release/blob/develop/docs/proxy.md). 111 | 112 | ##### For custom load balancers (haproxy, f5, etc) 113 | 114 | If you would like to use a custom load balancer, you can manually configure your proxies to use static IP addresses which your load balancer can point to. To do that, create an operations file that looks like the following, with static IPs that make sense for your network: 115 | ```yaml 116 | - type: replace 117 | path: /instance_groups/name=proxy/networks 118 | value: 119 | - name: default 120 | static_ips: 121 | - 10.10.0.1 122 | - 10.10.0.2 123 | ``` 124 | 125 | 126 | ## Deploying 127 | ### Deployment Components 128 | 129 | #### Database nodes 130 | 131 | The number of mysql nodes should always be odd, with a minimum count of three, to avoid [split-brain](http://en.wikipedia.org/wiki/Split-brain\_\(computing\)). 132 | When the failed node comes back online, it will automatically rejoin the cluster and sync data from one of the healthy nodes. 133 | 134 | The MariaDB cluster nodes are configured by default with 10GB of persistent disk. This can be configured using an operations file to change `instance_groups/name=mysql/persistent_disk` and `properties/cf_mysql/mysql/persistent_disk`, however your deployment will fail if this is less than 3GB. 135 | 136 | #### Proxy nodes 137 | 138 | There are two proxy instances. The second proxy is intended to be used in a failover capacity. 139 | In the event the first proxy fails, the second proxy will still be able to route requests to the mysql nodes. 140 | 141 | #### Broker nodes 142 | 143 | There are also two broker instances. 144 | The brokers each register a route with the router, which load balances requests across the brokers. 145 | 146 | ### New deployments 147 | 148 | New deployments will work "out of the box" with little additional configuration. 149 | There are two mechanisms for providing credentials to the deployment: 150 | 151 | - Credentials can be provided with `-l ` (see below for more 152 | information on variable files). 153 | - variables store file should be provided with 154 | `--vars-store ` to let the CLI generate secure passwords 155 | and write them to the provided vars store file. 156 | 157 | By default the deployment manifest will not deploy brokers, nor try to register 158 | routes for the proxies with a Cloud Foundry router. To enable integration with 159 | Cloud Foundry, operations files are provided to 160 | [add brokers](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/add-broker.yml) 161 | and 162 | [register proxy routes](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/register-proxy-route.yml). 163 | 164 | If you require static IPs for the proxy instance groups, these IPs should be 165 | added to the `networks` section of the cloud-config as well as to an operations file 166 | which will use these IPs for the proxy instance groups. See below for more 167 | information on operations files. 168 | 169 | ```sh 170 | bosh \ 171 | -e my-director \ 172 | -d cf-mysql \ 173 | deploy \ 174 | ~/workspace/cf-mysql-deployment/cf-mysql-deployment.yml \ 175 | -o 176 | ``` 177 | 178 | ### Upgrading from previous deployment topologies 179 | 180 | If you are upgrading an existing deployment of cf-mysql-release with a manifest 181 | that does not take advantage of these new features, for example if the manifest 182 | was generated via the spiff templates and stubs provided in the cf-mysql-release 183 | repository, then be aware: 184 | 185 | 1. The base manifest refers to AZs called `z1`, `z2`, and `z3`. If your 186 | cloud-config doesn't have those AZs, it will result in an error. 187 | 1. The base manifest will not deploy brokers, nor try to register routes for the proxies with a Cloud Foundry router. If you wish to preserve this behavior you will need to include the [add brokers](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/add-broker.yml) and [register proxy routes](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/register-proxy-route.yml) operations files. 188 | 1. Create custom operations files to map any non-default configuration (e.g. the number of maximum connections). 189 | 1. Create a custom operation file to migrate your BOSH 1 `jobs` and static IPs to their new BOSH 2 `instance_groups`. See the section below for [more information](#operations-file-for-migrating-from-bosh-1-style-manifest-to-a-bosh-2-style-manifest). 190 | 1. Create a variables file to contain the credentials of the existing deployment. 191 | - Using `--vars-store` is not recommended as it will result in credentials being rotated which can cause issues. 192 | 1. Run the following command: 193 | 194 | ```sh 195 | bosh \ 196 | -e my-director \ 197 | -d my-deployment \ 198 | deploy \ 199 | ~/workspace/cf-mysql-deployment/cf-mysql-deployment.yml \ 200 | -o \ 201 | [-o ] \ 202 | -l \ 203 | [-l ] 204 | ``` 205 | 206 | #### Operations file for migrating from BOSH 1 style manifest to a BOSH 2 style manifest 207 | Refer to [these docs](https://bosh.io/docs/migrated-from.html) on migrating from a BOSH 1 style manifest, then create an ops file to mix in those migrations into the base deployment manifest. See below for an example: 208 | 209 | ```yaml 210 | 211 | --- 212 | - type: replace 213 | path: /instance_groups/name=mysql/migrated_from? 214 | value: 215 | - name: mysql_z1 216 | az: z1 217 | - name: mysql_z2 218 | az: z2 219 | - name: mysql_z3 220 | az: z3 221 | 222 | - type: replace 223 | path: /instance_groups/name=mysql/networks 224 | value: 225 | - name: default 226 | static_ips: 227 | - 10.10.0.1 228 | - 10.10.0.2 229 | - 10.10.0.3 230 | ``` 231 | 232 | ## Operations files 233 | 234 | Additional example operations files used for common configurations of `cf-mysql-release` (e.g. adding a broker for 235 | Cloud Foundry integration) can be found in the [operations](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations) 236 | directory. See the README in that directory for a description of which (combinations) of files to use for enabling each common feature set. 237 | 238 | The [manifest template](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/cf-mysql-deployment.yml) 239 | is not intended to be modified; any changes you need to make should be added to operations files. 240 | 241 | The syntax for operations files is detailed 242 | [here](http://bosh.io/docs/cli-ops-files.html). 243 | 244 | Operations files can be provided at deploy-time as follows: 245 | 246 | ```sh 247 | bosh \ 248 | deploy \ 249 | -o 250 | ``` 251 | 252 | ### Variables files 253 | 254 | Variables files are a flat-format key-value yaml file which contains sensitive 255 | information such as passwords, ssl keys/certs etc. 256 | 257 | They can be provided at deploy-time as follows: 258 | 259 | ```sh 260 | bosh \ 261 | deploy \ 262 | -l 263 | ``` 264 | 265 | We provide a default set of variables intended for a local bosh-lite environment 266 | [here](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/bosh-lite/default-vars.yml). 267 | 268 | Use this as an example for your environment-specific variables file. 269 | 270 | ### Cross-deployment links 271 | 272 | By default, this deployment assumes that some variables (e.g. nats) are provided 273 | by cross-deployment links from a deployment named `cf`. 274 | This will be true if Cloud Foundry was deployed via 275 | [cf-deployment](https://github.com/cloudfoundry/cf-deployment). 276 | 277 | If you wish to disable cross-deployment links, use the 278 | `disable-cross-deployment-links.yml` operations file. 279 | 280 | Disabling cross-deployment links will require these values to be provided 281 | manually (e.g. by passing `-v nats={...}` to the `bosh deploy` command). 282 | 283 | 284 | ## Security Groups 285 | 286 | By default, applications cannot to connect to IP addresses on the private network, 287 | preventing applications from connecting to the MySQL service. 288 | To enable access to the service, create a new security group for the IP 289 | configured in your manifest for the property `jobs.cf-mysql-broker.mysql_node.host`. 290 | 291 | Note: This is not required for CF running on bosh-lite, as these application 292 | groups are pre-configured. 293 | 294 | 1. Add the rule to a file in the following json format; multiple rules are supported. 295 | 296 | ``` 297 | [ 298 | { 299 | "destination": "10.10.163.1-10.10.163.255", 300 | "protocol": "all" 301 | }, 302 | { 303 | "destination": "10.10.164.1-10.10.164.255", 304 | "protocol": "all" 305 | }, 306 | { 307 | "destination": "10.10.165.1-10.10.165.255", 308 | "protocol": "all" 309 | } 310 | ] 311 | ``` 312 | 313 | - Create a security group from the rule file. 314 | 315 | ```shell 316 | $ cf create-security-group p-mysql rule.json 317 | ``` 318 | 319 | - Enable the rule for all apps 320 | 321 | ```shell 322 | $ cf bind-running-security-group p-mysql 323 | ``` 324 | 325 | Security group changes are only applied to new application containers; 326 | existing apps must be restarted. 327 | 328 | 329 | ## Registering the Service Broker 330 | 331 | After registering the service broker, the MySQL service will be visible in the Services Marketplace; using the [CLI](https://github.com/cloudfoundry/cli), run `cf marketplace`. 332 | 333 | ### BOSH errand 334 | 335 | ``` 336 | $ bosh2 -e YOUR_ENV -d cf-mysql run-errand broker-registrar 337 | ``` 338 | 339 | ### Manually 340 | 341 | 1. First register the broker using the `cf` CLI. You must be logged in as an admin. 342 | 343 | ``` 344 | $ cf create-service-broker p-mysql BROKER_USERNAME BROKER_PASSWORD URL 345 | ``` 346 | 347 | `BROKER_USERNAME` and `BROKER_PASSWORD` are the credentials Cloud Foundry will use to authenticate when making API calls to the service broker. Use the values for manifest properties `jobs.cf-mysql-broker.properties.auth_username` and `jobs.cf-mysql-broker.properties.auth_password`. 348 | 349 | `URL` specifies where the Cloud Controller will access the MySQL broker. Use the value of the manifest property `jobs.cf-mysql-broker.properties.external_host`. By default, this value is set to `p-mysql.` (in spiff: `"p-mysql." .properties.domain`). 350 | 351 | For more information, see [Managing Service Brokers](http://docs.cloudfoundry.org/services/managing-service-brokers.html). 352 | 353 | 2. Then [make the service plan public](http://docs.cloudfoundry.org/services/managing-service-brokers.html#make-plans-public). 354 | 355 | 356 | 357 | ## Smoke Tests 358 | 359 | The smoke tests are useful for verifying a deployment. 360 | The MySQL Release contains an "smoke-tests" job which is deployed as a BOSH errand. 361 | 362 | ### Running Smoke Tests via BOSH errand 363 | 364 | Run the smoke tests via bosh errand as follows: 365 | 366 | ``` 367 | $ bosh2 -e YOUR_ENV -d cf-mysql run-errand smoke-tests 368 | ``` 369 | 370 | 371 | ## De-registering the Service Broker 372 | 373 | The following commands are destructive and are intended to be run in conjuction with deleting your BOSH deployment. 374 | ``` 375 | $ bosh2 -e YOUR_ENV -d cf-mysql run-errand deregister-and-purge-instances 376 | ``` 377 | 378 | ### Manually 379 | 380 | Run the following: 381 | 382 | ``` 383 | $ cf purge-service-offering p-mysql 384 | $ cf delete-service-broker p-mysql 385 | ``` 386 | 387 | -------------------------------------------------------------------------------- /bosh-lite/cloud-config.yml: -------------------------------------------------------------------------------- 1 | azs: 2 | - name: z1 3 | - name: z2 4 | - name: z3 5 | vm_types: 6 | - name: default 7 | cloud_properties: 8 | ephemeral_disk: 9 | size: 1024 10 | type: gp2 11 | - name: micro 12 | cloud_properties: 13 | ephemeral_disk: 14 | size: 1024 15 | type: gp2 16 | compilation: 17 | workers: 4 18 | network: default 19 | az: z1 20 | reuse_compilation_vms: true 21 | vm_type: default 22 | networks: 23 | - name: default 24 | subnets: 25 | - az: z1 26 | range: 10.244.7.0/24 27 | gateway: 10.244.7.1 28 | cloud_properties: 29 | name: random 30 | - az: z2 31 | range: 10.244.8.0/24 32 | gateway: 10.244.8.1 33 | cloud_properties: 34 | name: random 35 | - az: z3 36 | range: 10.244.9.0/24 37 | gateway: 10.244.9.1 38 | cloud_properties: 39 | name: random 40 | vm_extensions: 41 | - name: mysql-proxy-lb 42 | cloud_properties: 43 | ports: 44 | - host: 3306 45 | -------------------------------------------------------------------------------- /bosh-lite/default-vars.yml: -------------------------------------------------------------------------------- 1 | --- 2 | cf_mysql_external_host: p-mysql.bosh-lite.com 3 | cf_mysql_host: bosh-lite.com 4 | cf_admin_password: REPLACE_WITH_CF_ADMIN_PASSWORD 5 | cf_api_url: https://api.bosh-lite.com 6 | cf_skip_ssl_validation: true 7 | proxy_vm_extension: mysql-proxy-lb 8 | -------------------------------------------------------------------------------- /cf-mysql-deployment.yml: -------------------------------------------------------------------------------- 1 | name: cf-mysql 2 | 3 | addons: 4 | - name: bpm 5 | jobs: 6 | - name: bpm 7 | release: bpm 8 | 9 | update: 10 | canaries: 1 11 | canary_watch_time: 10000-600000 12 | update_watch_time: 10000-600000 13 | max_in_flight: 1 14 | serial: true 15 | 16 | instance_groups: 17 | - name: mysql 18 | instances: 2 19 | azs: [z1, z2] 20 | networks: [{name: default}] 21 | vm_type: default 22 | stemcell: default 23 | persistent_disk: 10000 24 | jobs: 25 | - name: mysql 26 | release: cf-mysql 27 | properties: 28 | cf_mysql: 29 | mysql: 30 | admin_password: ((cf_mysql_mysql_admin_password)) 31 | cluster_health: 32 | password: ((cf_mysql_mysql_cluster_health_password)) 33 | galera_healthcheck: 34 | endpoint_password: ((cf_mysql_mysql_galera_healthcheck_endpoint_password)) 35 | db_password: ((cf_mysql_mysql_galera_healthcheck_db_password)) 36 | - name: smoke-tests-user 37 | release: cf-mysql 38 | properties: 39 | cf_mysql: 40 | smoke_tests: 41 | db_password: ((cf_mysql_smoke_tests_db_password)) 42 | 43 | - name: arbitrator 44 | instances: 1 45 | azs: [z3] 46 | networks: [{name: default}] 47 | vm_type: default 48 | stemcell: default 49 | jobs: 50 | - release: cf-mysql 51 | name: arbitrator 52 | properties: 53 | cf_mysql: 54 | mysql: 55 | admin_password: ((cf_mysql_mysql_admin_password)) 56 | galera_healthcheck: 57 | endpoint_password: ((cf_mysql_mysql_galera_healthcheck_endpoint_password)) 58 | 59 | - name: proxy 60 | instances: 2 61 | azs: [z1, z2] 62 | networks: [{name: default}] 63 | vm_type: default 64 | stemcell: default 65 | jobs: 66 | - name: proxy 67 | release: cf-mysql 68 | properties: 69 | cf_mysql: 70 | proxy: 71 | api_password: ((cf_mysql_proxy_api_password)) 72 | provides: 73 | mysql-database: 74 | as: mysql-database 75 | shared: true 76 | 77 | - name: bootstrap-vm 78 | instances: 1 79 | lifecycle: errand 80 | azs: [z1] 81 | networks: [{name: default}] 82 | vm_type: default 83 | stemcell: default 84 | jobs: 85 | - {release: cf-mysql, name: bootstrap} 86 | 87 | - name: rejoin-unsafe-vm 88 | instances: 1 89 | lifecycle: errand 90 | azs: [z1] 91 | networks: [{name: default}] 92 | vm_type: default 93 | stemcell: default 94 | jobs: 95 | - {release: cf-mysql, name: rejoin-unsafe} 96 | 97 | - name: verify-cluster-schemas-vm 98 | instances: 1 99 | lifecycle: errand 100 | azs: [z1] 101 | networks: [{name: default}] 102 | vm_type: default 103 | stemcell: default 104 | jobs: 105 | - name: verify-cluster-schemas 106 | release: cf-mysql 107 | properties: 108 | cf_mysql: 109 | mysql: 110 | admin_password: ((cf_mysql_mysql_admin_password)) 111 | galera_healthcheck: 112 | endpoint_password: ((cf_mysql_mysql_galera_healthcheck_endpoint_password)) 113 | 114 | - name: smoke-tests-vm 115 | instances: 1 116 | lifecycle: errand 117 | azs: [z1] 118 | networks: [{name: default}] 119 | vm_type: default 120 | stemcell: default 121 | jobs: 122 | - name: smoke-tests 123 | release: cf-mysql 124 | properties: 125 | cf_mysql: 126 | mysql: 127 | admin_password: ((cf_mysql_mysql_admin_password)) 128 | proxy: 129 | api_password: ((cf_mysql_proxy_api_password)) 130 | smoke_tests: 131 | db_password: ((cf_mysql_smoke_tests_db_password)) 132 | standalone_tests_only: true 133 | 134 | variables: 135 | - name: cf_mysql_mysql_admin_password 136 | type: password 137 | - name: cf_mysql_mysql_cluster_health_password 138 | type: password 139 | - name: cf_mysql_mysql_galera_healthcheck_db_password 140 | type: password 141 | - name: cf_mysql_mysql_galera_healthcheck_endpoint_password 142 | type: password 143 | - name: cf_mysql_proxy_api_password 144 | type: password 145 | - name: cf_mysql_smoke_tests_db_password 146 | type: password 147 | 148 | releases: 149 | - name: cf-mysql 150 | url: https://bosh.io/d/github.com/cloudfoundry/cf-mysql-release?v=36.19.0 151 | version: 36.19.0 152 | sha1: 393a018015fdcb48da40259b6a39b8e30fde9d0c 153 | - name: bpm 154 | url: "" 155 | version: latest 156 | sha1: "" 157 | stemcells: 158 | - alias: default 159 | os: ubuntu-trusty 160 | version: "3586.79" 161 | -------------------------------------------------------------------------------- /docs/using-cf-mysql.md: -------------------------------------------------------------------------------- 1 | # Application Developer's Guide to Using cf-mysql 2 | 3 | ## Connecting to cf-mysql 4 | 5 | ### Binding an App 6 | 7 | You can connect apps that are deployed to Cloud Foundry, via `cf push` using the standard instructions on [Delivering Service Credentials to an Application](https://docs.cloudfoundry.org/devguide/services/application-binding.html). 8 | 9 | cf-mysql does not offer any arbitrary parameters. 10 | 11 | ### Service Keys 12 | 13 | To connect to cf-mysql from an app which has not been deployed to Cloud Foundry, you can follow the instructions for [creating a service key](https://docs.cloudfoundry.org/devguide/services/service-keys.html). 14 | 15 | ### Encryption 16 | 17 | #### Applications Running on Cloud Foundry 18 | 19 | Most applications, save Java and Spring (see below), can be modified to discover the information necessary to connect to cf-mysql using TLS. When inspecting `VCAP_SERVICES` for username and password, if the additional property, `ca_certificate` is available, your application can connect to cf-mysql using TLS. 20 | 21 | Here's a Node.js example: 22 | 23 | ```node 24 | ca_cert = vcap_services["p-mysql"][0]["credentials"]["ca_certificate"] ; 25 | dbClient = mysql.createConnection( { 26 | host : host, 27 | user : user, 28 | password : password, 29 | port : port, 30 | database : database, 31 | ssl : { 32 | ca : ca_cert 33 | }, 34 | } ) ; 35 | ``` 36 | Some languages automatically check the operating system's [trust store](https://docs.cloudfoundry.org/devguide/deploy-apps/trusted-system-certificates.html). In those cases, it is not necessary to parse `VCAP_SERVICES` for the CA certificate. 37 | 38 | #### Java and Spring Applications 39 | 40 | To enable apps using the [Java buildpack](https://docs.cloudfoundry.org/buildpacks/java/), you'll need to delete the existing binding and create a new one. This will update the `jdbcUrl` to specify an encrypted connection. 41 | 42 | **Note:** Should your deployment of cf-mysql turn off encryption in the future, you'll need to **re-bind** all Java applications that use cf-mysql. That will remove the encryption requirement, allowing apps to connect to an instance that does not offer encryption. 43 | 44 | #### Service Keys 45 | 46 | When using a service key to establish a connection using TLS (aka SSL) you will need the `ca_certificate` from the service key output. See the [service key documentation](https://docs.cloudfoundry.org/devguide/services/service-keys.html#detail) to view the service key JSON. 47 | 48 | Save the CA certificate to a file in PEM format. You'll need to replace the "\n" with newlines. 49 | 50 | To test, you can use any MySQL client. Connect to the hostname given in the service key output with the given credentials. When using the `mysql` CLI, also specify `--ssl-verify-server-cert --ssl-ca=PATH_TO_CA_CERTIFICATE`. 51 | -------------------------------------------------------------------------------- /githooks/pre-push: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | branch=$(git rev-parse --abbrev-ref HEAD) 4 | 5 | if [ "${branch}" == "master" ] 6 | then 7 | echo "Refusing to commit to 'master'. Please commit to 'develop' or other branches" 8 | exit 1 9 | fi 10 | -------------------------------------------------------------------------------- /operations/README.md: -------------------------------------------------------------------------------- 1 | # Operations 2 | 3 | This directory contains a list of commonly-used, tested, operations files. 4 | 5 | Unless otherwise stated, they can be combined in any permutation and in any order. 6 | 7 | ### Registering the proxy route 8 | 9 | [This operations file](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/register-proxy-route.yml) 10 | registers routes with the Cloud Foundry router which point to the dashboard pages hosted by the proxies deployed as part of `cf-mysql-release`. 11 | 12 | 13 | ### Enabling the Service Broker 14 | 15 | To enable integration of the MySQL database with Cloud Foundry (as a Cloud Foundry service), you should include the 16 | [add a broker](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/add-broker.yml) 17 | operations file, as well as the [register the proxy route](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/register-proxy-route.yml) 18 | operations file. 19 | 20 | 21 | ### Disabling cross deployment links 22 | 23 | Used when the dependent deployments (i.e. Cloud Foundry) do not expose properties 24 | via cross-deployment links. 25 | 26 | For example, many configurations of 27 | [cf-release](https://github.com/cloudfoundry/cf-release) 28 | (including the 29 | [provided spiff manifest generation](https://github.com/cloudfoundry/cf-release/blob/master/scripts/generate_deployment_manifest)) 30 | do not support cross-deployment links without manual modifications to the manifest, 31 | whereas deploying Cloud Foundry via 32 | [cf-deployment](https://github.com/cloudfoundry/cf-deployment) 33 | exposes properties like NATS config by default. 34 | 35 | Using this operations file will require you to provide your own values for these 36 | properties which would otherwise be provided via links, e.g. NATS. 37 | 38 | Example usage: 39 | 40 | ``` 41 | -o disable-smoke-tests-cross-deployment-links.yml \ 42 | -o disable-broker-route-registrar-cross-deployment-links.yml \ 43 | -o disable-proxy-route-registrar-cross-deployment-links.yml \ 44 | 45 | -v nats="{password: some-nats-password, user: nats, port: 4222, machines: [10.0.31.191]}" \ 46 | -v admin_username=admin \ 47 | -v admin_password=password \ 48 | -v api_url=api.mycf.com \ 49 | -v app_domains=[mycf.com] \ 50 | -v skip_ssl_validation=true \ 51 | ``` 52 | 53 | ### [configure-broker-load-balancer.yml](https://github.com/cloudfoundry/cf-mysql-deployment/tree/master/operations/configure-broker-load-balancer.yml) 54 | 55 | Provides a value for the property `cf_mysql.host` property, which is host the 56 | broker provides to applications via service instance bindings. 57 | 58 | Typically this is a FQDN pointing to a load balancer or some other mechanism to 59 | achieve HA (e.g. DNS, floating virtual IPs etc). 60 | 61 | Example usage: 62 | 63 | ``` 64 | -o configure-broker-load-balancer.yml \ 65 | 66 | -v cf_mysql_host=my-load-balancer-url 67 | ``` 68 | -------------------------------------------------------------------------------- /operations/add-broker.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /releases/name=routing? 4 | value: 5 | name: routing 6 | version: "0.180.0" 7 | url: https://bosh.io/d/github.com/cloudfoundry-incubator/cf-routing-release?v=0.180.0 8 | sha1: 990c2c319e6063573eec18dbeb7c3631a382db7d 9 | - type: replace 10 | path: /releases/name=bpm? 11 | value: 12 | name: bpm 13 | version: "0.9.0" 14 | url: https://bosh.io/d/github.com/cloudfoundry-incubator/bpm-release?v=0.9.0 15 | sha1: 0cb3242063c95271c95b62de3a6d07072aff0b29 16 | 17 | - type: replace 18 | path: /instance_groups/- 19 | value: 20 | name: broker 21 | instances: 2 22 | azs: [z1,z2,z3] 23 | networks: [{name: default}] 24 | vm_type: default 25 | stemcell: default 26 | jobs: 27 | - name: cf-mysql-broker 28 | release: cf-mysql 29 | properties: 30 | cf: 31 | api_url: ((cf_api_url)) 32 | skip_ssl_validation: ((cf_skip_ssl_validation)) 33 | cf_mysql: 34 | broker: 35 | auth_password: ((cf_mysql_broker_auth_password)) 36 | cookie_secret: ((cf_mysql_broker_cookie_secret)) 37 | db_password: ((cf_mysql_broker_db_password)) 38 | quota_enforcer: 39 | password: ((cf_mysql_broker_quota_enforcer_password)) 40 | services: &broker_services 41 | - name: p-mysql 42 | id: 44b26033-1f54-4087-b7bc-da9652c2a539 43 | dashboard_client: 44 | id: p-mysql 45 | secret: ((cf_mysql_p_mysql_dashboard_secret)) 46 | description: MySQL databases on demand 47 | metadata: 48 | displayName: MySQL for Pivotal Cloud Foundry 49 | documentationUrl: https://github.com/cloudfoundry/cf-mysql-release/blob/master/README.md 50 | imageUrl: data:image/png;base64,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 51 | longDescription: Creating a service instance provisions a database. Binding 52 | applications provisions unique credentials for each application to access 53 | the database. 54 | providerDisplayName: Pivotal Software 55 | supportUrl: https://support.pivotal.io 56 | plan_updateable: true 57 | plans: 58 | - description: Shared MySQL Server 59 | id: ab08f1bc-e6fc-4b56-a767-ee0fea6e3f20 60 | max_storage_mb: 10 61 | max_user_connections: 20 62 | name: 10mb 63 | - description: Shared MySQL Server 64 | id: 11d0aa36-dcec-4021-85f5-ea4d9a5c8342 65 | max_storage_mb: 20 66 | max_user_connections: 40 67 | name: 20mb 68 | tags: 69 | - mysql 70 | external_host: ((cf_mysql_external_host)) 71 | mysql: 72 | persistent_disk: 10000 73 | - name: route_registrar 74 | release: routing 75 | consumes: 76 | nats: {from: nats, deployment: cf} 77 | properties: 78 | route_registrar: 79 | routes: 80 | - name: cf-mysql-broker 81 | port: 8081 # must match the value of 'cf_mysql.broker.port' 82 | registration_interval: 10s 83 | uris: 84 | - ((cf_mysql_external_host)) 85 | health_check: 86 | name: script 87 | script_path: /var/vcap/jobs/cf-mysql-broker/bin/healthcheck.sh 88 | 89 | - type: replace 90 | path: /instance_groups/- 91 | value: 92 | name: broker-registrar-vm 93 | instances: 1 94 | lifecycle: errand 95 | azs: [z1] 96 | networks: [{name: default}] 97 | vm_type: default 98 | stemcell: default 99 | jobs: 100 | - name: broker-registrar 101 | release: cf-mysql 102 | properties: 103 | cf: 104 | admin_username: admin 105 | admin_password: ((cf_admin_password)) 106 | api_url: ((cf_api_url)) 107 | skip_ssl_validation: ((cf_skip_ssl_validation)) 108 | cf_mysql: 109 | broker: 110 | auth_password: ((cf_mysql_broker_auth_password)) 111 | services: *broker_services 112 | external_host: ((cf_mysql_external_host)) 113 | 114 | - type: replace 115 | path: /instance_groups/- 116 | value: 117 | name: deregister-and-purge-instances-vm 118 | instances: 1 119 | lifecycle: errand 120 | azs: [z1] 121 | networks: [{name: default}] 122 | vm_type: default 123 | stemcell: default 124 | jobs: 125 | - name: deregister-and-purge-instances 126 | release: cf-mysql 127 | properties: 128 | cf: 129 | admin_username: admin 130 | admin_password: ((cf_admin_password)) 131 | api_url: ((cf_api_url)) 132 | skip_ssl_validation: ((cf_skip_ssl_validation)) 133 | cf_mysql: 134 | broker: 135 | services: *broker_services 136 | 137 | - type: replace 138 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf?/skip_ssl_validation 139 | value: ((cf_skip_ssl_validation)) 140 | 141 | - type: replace 142 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf?/admin_username 143 | value: admin 144 | 145 | - type: replace 146 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf?/admin_password 147 | value: ((cf_admin_password)) 148 | 149 | - type: replace 150 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf?/api_url 151 | value: ((cf_api_url)) 152 | 153 | - type: replace 154 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf_mysql/smoke_tests/standalone_tests_only? 155 | value: false 156 | 157 | - type: replace 158 | path: /instance_groups/name=mysql/jobs/- 159 | value: 160 | name: cf-mysql-broker-user 161 | release: cf-mysql 162 | 163 | - type: remove 164 | path: /instance_groups/name=mysql/jobs/name=smoke-tests-user 165 | 166 | - type: remove 167 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf_mysql/smoke_tests/db_password 168 | 169 | - type: replace 170 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf_mysql/external_host? 171 | value: ((cf_mysql_external_host)) 172 | 173 | - type: replace 174 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf_mysql/smoke_tests/password? 175 | value: ((cf_mysql_smoke_tests_password)) 176 | 177 | - type: replace 178 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/consumes? 179 | value: 180 | cloud_controller: {from: cloud_controller, deployment: cf} 181 | 182 | - type: replace 183 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf_mysql/broker?/services 184 | value: *broker_services 185 | 186 | - type: replace 187 | path: /variables/- 188 | value: 189 | name: cf_mysql_broker_auth_password 190 | type: password 191 | 192 | - type: replace 193 | path: /variables/- 194 | value: 195 | name: cf_mysql_broker_cookie_secret 196 | type: password 197 | 198 | - type: replace 199 | path: /variables/- 200 | value: 201 | name: cf_mysql_broker_db_password 202 | type: password 203 | 204 | - type: replace 205 | path: /variables/- 206 | value: 207 | name: cf_mysql_broker_quota_enforcer_password 208 | type: password 209 | 210 | - type: replace 211 | path: /variables/- 212 | value: 213 | name: cf_mysql_p_mysql_dashboard_secret 214 | type: password 215 | 216 | - type: replace 217 | path: /variables/- 218 | value: 219 | name: cf_mysql_smoke_tests_password 220 | type: password 221 | -------------------------------------------------------------------------------- /operations/add-roadmin.yml: -------------------------------------------------------------------------------- 1 | - type: replace 2 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/roadmin_enabled? 3 | value: true 4 | 5 | - type: replace 6 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/roadmin_password? 7 | value: ((cf_mysql_mysql_roadmin_password)) 8 | 9 | - type: replace 10 | path: /variables/- 11 | value: 12 | name: cf_mysql_mysql_roadmin_password 13 | type: password 14 | -------------------------------------------------------------------------------- /operations/add-tls.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/tls?/ca_certificate 4 | value: ((cf_mysql_mysql_tls_server_certificate.ca)) 5 | 6 | - type: replace 7 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/tls?/server_certificate 8 | value: ((cf_mysql_mysql_tls_server_certificate.certificate)) 9 | 10 | - type: replace 11 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/tls?/server_key 12 | value: ((cf_mysql_mysql_tls_server_certificate.private_key)) 13 | 14 | - type: replace 15 | path: /variables?/- 16 | value: 17 | name: cf_mysql_mysql_tls_server_certificate 18 | type: certificate 19 | options: 20 | common_name: ((cf_mysql_host)) 21 | ca: trusted_cert_for_apps 22 | -------------------------------------------------------------------------------- /operations/add-xenial-default-stemcell.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /stemcells/alias=default 4 | value: 5 | alias: trusty 6 | os: ubuntu-trusty 7 | version: latest 8 | 9 | - type: replace 10 | path: /stemcells/- 11 | value: 12 | alias: default 13 | os: ubuntu-xenial 14 | version: latest 15 | -------------------------------------------------------------------------------- /operations/bosh-dns.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=proxy/jobs/name=proxy/properties/cf_mysql/proxy/shutdown_delay? 4 | value: 30 5 | -------------------------------------------------------------------------------- /operations/bosh-lite.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/innodb_buffer_pool_size? 4 | value: 128M 5 | -------------------------------------------------------------------------------- /operations/configure-broker-load-balancer.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=broker/jobs/name=cf-mysql-broker/properties/cf_mysql/host? 4 | value: ((cf_mysql_host)) 5 | -------------------------------------------------------------------------------- /operations/disable-broker-route-registrar-cross-deployment-links.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=broker/jobs/name=route_registrar?/consumes 4 | value: 5 | nats: nil 6 | 7 | - type: replace 8 | path: /instance_groups/name=broker/jobs/name=route_registrar?/properties/nats 9 | value: ((nats)) 10 | -------------------------------------------------------------------------------- /operations/disable-proxy-consul-cross-deployment-links.yml: -------------------------------------------------------------------------------- 1 | - type: replace 2 | path: /instance_groups/name=proxy/jobs/name=consul_agent/consumes? 3 | value: 4 | consul: nil 5 | consul_client: nil 6 | consul_common: nil 7 | consul_server: nil 8 | 9 | - type: replace 10 | path: /instance_groups/name=proxy/jobs/name=consul_agent/properties?/consul 11 | value: 12 | agent: 13 | datacenter: 14 | domain: cf.internal 15 | log_level: 16 | servers: 17 | lan: ((consul_agent_servers_lan)) 18 | agent_cert: ((consul_agent_cert)) 19 | agent_key: ((consul_agent_key)) 20 | ca_cert: ((consul_ca_cert)) 21 | encrypt_keys: ((consul_encrypt_keys)) 22 | server_cert: ((consul_server_cert)) 23 | server_key: ((consul_server_key)) 24 | -------------------------------------------------------------------------------- /operations/disable-proxy-route-registrar-cross-deployment-links.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=proxy/jobs/name=route_registrar?/consumes 4 | value: 5 | nats: nil 6 | 7 | - type: replace 8 | path: /instance_groups/name=proxy/jobs/name=route_registrar?/properties/nats 9 | value: ((nats)) 10 | -------------------------------------------------------------------------------- /operations/disable-smoke-tests-cross-deployment-links.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf?/app_domains 4 | value: ((app_domains)) 5 | 6 | - type: replace 7 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/consumes? 8 | value: 9 | cloud_controller: nil 10 | -------------------------------------------------------------------------------- /operations/enable-syslog.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /addons?/- 4 | value: 5 | name: syslog_forwarder 6 | jobs: 7 | - name: syslog_forwarder 8 | release: syslog 9 | properties: 10 | syslog: 11 | address: ((syslog_address)) 12 | port: ((syslog_port)) 13 | transport: ((syslog_transport)) 14 | forward_files: true 15 | 16 | - type: replace 17 | path: /releases/- 18 | value: 19 | name: syslog 20 | url: https://bosh.io/d/github.com/cloudfoundry/syslog-release?v=11 21 | version: '11' 22 | sha1: 332ac15609b220a3fdf5efad0e0aa069d8235788 23 | -------------------------------------------------------------------------------- /operations/latest-versions.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /releases/name=cf-mysql 4 | value: 5 | name: cf-mysql 6 | version: latest 7 | 8 | - type: replace 9 | path: /stemcells/alias=default 10 | value: 11 | alias: default 12 | os: ubuntu-trusty 13 | version: latest 14 | -------------------------------------------------------------------------------- /operations/no-arbitrator.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: remove 3 | path: /instance_groups/name=arbitrator 4 | 5 | - type: replace 6 | path: /instance_groups/name=mysql/instances 7 | value: 3 8 | 9 | - type: replace 10 | path: /instance_groups/name=mysql/azs/- 11 | value: z3 12 | -------------------------------------------------------------------------------- /operations/proxy-consul.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /releases/- 4 | value: 5 | name: consul 6 | version: latest 7 | 8 | - type: replace 9 | path: /instance_groups/name=proxy/jobs/- 10 | value: 11 | release: consul 12 | name: consul_agent 13 | consumes: 14 | consul_common: {from: consul_common_link, deployment: cf} 15 | consul_server: {from: consul_server_link, deployment: cf} 16 | consul_client: {from: consul_client_link, deployment: cf} 17 | 18 | - type: replace 19 | path: /instance_groups/name=proxy/jobs/name=proxy/properties/cf_mysql/proxy/consul_enabled? 20 | value: true 21 | - type: replace 22 | path: /instance_groups/name=proxy/jobs/name=proxy/properties/cf_mysql/proxy/consul_service_name? 23 | value: mysql 24 | -------------------------------------------------------------------------------- /operations/proxy-elb.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=proxy/vm_extensions?/- 4 | value: ((proxy_vm_extension)) 5 | 6 | - type: replace 7 | path: /instance_groups/name=smoke-tests-vm/jobs/name=smoke-tests/properties/cf_mysql/host? 8 | value: ((cf_mysql_host)) 9 | -------------------------------------------------------------------------------- /operations/register-proxy-route.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /releases/name=routing? 4 | value: 5 | name: routing 6 | version: "0.180.0" 7 | url: https://bosh.io/d/github.com/cloudfoundry-incubator/cf-routing-release?v=0.180.0 8 | sha1: 990c2c319e6063573eec18dbeb7c3631a382db7d 9 | 10 | - type: replace 11 | path: /releases/name=bpm? 12 | value: 13 | name: "bpm" 14 | version: "0.12.2" 15 | url: "https://bosh.io/d/github.com/cloudfoundry-incubator/bpm-release?v=0.12.2" 16 | sha1: "f2edbf3d1417a253205338c9941ca989cd2f8331" 17 | 18 | - type: replace 19 | path: /instance_groups/name=proxy/jobs/- 20 | value: 21 | release: routing 22 | name: route_registrar 23 | consumes: 24 | nats: {from: nats, deployment: cf} 25 | properties: 26 | route_registrar: 27 | routes: 28 | - name: cf-mysql-proxy 29 | port: 8080 # must match the value of 'cf_mysql.proxy.api_port' 30 | registration_interval: 10s 31 | uris: 32 | - &proxy_base_uri proxy-((cf_mysql_external_host)) 33 | prepend_instance_index: true 34 | - name: cf-mysql-proxy-aggregator 35 | port: 8082 # must match the value of 'cf_mysql.proxy.api_aggregator_port' 36 | registration_interval: 10s 37 | uris: 38 | - *proxy_base_uri 39 | # The switchboard aggregator page assumes there is only a single route registered for the proxies 40 | 41 | # make sure to match what the route_registrar is registering above in cf-mysql-proxy route 42 | - type: replace 43 | path: /instance_groups/name=proxy/jobs/name=proxy/properties/cf_mysql/proxy/api_uri? 44 | value: *proxy_base_uri 45 | -------------------------------------------------------------------------------- /operations/syslog-tls.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /addons/name=syslog_forwarder/jobs/name=syslog_forwarder/properties/syslog/tls_enabled? 4 | value: true 5 | 6 | - type: replace 7 | path: /addons/name=syslog_forwarder/jobs/name=syslog_forwarder/properties/syslog/permitted_peer? 8 | value: ((syslog_permitted_peer)) 9 | -------------------------------------------------------------------------------- /operations/test/enable-remote-admin-access.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=mysql/jobs/name=mysql/properties/cf_mysql/mysql/remote_admin_access? 4 | value: true 5 | -------------------------------------------------------------------------------- /operations/test/minimal-mode.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /instance_groups/name=arbitrator/instances 4 | value: 0 5 | - type: replace 6 | path: /instance_groups/name=mysql/instances 7 | value: 1 8 | - type: replace 9 | path: /instance_groups/name=proxy/instances 10 | value: 1 11 | 12 | -------------------------------------------------------------------------------- /operations/xenial-stemcell.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - type: replace 3 | path: /stemcells/os=ubuntu-trusty 4 | value: 5 | alias: default 6 | os: ubuntu-xenial 7 | version: latest 8 | 9 | -------------------------------------------------------------------------------- /scripts/deploy-cf-mysql-to-bosh-lite: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eux 4 | 5 | my_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 6 | root_dir="$( cd "${my_dir}/.." && pwd )" 7 | 8 | export BOSH_ENVIRONMENT="${BOSH_ENVIRONMENT:-192.168.50.6}" 9 | export BOSH_DEPLOYMENT="${BOSH_DEPLOYMENT:-cf-mysql}" 10 | 11 | # Strip "api." prefix from the endpoint. 12 | root_endpoint=${CF_API_ENDPOINT#"api."} 13 | 14 | cf_mysql_host="${root_endpoint}" 15 | cf_mysql_external_host="p-mysql.${root_endpoint}" 16 | 17 | pushd "${root_dir}" > /dev/null 18 | bosh \ 19 | deploy \ 20 | "${root_dir}/cf-mysql-deployment.yml" \ 21 | -o "${root_dir}/operations/bosh-lite.yml" \ 22 | -o "${root_dir}/operations/xenial-stemcell.yml" \ 23 | -l "${root_dir}/bosh-lite/default-vars.yml" \ 24 | -v cf_mysql_external_host="${cf_mysql_external_host}" \ 25 | -v cf_mysql_host="${cf_mysql_host}" \ 26 | -v cf_api_url="https://${CF_API_ENDPOINT}" \ 27 | --no-redact \ 28 | "$@" 29 | popd > /dev/null 30 | -------------------------------------------------------------------------------- /scripts/deploy-cf-mysql-with-broker-to-bosh-lite: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | my_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 6 | root_dir="$( cd "${my_dir}/.." && pwd )" 7 | 8 | if [[ -z "${CF_API_ENDPOINT}" ]]; then 9 | echo "\$CF_API_ENDPOINT is not set. You probably forgot to target your environment." 10 | echo "These BOSH variables may need to be changed:" 11 | echo " cf_mysql_external_host, cf_mysql_host, cf_api_url" 12 | fi 13 | 14 | # Strip "api." prefix from the endpoint. 15 | root_endpoint=${CF_API_ENDPOINT#"api."} 16 | 17 | cf_mysql_host="${root_endpoint}" 18 | cf_mysql_external_host="p-mysql.${root_endpoint}" 19 | 20 | "${my_dir}/deploy-cf-mysql-to-bosh-lite" \ 21 | -o "${root_dir}/operations/add-broker.yml" \ 22 | -o "${root_dir}/operations/register-proxy-route.yml" \ 23 | -v cf_mysql_external_host="${cf_mysql_external_host}" \ 24 | -v cf_mysql_host="${cf_mysql_host}" \ 25 | -v cf_api_url="https://${CF_API_ENDPOINT}" \ 26 | "$@" 27 | --------------------------------------------------------------------------------