diff --git a/README.md b/README.md index 3c77a24..16de556 100644 --- a/README.md +++ b/README.md @@ -1,334 +1,278 @@ -# MidoNet +# midonet #### Table of Contents -1. [Overview](#overview) -2. [Module Description](#module-description) -3. [Setup](#setup) - * [What MidoNet affects](#what-midonet-affects) - * [Beginning with MidoNet](#beginning-with-midonet) -4. [Usage](#usage) -5. [Reference](#reference) - * [Classes](#classes) - * [Types](#types) -6. [Limitations - OS compatibility, etc.](#limitations) -7. [Development - Guide for contributing to the module](#development) +1. [Overview - What is the midonet module?](#overview) +2. [Module Description - What does the module do?](#module-description) +3. [Setup - The basics of getting started with midonet](#setup) +4. [Implementation - An under-the-hood peek at what the module is doing](#usage) +5. [Limitations - OS compatibility, etc.](#limitations) +6. [Development - Guide for contributing to the module](#development) +6. [Contributors - Those with commits](#contributors) + ## Overview -Puppet module for install MidoNet components. +This Puppet module is maintained by [Midokura](http://www.midokura.com) +and is used to flexibly configure and manage all MidoNet components. + +To understand all MidoNet components and how they relate to each other, +check out the [MidoNet Reference Architecture](http://docs.midonet.org/docs/latest/reference-architecture/content/index.html). + ## Module Description -MidoNet is an Apache licensed production grade network virtualization software -for Infrastructure-as-a-Service (IaaS) clouds. This module provides the puppet -manifests to install all the components to deploy easily MidoNet in a -production environment. +The midonet module is a thorough attempt to make Puppet capable of managing +the entirety of MidoNet. This includes manifests to provision both open source +and enterprise components: -To know all the components and how they relate each other, check out [midonet -reference architecture -docs](http://docs.midonet.org/docs/latest/reference-architecture/content/index.html) +* MidoNet Cluster (formerly known as the MidoNet API) +* MidoNet CLI +* MidoNet Agent (also known as Midolman) +* MEM +* MEM Insights + +Uplink configuration for gateway nodes is also set up through the use of this +module. Currently both static and BGP uplinks are supported. + +This module is tested in combination with other modules needed to build and +leverage a MidoNet installation. ## Setup +**What the neutron module affects:** + +* [MidoNet](https://www.midonet.org/), which replaces the default plugin for +Neutron. + +### Prerequisites + +To use this module correctly, the following dependencies have to be met: + +* Have the gems `faraday` and `multipart-post` installed correctly (if using +Puppet 4.x use the `gem` executable from Puppet's main path) +* Have a working Zookeeper & Cassandra setup + +### Installing midonet + +```shell +puppet module install midonet-midonet +``` + +### Beginning with midonet + +A very basic installation of MidoNet on a controller node looks like the +following: + +```puppet +include ::midonet::repository + +class { '::midonet::cluster': + zookeeper_hosts => [ { 'ip' => '127.0.0.1' } ], + cassandra_servers => [ { 'ip' => '127.0.0.1' } ], + cassandra_rep_factor => '1', + keystone_admin_token => 'token', + keystone_host => '127.0.0.1', +} -> +class { '::midonet::cli': + username => 'admin', + password => 'safe_password', +} -> +class { '::midonet::agent': + controller_host => '127.0.0.1', + metadata_port => '8775', + shared_secret => 'shared_secret', + zookeeper_hosts => [ { 'ip' => '127.0.0.1' } ], +} +``` + +And on compute nodes: + +```puppet +include ::midonet::repository + +class { '::midonet::agent': + controller_host => '127.0.0.1', + metadata_port => '8775', + shared_secret => 'shared_secret', + zookeeper_hosts => [ { 'ip' => '127.0.0.1' } ], +} +``` + +Afterwards on every controller/compute, the `midonet_host_registry` custom +type should be used to register the node in MidoNet. + +On gateway nodes one should install Midolman (see above) and configure the +uplink: + +* Use the `::midonet::gateway::static` class to configure a fake static uplink +* Use the `midonet_gateway_bgp` custom type to configure the BGP uplink + +For examples on how to use all the classes see the manifests in the `roles` +folder at `midonet/puppet-midonet_openstack`. -### Beginning with MidoNet +## Implementation -To install the last stable release of MidoNet OSS, just include the -MidoNet class in your Puppet manifest: +### midonet - include midonet - -That will deploy a full MidoNet installation (repos, agent, MidoNet API and MidoNet CLI) -in the target host, which is quite useless deployment, since MidoNet is a network controller -ready to be scalable and distributed. However, for testing its features and demo purposes, it can -be useful. - -## Usage - -To use this module in a more advanced way, please check out the -[reference](#reference) section of this document. It is worth to highlight that -all the input variables have already a default input value, in a yaml document. -(We use R.I.Piennar [module data](https://www.devco.net/archives/2013/12/08/better-puppet-modules-using-hiera-data.php)) -To leverage this feature, please add the following in your `/etc/puppet/hiera.yaml` -(or the Hiera configuration file that you are using): - - --- - :backends: - - yaml - - module_data - :yaml: - :datadirs: - - /var/lib/hiera - :logger: console - -Any variable that you may use in your class declaration will override the -defaults in `/etc/puppet/modules/midonet/data`, so you will only need to define -the variables that you want to override. - -## Reference - -### Classes - -#### MidoNet Agent - -MidoNet Agent is the Openvswitch datapath controller and must run in all the Hypervisor hosts. - -The easiest way to run the class is: - - include midonet::midonet_agent - -This call assumes that there is a zookeeper instance and a cassandra instance -running in the target machine, and will configure the midonet-agent to -connect to them. - -This is a quite naive deployment, just for demo purposes. A more realistic one -would be: - - class {'midonet::midonet_agent': - cassandra_seeds => ['host1', 'host2', 'host3'], - zk_servers => [{'ip' => 'host1', 'port' => '2183'}, - {'ip' => 'host2', 'port' => '2181'}] - } - -Please note that Zookeeper port's value is not mandatory and it's already defaulted to 2181 - -You can alternatively use the Hiera's yaml style: - - midonet::midonet_agent::zk_servers: - - ip: 'host1' - port: 2183 - - ip: 'host2' - port: 2181 - midonet::midonet_agent::cassandra_seeds: - - 'host1' - - 'host2' - - 'host3' - -Note: midonet\_agent class already makes a call to midonet\_agent::install. -This class allows to choose whether you want it to install and manage Java, or -use an existing installations instead. - -For this purpose a param has been added and its value has been defaulted to -'true'. Should you want to manage the Java installation from another puppet -module and avoid duplicated class declaration, change the value to 'false': - - class { 'midonet::midonet_agent::install': - install_java => false - } - -You can alternatively use the Hiera's yaml style: - - midonet::midonet_agent::install::install_java: false - -#### MidoNet API - -MidoNet API is the REST service where third-party software can connect to -control the virtual network. A single instance of it can be enough. - -The easiest way to run this class is: - - include midonet::midonet_api - -This call assumes that there is a zookeeper running in the target host and the -module will spawn a midonet\_api without keystone authentication. - -This is a quite naive deployment, just for demo purposes. A more realistic one -would be: - - class {'midonet::midonet_api': - zk_servers => [{'ip' => 'host1', 'port' => '2183'}, - {'ip' => 'host2', 'port' => '2181'}], - keystone_auth => true, - vtep => true, - api_ip => '92.234.12.4', - keystone_host => '92.234.12.9', - keystone_port => '35357', # Note: (35357 is already the default) - keystone_admin_token => 'arrakis', - keystone_tenant_name => 'other-than-services' # Note: ('services' by default) - } - -You can alternatively use the Hiera's yaml style: - - midonet::midonet_api::zk_servers: - - ip: 'host1' - port: 2183 - - ip: 'host2' - port: 2181 - midonet::midonet_api::vtep: true - midonet::midonet_api::keystone_auth: true - midonet::midonet_api::api_ip: '92.234.12.4' - midonet::midonet_api::keystone_host: '92.234.12.9' - midonet::midonet_api::keystone_port: 35357 - midonet::midonet_api::keystone_admin_token: 'arrakis' - midonet::midonet_api::keystone_tenant_name: 'other-than-services' - -Please note that Zookeeper port is not mandatory and defaulted to 2181. - -Note: midonet\_api class already makes a call to midonet\_api::install. This -class allows you to choose whether you want it to install and manage Tomcat and -Java, or use existing installations of both instead. - -For this purpose 2 parameters have been added and their values have been -defaulted to 'true'. Should you want to manage Tomcat and Java installation -from another puppet module and avoid duplicated class declaration, change the -values to 'false': - - class { 'midonet::midonet_api::install': - install_java => false, - manage_app_server => false - } - -You can alternatively use the Hiera's yaml style: - - midonet::midonet_api::install::install_java: false - midonet::midonet_api::install::manage_app_server: false - -#### MidoNet CLI - -Install the MidoNetCLI this way: - - include midonet::midonet_cli - -Module does not configure the ~/.midonetrc file that `python-midonetclient` -needs to run. Please, check out how to configure the MidoNet client -[here](https://docs.midonet.org/docs/v2015.06/en/quick-start-guide/rhel-7_kilo-rdo/content/_midonet_cli_installation.html) - -#### Neutron Plugin - -Install and configure MidoNet Neutron Plugin. Please note that manifest does -install Neutron (because it is a requirement of 'python-neutron-plugin-midonet' -package) but it does not configure it nor run it. It just configure the specific -MidoNet plugin files. It is supposed to be deployed along any existing puppet -module that configures Neutron, such as [puppetlabs/neutron](https://forge.puppetlabs.com/puppetlabs/neutron/4.1.0) - -The easiest way to run this class is: - - include midonet::neutron_plugin - -Although it is quite useless: it assumes that there is a Neutron server already -configured and a MidoNet API running at localhost with Mock authentication. - -A more advanced call would be: - - class {'midonet::neutron_plugin': - midonet_api_ip => '23.123.5.32', - username => 'neutron', - password => '32kjaxT0k3na', - project_id => 'service' - } - -You can alternatively use the Hiera's yaml style: - - midonet::neutron_plugin::midonet_api_ip: '23.213.5.32' - midonet::neutron_plugin::username: 'neutron' - midonet::neutron_plugin::password: '32.kjaxT0k3na' - midonet::neutron_plugin::midonet_api_ip: 'service' +midonet is a combination of Puppet manifest and ruby code to deliver +configuration and extra functionality through *types* and *providers*. ### Types -#### MidoNet Host Registry ### +#### midonet_gateway_bgp -MidoNet defines Tunnel Zones as groups of hosts capable to send packages to -each other using networking tunnels from which we can create Virtual Networks -on the overlay. +The `midonet_gateway_bgp` provider allows to configure a BGP uplink in the +gateway node. -Each host that runs [#MidoNet Agent] should be part of at least one Tunnel Zone -to send packets in the overlay to the rest of hosts of the Tunnel Zone. The -type `midonet_host_registry` allows you to register the host. - -A [#MidoNet API] should already been deployed before and the [#MidoNet Agent] -should be running in the host we are registering. - -This is the way to use it: - - midonet_host_registry {$::fqdn: - $ensure => present, - $midonet_api_url => 'http://controller:8080', - $username => 'admin', - $password => 'admin', - $tenant_name => 'admin', - $underlay_ip_address => '123.23.43.2' - $tunnelzone_name => 'tzone0', - $tunnelzone_type => 'gre' +```puppet +midonet_gateway_bgp { 'edge-router': + ensure => present, + bgp_local_as_number => '65520', + bgp_advertised_networks => [ '200.200.0.0/24' ], + bgp_neighbors => [ + { + 'ip_address' => '192.168.1.6', + 'remote_asn' => '65506', + 'remote_net' => '192.168.1.0/24' } + ], + midonet_api_url => 'http://127.0.0.1:8181', + username => 'admin', + password => 'safe_password', + tenant_name => 'admin', +} +``` -Notes: +##### bgp_local_as_number - * **midonet\_api\_url**, **username**, **password**, **tenant\_\name**: - Credentials to authenticate to Keystone through the MidoNet API service. - **tenant\_name** is defaulted to **admin** and is not mandatory. - * **underlay\_ip\_address**: Physical interface from where the packets will be - tunneled. - * **tunnelzone\_name**: Name of the Tunnel Zone. If the Tunnel Zone is does - not exist, the provider will create it. Defaulted to *tzone0*, so is not - mandatory to use this attribute unless you care too much about names or you - want more than one Tunnel Zone. - * **tunnelzone\_type**: Type of the tunnel. You can choose between *gre* and - *vxlan*. Defaulted to 'gre'. +The local AS number that this gateway will use. - More info at MidoNet - [docs|http://docs.midonet.org/docs/latest/quick-start-guide/ubuntu-1404_kilo/content/_midonet_host_registration.html] +##### bgp_advertised_networks -#### MidoNet Gateway #### +An array listing all the floating IP networks that will be advertised. -This capability allows a Host that runs MidoNet to be declared as the gateway -of the installation and provide the necessary steps to put the packages from -the underlay to the overlay and viceversa. MidoNet needs to bind a Host -interface to *MidoNet Provider Router*, which is the router on top of the -Virtual Infrastructure. +##### bgp_neighbors -Then, MidoNet starts BGP sessions to advertise the routes that manages and be -accessible from the Internet. +An array of BGP peers. Each on the elements needs to have the following +attributes: -This is the way to use it: +* `ip_address`: IP address of the BGP peer +* `remote_asn`: Remote AS number +* `remote_net`: Network on which the BGP peer is - midonet_gateway {$::fqdn: - ensure => present, - midonet_api_url => 'http://controller:8080', - username => 'admin', - password => 'admin', - tenant_name => 'admin', - interface => 'eth1', - local_as => '64512', - bgp_port => { 'port_address' => '198.51.100.2', 'net_prefix' => '198.51.100.0', 'net_length' => '30'}, - remote_peers => [ { 'as' => '64513', 'ip' => '198.51.100.1' }, - { 'as' => '64513', 'ip' => '203.0.113.1' } ], - advertise_net => [ { 'net_prefix' => '192.0.2.0', 'net_length' => '24' } ] - } +##### midonet_api_url -More info at MidoNet -[docs|http://docs.midonet.org/docs/latest/quick-start-guide/ubuntu-1404_kilo/content/bgp_uplink_configuration.html] +URL of the MidoNet API in the format `http://<HOST>:<PORT>`. - * **midonet\_api\_url**, **username**, **password**, **tenant\_\name**: - Credentials to authenticate to Keystone through the MidoNet API service. - **tenant\_name** is defaulted to **admin** and is not mandatory. - * **interface**: Host Interface where the gateway port of the *MidoNet - Provider Router* will be binded. - * **local_as**: Local Autonomous System of MidoNet deployment. - * **bgp_port**: Information about the port that will be created on *MidoNet - Provider Router* and will serve as the gateway of the virtual - infrastructure. - * **remote_peers**: List of uplink peers to establish BGP connections to. - * **advertise_net**: List of Network that will be advertised on from MidoNet - on the BGP sessions. +##### username +Username for the `admin` user. Defaults to `admin`. + +##### password + +Password for this user. Defaults to `admin`. + +##### tenant_name + +Tenant name on which we want to apply the changes. Defaults to `admin`. + + +#### midonet_host_registry + +The `midonet_host_registry` registers a MidoNet node through the MidoNet API. It +is necessary to use this type on every node that runs Midolman. + +```puppet +midonet_host_registry { 'myhost': + ensure => present, + midonet_api_url => 'http://127.0.0.1:8181', + tunnelzone_name => 'tzone0' + tunnelzone_type => 'gre', + username => 'admin', + password => 'admin', + tenant_name => 'admin', + underlay_ip_address => $::ipaddress, +} +``` + +##### midonet_api_url + +URL for the MidoNet API in the form of `http://<HOST>:<PORT>`. + +##### tunnelzone_name + +Name of the tunnel zone where the host will be registered. Defaults to `tzone0`. + +##### tunnelzone_type + +The type of tunnel zone. Can be set to `gre` or `vxlan`. Defaults to `gre`. + +##### username + +Username of the `admin` user in Keystone. Defaults to `admin`. + +##### password + +Password of the `admin` user in Keystone. Defaults to `admin`. + +##### tenant_name + +Tenant name of the `admin` user. Defaults to `admin`. + +##### underlay_ip_address + +IP address that will be used to as the underlay layer to create the tunnels. +It will take the fact `$::ipaddress` by default. + + +#### midonet_client_conf + +This type is used to manage the configuration at `/root/.midonetrc`. + +```puppet +midonet_client_conf { + 'cli/username': value => 'admin'; +} +``` + +This would set the `username` setting inside the `cli` section to `admin`. ## Limitations -This module supports: +The following platforms are supported: - * Ubuntu 14.04 - * CentOS 6.6 - * CentOS 7 +* Ubuntu 14.04 (Trusty) +* Ubuntu 16.04 (Xenial) +* CentOS 7 + +The module has been tested in both Puppet versions `3.x` and `4.x`. + +Please note that if there is a dedicated analytics node provisioned with +`::midonet::analytics` you will need to place a virtualhost file manually +on the controller for the midonet manager to be able to reach the +analytics endpoints (using `ProxyPass` is enough). + + +## Beaker-Rspec + +This module has beaker-rspec tests + +To run: + +```shell +bundle install +bundle exec rspec spec/acceptance +``` -This module has been tested in Puppet 3.7.3 version, but we believe that it -should work without problems in any Puppet 3.x version. ## Development -We happily will accept patches and new ideas to improve this module. +The project follows for the most part the OpenStack development model. +Developer documentation for the entire puppet-openstack project is at: + +* http://docs.openstack.org/developer/puppet-openstack-guide/ Check out current bugs or open new ones on JIRA project: @@ -336,42 +280,7 @@ Check out current bugs or open new ones on JIRA project: Feel free to assign an empty one to yourself! -Clone MidoNet's puppet repo in: - git clone https://github.com/midonet/puppet-midonet.git - -and send patches via: - - git review - -You can see the state of the patch in: - - https://review.gerrithub.io/#/q/status:open+project:midonet/puppet-midonet - -We are using a Gerrit's rebase-based branching policy. So please, submit a -single commit per change. If a commit has been rejected, do the changes you -need to do and squash your changes with the previous patch: - - git commit --amend - -We are using Vagrant for integration testing, puppet-lint for syntax code -convention and rspec por unit testing. To test the module before send a patch, -we recommend to use [bundle](http://bundler.io/) to install the dependencies: - - $ gem install bundle $ cd <path_to_puppet-midonet> $ bundle install - -And then run the syntax, unit, and smoke tests. - - $ rake lint $ rake spec $ rake beaker - -**Puppet-midonet** uses Vagrant as the backend provisioner for beaker, so to -have Vagrant installed is mandatory. - -You can contact us on several channels: -https://github.com/midonet/midonet/wiki/Communication - -## Release Notes - -* v2015.1.0: Initial manifests -* v2015.6.0: Adding `midonet_cli`, `midonet_host_registry` and - `midonet_gateway` types. +Contributors +------------ +The github [contributor graph](https://github.com/openstack/puppet-midonet/graphs/contributors).