diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2357ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.deb +*.rpm +.build +.tox diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e06d208 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d58632 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# detach-db diff --git a/deployment_scripts/database-haproxy.pp b/deployment_scripts/database-haproxy.pp new file mode 100644 index 0000000..4a08504 --- /dev/null +++ b/deployment_scripts/database-haproxy.pp @@ -0,0 +1,21 @@ +notice('MODULAR: haproxy-database.pp') + +$is_primary_controller = hiera('primary_controller') +$custom_mysql_setup_class = hiera('custom_mysql_setup_class') +$mysqld_ipaddresses = hiera('mysqld_ipaddresses') +$mysqld_names = hiera('mysqld_names') +$database_vip = hiera('database_vip') + +Haproxy::Service { use_include => true } +Haproxy::Balancermember { use_include => true } + +if ($custom_mysql_setup_class in ['galera', 'percona', 'percona_packages']) { + class { 'openstack::ha::mysqld': + is_primary_controller => $is_primary_controller, + server_names => $mysqld_names, + ipaddresses => $mysqld_ipaddresses, + public_virtual_ip => $database_vip, + internal_virtual_ip => $database_vip, + } +} + diff --git a/deployment_scripts/database_hiera_override.pp b/deployment_scripts/database_hiera_override.pp new file mode 100644 index 0000000..406300c --- /dev/null +++ b/deployment_scripts/database_hiera_override.pp @@ -0,0 +1,116 @@ +notice('MODULAR: detach-database/database_hiera_override.pp') + +$detach_database_plugin = hiera('detach-database', undef) +$hiera_dir = '/etc/hiera/override' +$plugin_name = 'detach-database' +$plugin_yaml = "${plugin_name}.yaml" + +if $detach_database_plugin { + $network_metadata = hiera_hash('network_metadata') + if ! $network_metadata['vips']['database'] { + fail('Database VIP is not defined') + } + $yaml_additional_config = pick($detach_database_plugin['yaml_additional_config'], {}) + $settings_hash = parseyaml($yaml_additional_config) + $nodes_hash = hiera('nodes') + $management_vip = hiera('management_vip') + $database_vip = pick($settings_hash['remote_database'],$network_metadata['vips']['database']['ipaddr']) + + #Set database_nodes values + $database_roles = [ 'primary-standalone-database', 'standalone-database' ] + $database_nodes = get_nodes_hash_by_roles($network_metadata, $database_roles) + $database_address_map = get_node_to_ipaddr_map_by_network_role($database_nodes, 'mgmt/database') + $database_nodes_ips = values($database_address_map) + $database_nodes_names = keys($database_address_map) + + ################### + case hiera('role', 'none') { + 'primary-standalone-database': { + $primary_database = true + $primary_controller = true + } + /^primary/: { + $primary_database = false + $primary_controller = true + } + default: { + $primary_database = false + $primary_controller = false + } + } + + #TODO(mattymo): debug needing corosync_roles + case hiera('role', 'none') { + /database/: { + $corosync_roles = $database_roles + $deploy_vrouter = false + $mysql_enabled = true + $corosync_nodes = $database_nodes + } + /controller/: { + $mysql_enabled = false + } + default: { + } + } + ################### + $calculated_content = inline_template(' +primary_database: <%= @primary_database %> +database_vip: <%= @database_vip %> +<% if @database_nodes -%> +<% require "yaml" -%> +database_nodes: +<%= YAML.dump(@database_nodes).sub(/--- *$/,"") %> +<% end -%> +mysqld_ipaddresses: +<% if @database_nodes_ips -%> +<% +@database_nodes_ips.each do |databasenode| +%> - <%= databasenode %> +<% end -%> +<% end -%> +<% if @database_nodes_names -%> +mysqld_names: +<% +@database_nodes_names.each do |databasenode| +%> - <%= databasenode %> +<% end -%> +<% end -%> +mysql: + enabled: <%= @mysql_enabled %> +primary_controller: <%= @primary_controller %> +<% if @corosync_nodes -%> +<% require "yaml" -%> +corosync_nodes: +<%= YAML.dump(@corosync_nodes).sub(/--- *$/,"") %> +<% end -%> +<% if @corosync_roles -%> +corosync_roles: +<% +@corosync_roles.each do |crole| +%> - <%= crole %> +<% end -%> +<% end -%> +deploy_vrouter: <%= @deploy_vrouter %> +') + + ################### + file {'/etc/hiera/override': + ensure => directory, + } -> + file { "${hiera_dir}/${plugin_yaml}": + ensure => file, + content => "${detach_database_plugin['yaml_additional_config']}\n${calculated_content}\n", + } + + package {'ruby-deep-merge': + ensure => 'installed', + } + + file_line {"${plugin_name}_hiera_override": + path => '/etc/hiera.yaml', + line => " - override/${plugin_name}", + after => ' - override/module/%{calling_module}', + } + +} diff --git a/deployment_scripts/virtual_ip.pp b/deployment_scripts/virtual_ip.pp new file mode 100644 index 0000000..d3e7ee8 --- /dev/null +++ b/deployment_scripts/virtual_ip.pp @@ -0,0 +1,49 @@ +notice('MODULAR: detach-database/virtual_ip.pp') + +$internal_int = hiera('internal_int') +$public_int = hiera('public_int', undef) +$primary_controller_nodes = hiera('primary_controller_nodes', false) +$network_scheme = hiera('network_scheme', {}) + +#FIXME(mattymo): This netmask data is the same as mgmt net +if ( hiera('vip_management_cidr_netmask', false )){ + $vip_management_cidr_netmask = hiera('vip_management_cidr_netmask') +} else { + $vip_management_cidr_netmask = netmask_to_cidr($primary_controller_nodes[0]['internal_netmask']) +} + +$database_vip_data = { + namespace => 'haproxy', + nic => $internal_int, + base_veth => "${internal_int}-hapr", + ns_veth => "hapr-m", + ip => hiera('database_vip'), + cidr_netmask => $vip_management_cidr_netmask, + gateway => 'none', + gateway_metric => '0', + bridge => $network_scheme['roles']['management'], + other_networks => $vip_mgmt_other_nets, + with_ping => false, + ping_host_list => "", +} + +cluster::virtual_ip { 'database' : + vip => $database_vip_data, +} + +#Not needed (mattymo) +#$management_vips = ['database'] +#$vips = $management_vips +## Some topologies might need to keep the vips on the same node during +## deploymenet. This would only need to be changed by hand. +#$keep_vips_together = false +# +#if $keep_vips_together { +# cs_rsc_colocation { 'ha_vips': +# ensure => present, +# primitives => [prefix($vips, "vip__")], +# } +# Cluster::Virtual_ip[$vips] -> Cs_rsc_colocation['ha_vips'] +#} +# + diff --git a/deployment_tasks.yaml b/deployment_tasks.yaml new file mode 100644 index 0000000..1d8dd2f --- /dev/null +++ b/deployment_tasks.yaml @@ -0,0 +1,74 @@ +############################################## +# Deployment groups +- id: primary-standalone-database + type: group + role: [primary-standalone-database] + requires: [deploy_start] + required_for: [deploy_end, primary-controller, controller] + tasks: [fuel_pkgs, hiera, globals, tools, logging, netconfig, + hosts, firewall, deploy_start, cluster, database-virtual-ip, cluster-haproxy, + openstack-haproxy-stats, task-database] + parameters: + strategy: + type: one_by_one + +- id: standalone-database + type: group + role: [standalone-database] + requires: [deploy_start, primary-standalone-database, primary-controller, controller] + required_for: [deploy_end] + tasks: [fuel_pkgs, hiera, globals, tools, logging, netconfig, + hosts, firewall, deploy_start, cluster, database-virtual-ip, cluster-haproxy, + task-database] + parameters: + strategy: + type: parallel + +# Deployment tasks +- id: database-haproxy + type: puppet + groups: [primary-standalone-database, standalone-database] + required_for: [task-database, deploy_end] + requires: [deploy_start, database-virtual-ip, cluster-haproxy, + openstack-haproxy-stats] + parameters: + puppet_manifest: "database-haproxy.pp" + puppet_modules: "/etc/puppet/modules" + timeout: 3600 + +- id: database-virtual-ip + type: puppet + groups: [primary-standalone-database, standalone-database] + required_for: [deploy_end] + requires: [cluster] + parameters: + puppet_manifest: "virtual_ip.pp" + puppet_modules: "/etc/puppet/modules" + timeout: 3600 + +- id: task-database + type: puppet + role: [primary-standalone-database, standalone-database] + requires: [hosts, firewall] + requires: [database-haproxy, database-virtual-ip] + parameters: + puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/database/database.pp + puppet_modules: /etc/puppet/modules + timeout: 3600 + test_pre: + cmd: ruby /etc/puppet/modules/osnailyfacter/modular/database/database_pre.rb + test_post: + cmd: ruby /etc/puppet/modules/osnailyfacter/modular/database/database_post.rb + +- id: database-hiera-override + type: puppet + groups: [primary-controller, controller, primary-standalone-database, + standalone-database, cinder, cinder-vmware, compute, ceph-osd, + zabbix-server, primary-mongo, mongo] + requires: [globals] + required_for: [logging] + parameters: + puppet_manifest: "database_hiera_override.pp" + puppet_modules: "/etc/puppet/modules" + timeout: 120 + diff --git a/environment_config.yaml b/environment_config.yaml new file mode 100644 index 0000000..3864200 --- /dev/null +++ b/environment_config.yaml @@ -0,0 +1,15 @@ +attributes: + metadata: + label: "Database settings" + weight: 90 + # Gathering variables from user about our DCP + yaml_additional_config: + type: "textarea" + weight: 52 + value: | + #Uncomment to enable remote DB: + #remote_db: '10.20.99.1' + #remote_db_password: 'secret' + custom_mysql_setup_class: 'galera' + label: "Additional config" + description: "Just put here valid yaml" diff --git a/metadata.yaml b/metadata.yaml new file mode 100644 index 0000000..9f1264b --- /dev/null +++ b/metadata.yaml @@ -0,0 +1,39 @@ +# Plugin name +name: detach-database +# Human-readable name for your plugin +title: Separate DB from controller +# Plugin version +version: '1.1.0' +# Description +description: Creates separate Database role for deploying +# Required fuel version +fuel_version: ['7.0'] +# Specify license of your plugin +licenses: ['Apache License Version 2.0'] +# Specify author or company name +authors: ['Matthew Mosesohn','Mirantis'] +# A link to the plugin's page +homepage: 'https://github.com/stackforge/fuel-plugins' +# Specify a group which your plugin implements, possible options: +# network, storage, storage::cinder, storage::glance, hypervisor +groups: [network] + +# The plugin is compatible with releases in the list +releases: + - os: ubuntu + version: 2014.2.2-6.1 + mode: ['ha', 'multinode'] + deployment_scripts_path: deployment_scripts/ + repository_path: repositories/ubuntu + - os: ubuntu + version: 2014.2.2-7.0 + mode: ['ha', 'multinode'] + deployment_scripts_path: deployment_scripts/ + repository_path: repositories/ubuntu + - os: ubuntu + version: 2015.1.0-7.0 + mode: ['ha', 'multinode'] + deployment_scripts_path: deployment_scripts/ + repository_path: repositories/ubuntu +# Version of plugin package +package_version: '3.0.0' diff --git a/network_roles.yaml b/network_roles.yaml new file mode 100644 index 0000000..f938977 --- /dev/null +++ b/network_roles.yaml @@ -0,0 +1,19 @@ +# Unique network role name +- id: "detach_database_database_vip" + # Role mapping to network + default_mapping: "management" + properties: + # Should be true if network role requires subnet being set + subnet: true + # Should be true if network role requires gateway being set + gateway: false + # List of VIPs to be allocated + vip: + # Unique VIP name + - name: "database" + # Optional linux namespace for VIP + namespace: "haproxy" + alias: "database" + node_roles: + - "primary-standalone-database" + - "standalone-database" diff --git a/node_roles.yaml b/node_roles.yaml new file mode 100644 index 0000000..4cb84e2 --- /dev/null +++ b/node_roles.yaml @@ -0,0 +1,13 @@ +standalone-database: + name: "Database" + description: "Separated DB from controller" + has_primary: true # whether has primary role or not + public_ip_required: false # whether requires public net or not + weight: 100 # weight that will be used for ordering on fuel ui + conflicts: + - controller + - compute + limits: + min: 1 + update_required: + - standalone-database diff --git a/post_install.sh b/post_install.sh new file mode 100755 index 0000000..f3bcd73 --- /dev/null +++ b/post_install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +#Add custom scripts/workarounds here diff --git a/pre_build_hook b/pre_build_hook new file mode 100755 index 0000000..18cdd51 --- /dev/null +++ b/pre_build_hook @@ -0,0 +1,5 @@ +#!/bin/bash -x + +# Add here any the actions which are required before plugin build +# like packages building, packages downloading from mirrors and so on. +# The script should return 0 if there were no errors. diff --git a/repositories/centos/.gitkeep b/repositories/centos/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/repositories/ubuntu/.gitkeep b/repositories/ubuntu/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tasks.yaml b/tasks.yaml new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/tasks.yaml @@ -0,0 +1 @@ +[] diff --git a/uninstall.sh b/uninstall.sh new file mode 100755 index 0000000..f3bcd73 --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,2 @@ +#!/bin/bash +#Add custom scripts/workarounds here diff --git a/volumes.yaml b/volumes.yaml new file mode 100644 index 0000000..1646a08 --- /dev/null +++ b/volumes.yaml @@ -0,0 +1,6 @@ +# Set here new volumes for your role +volumes: [] +volumes_roles_mapping: + standalone-database: + # Default role mapping + - {allocate_size: "min", id: "os"}