From 8c353be83b5d43ebaffaf1cfade29755e0246922 Mon Sep 17 00:00:00 2001 From: Jaume Devesa Date: Mon, 8 Jun 2015 16:50:31 +0200 Subject: [PATCH] Move arrakis here Most of the arrakis code moved here, using puppet-cassandra and puppet-zookeeper as dependencies Change-Id: I6bdfb80457c500e2c6ea98aeaa9e7c074757c6c7 --- .gitignore | 54 ++++++ .kitchen.yml | 33 ++++ Gemfile | 12 ++ Puppetfile | 15 ++ README.md | 115 ------------ Rakefile | 32 ++++ data/common.yaml | 0 data/hiera.yaml | 9 + data/osfamily/Debian/12.04.yaml | 3 + data/osfamily/Debian/14.04.yaml | 4 + data/osfamily/Debian/common.yaml | 29 +++ data/osfamily/RedHat/6.yaml | 4 + data/osfamily/RedHat/7.yaml | 4 + data/osfamily/RedHat/common.yaml | 28 +++ files/midonet-api/midonet-api.xml | 6 + manifests/init.pp | 63 +++++++ manifests/midonet_agent.pp | 75 ++++++++ manifests/midonet_agent/install.pp | 40 +++++ manifests/midonet_agent/run.pp | 40 +++++ manifests/midonet_api.pp | 123 +++++++++++++ manifests/midonet_api/augeas.pp | 31 ++++ manifests/midonet_api/install.pp | 46 +++++ manifests/midonet_api/run.pp | 74 ++++++++ manifests/midonet_cli.pp | 41 +++++ manifests/neutron_plugin.pp | 94 ++++++++++ manifests/repository.pp | 120 +++++++++++++ manifests/repository/centos.pp | 84 +++++++++ manifests/repository/ubuntu.pp | 85 +++++++++ metadata.json | 29 +++ templates/midonet-agent/midolman.conf.erb | 168 ++++++++++++++++++ templates/midonet-api/keystone_config.xml.erb | 24 +++ templates/midonet-api/mockauth_config.xml.erb | 14 ++ templates/midonet-api/web.xml.erb | 110 ++++++++++++ templates/neutron_plugin/midonet.ini.erb | 5 + templates/zookeeper/zoo.cfg.erb | 19 ++ templates/zookeeper/zookeeper-env.sh.erb | 2 + test/init.pp | 19 ++ .../default/bats/verify_server.bats | 155 ++++++++++++++++ 38 files changed, 1694 insertions(+), 115 deletions(-) create mode 100644 .gitignore create mode 100644 .kitchen.yml create mode 100644 Gemfile create mode 100644 Puppetfile create mode 100644 Rakefile create mode 100644 data/common.yaml create mode 100644 data/hiera.yaml create mode 100644 data/osfamily/Debian/12.04.yaml create mode 100644 data/osfamily/Debian/14.04.yaml create mode 100644 data/osfamily/Debian/common.yaml create mode 100644 data/osfamily/RedHat/6.yaml create mode 100644 data/osfamily/RedHat/7.yaml create mode 100644 data/osfamily/RedHat/common.yaml create mode 100644 files/midonet-api/midonet-api.xml create mode 100644 manifests/init.pp create mode 100644 manifests/midonet_agent.pp create mode 100644 manifests/midonet_agent/install.pp create mode 100644 manifests/midonet_agent/run.pp create mode 100644 manifests/midonet_api.pp create mode 100644 manifests/midonet_api/augeas.pp create mode 100644 manifests/midonet_api/install.pp create mode 100644 manifests/midonet_api/run.pp create mode 100644 manifests/midonet_cli.pp create mode 100644 manifests/neutron_plugin.pp create mode 100644 manifests/repository.pp create mode 100644 manifests/repository/centos.pp create mode 100644 manifests/repository/ubuntu.pp create mode 100644 metadata.json create mode 100644 templates/midonet-agent/midolman.conf.erb create mode 100644 templates/midonet-api/keystone_config.xml.erb create mode 100644 templates/midonet-api/mockauth_config.xml.erb create mode 100644 templates/midonet-api/web.xml.erb create mode 100644 templates/neutron_plugin/midonet.ini.erb create mode 100644 templates/zookeeper/zoo.cfg.erb create mode 100644 templates/zookeeper/zookeeper-env.sh.erb create mode 100644 test/init.pp create mode 100644 test/integration/default/bats/verify_server.bats diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a32bfd --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +*.gem +*.rbc +/.config +/coverage/ +/InstalledFiles +**/pkg/ +/spec/reports/ +/test/tmp/ +/test/version_tmp/ +/tmp/ + +## Specific to RubyMotion: +.dat* +.repl_history +build/ + +## Documentation cache and generated files: +/.yardoc/ +/_yardoc/ +/doc/ +/rdoc/ + +## Environment normalisation: +/.bundle/ +/lib/bundler/man/ + +# for a library or gem, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +Gemfile.lock +Puppetfile.lock +# .ruby-version +# .ruby-gemset + +# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: +.rvmrc + +# DS_Store +*/.DS_Store + +# Configuration files for cloud9.io +*/.c9/ + +# Kitchen files +.kitchen/ + +# Librarian files +.librarian/ +.tmp/ + +# Vim files +**.swp + +# Ignore vagrant-generated files +.vagrant diff --git a/.kitchen.yml b/.kitchen.yml new file mode 100644 index 0000000..2edc669 --- /dev/null +++ b/.kitchen.yml @@ -0,0 +1,33 @@ +--- +driver: + name: docker + use_sudo: false + disable_upstart: false + +provisioner: + name: puppet_apply + manifests_path: test + modules_path: modules + hiera_data_path: data + hiera_config_path: data/hiera.yaml + manifest: init.pp + +platforms: + - name: ubuntu-14.04 + driver_config: + image: midonet/ubuntu:14.04 + privileged: true + run_command: /sbin/init + ssh_timeout: 10 + ssh_retries: 5 + - name: centos-7 + driver_config: + image: midonet/centos:centos7 + privileged: true + volume: /sys/fs/cgroup:/sys/fs/cgroup:ro + run_command: /usr/sbin/init + ssh_timeout: 10 + ssh_retries: 5 + +suites: + - name: default diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..94320f5 --- /dev/null +++ b/Gemfile @@ -0,0 +1,12 @@ +source 'https://rubygems.org' + +puppetversion = ENV.key?('PUPPET_VERSION') ? "= #{ENV['PUPPET_VERSION']}" : ['>= 3.3'] +gem 'puppet', puppetversion +gem 'puppetlabs_spec_helper', '>= 0.1.0' +gem 'puppet-lint', '>= 0.3.2' +gem 'facter', '>= 1.7.0' +gem 'test-kitchen', :git => 'git://github.com/jdevesa/test-kitchen', :branch => 'remove_ssh_retry_options' +gem 'kitchen-puppet' +gem 'librarian-puppet', '>= 2.0.1' +gem 'kitchen-docker', :git => 'git://github.com/jdevesa/kitchen-docker.git', :branch => 'wait_for_ssh' +gem 'kitchen-vagrant' diff --git a/Puppetfile b/Puppetfile new file mode 100644 index 0000000..6ac6b89 --- /dev/null +++ b/Puppetfile @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +#^syntax detection + +forge "https://forgeapi.puppetlabs.com" + +metadata + +mod 'midonet-zookeeper', + :git => 'http://github.com/midonet/puppet-zookeeper', + :ref => 'master' + +mod 'midonet-cassandra', + :git => 'http://github.com/midonet/puppet-cassandra', + :ref => 'master' + diff --git a/README.md b/README.md index b8e1570..b1d5067 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ 4. [Usage](#usage) 5. [Reference](#reference) * [Midonet Repository Class Reference](#midonet-repository) - * [Cassandra Class Reference](#cassandra) - * [Zookeeper Class Reference](#zookeeper) * [Midonet Agent Class Reference](#midonet-agent) * [Midonet API Class Reference](#midonet-api) * [Midonet CLI Class Reference](#midonet-cli) @@ -113,119 +111,6 @@ or use a YAML file using the same attributes, accessible from Hiera: midonet_repository::openstack_release: 'juno' -#### Cassandra - -MidoNet needs Cassandra cluster to keep track of living connections. This class -installs cassandra the way that MidoNet needs it. - -The easiest way to run the class is: - - include midonet::cassandra - -And a cassandra single-machine cluster will be installed, binding the -'localhost' address. - -Run a single-machine cluster but binding a hostname or another address -would be: - - class {'midonet::cassandra': - seeds => ['192.168.2.2'], - seed_address => '192.168.2.2' - } - -For cluster of nodes, use the same 'seeds' value, but change the -seed_address of each node: - -... On node1: - - class {'midonet::cassandra': - seeds => ['node_1', 'node_2', 'node_3'], - seed_address => 'node_1' - } - -... On node2: - - class {'midonet::cassandra': - seeds => ['node_1', 'node_2', 'node_3'], - seed_address => 'node_2' - } - -... On node3: - - class {'midonet::cassandra': - seeds => ['node_1', 'node_2', 'node_3'], - seed_address => 'node_3' - } - -NOTE: node_X can be either hostnames or ip addresses -You can alternatively use the Hiera's yaml style: - - midonet::cassandra::seeds: - - node_1 - - node_2 - - node_3 - midonet::cassandra::seed_address: 'node_1' - -#### Zookeeper - -ZooKeeper cluster stores MidoNet virtual network hierarchy. Likewise -Cassandra, this class installs the version and configuration that MidoNet needs -to run. - -The easiest way to run the class is: - - include midonet::zookeeper - -And puppet will install a local zookeeper without cluster. For a clustered -zookeeper, the way you have to define your puppet site, is: - -... on Node1 - - class {'midonet::zookeeper': - servers => [{'id' => 1 - 'host' => 'node_1'}, - {'id' => 2, - 'host' => 'node_2'}, - {'id' => 3, - 'host' => 'node_3'}], - server_id => 1} - -... on Node2 - - class {'midonet::zookeeper': - servers => [{'id' => 1 - 'host' => 'node_1'}, - {'id' => 2, - 'host' => 'node_2'}, - {'id' => 3, - 'host' => 'node_3'}], - server_id => 2} - -... on Node3 - - class {'midonet::zookeeper': - servers => [{'id' => 1 - 'host' => 'node_1'}, - {'id' => 2, - 'host' => 'node_2'}, - {'id' => 3, - 'host' => 'node_3'}], - server_id => 3} - -defining the same servers for each puppet node, but using a different -server\_id for each one. NOTE: node\_X can be hostnames or IP addresses. - -you can alternatively use the Hiera's yaml style - - midonet::zookeeper::servers: - - id: 1 - host: 'node_1' - - id: 2 - host: 'node_2' - - id: 3 - host: 'node_3' - midonet::zookeeper::server_id: '1' - #### Midonet Agent Midonet Agent is the Openvswitch datapath controller and must run in all the Hypervisor hosts. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..c71edc0 --- /dev/null +++ b/Rakefile @@ -0,0 +1,32 @@ +require 'rubygems' +require 'puppetlabs_spec_helper/rake_tasks' +require 'puppet-lint/tasks/puppet-lint' +PuppetLint.configuration.send('disable_80chars') +PuppetLint.configuration.send('disable_autoloader_layout') +PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"] + +desc "Validate manifests, templates, and ruby files" +task :validate do + Dir['manifests/**/*.pp'].each do |manifest| + sh "puppet parser validate --noop #{manifest}" + end + Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file| + sh "ruby -c #{ruby_file}" unless ruby_file =~ /spec\/fixtures/ + end + Dir['templates/**/*.erb'].each do |template| + sh "erb -P -x -T '-' #{template} | ruby -c" + end +end + +task :lint do + Dir['manifests/**/*.pp'].each do |manifest| + sh "puppet-lint --no-80chars-check --no-autoloader_layout-check #{manifest}" + end +end + +begin + require 'kitchen/rake_tasks' + Kitchen::RakeTasks.new +rescue LoadError + puts ">>>>> Kitchen gem not loaded, omitting tasks" unless ENV['CI'] +end diff --git a/data/common.yaml b/data/common.yaml new file mode 100644 index 0000000..e69de29 diff --git a/data/hiera.yaml b/data/hiera.yaml new file mode 100644 index 0000000..76f32b8 --- /dev/null +++ b/data/hiera.yaml @@ -0,0 +1,9 @@ +--- +:backends: + - yaml + - module_data +:hierarchy: + - osfamily/%{::osfamily}/%{::lsbmajdistrelease} + - osfamily/%{::osfamily}/%{::lsbdistrelease} + - osfamily/%{::osfamily}/common + - common diff --git a/data/osfamily/Debian/12.04.yaml b/data/osfamily/Debian/12.04.yaml new file mode 100644 index 0000000..a00bde2 --- /dev/null +++ b/data/osfamily/Debian/12.04.yaml @@ -0,0 +1,3 @@ +--- # Repository-based attributes +midonet::repository::midonet_openstack_repo: 'http://repo.midonet.org/openstack-icehouse' +midonet::repository::openstack_release: 'icehouse' diff --git a/data/osfamily/Debian/14.04.yaml b/data/osfamily/Debian/14.04.yaml new file mode 100644 index 0000000..11782f5 --- /dev/null +++ b/data/osfamily/Debian/14.04.yaml @@ -0,0 +1,4 @@ +--- +# Repository-based attributes +midonet::repository::midonet_openstack_repo: "http://repo.midonet.org/openstack-juno" +midonet::repository::openstack_release: 'juno' diff --git a/data/osfamily/Debian/common.yaml b/data/osfamily/Debian/common.yaml new file mode 100644 index 0000000..8ac4462 --- /dev/null +++ b/data/osfamily/Debian/common.yaml @@ -0,0 +1,29 @@ +--- +# Repository-based attributes +midonet::repository::midonet_repo: 'http://repo.midonet.org/midonet/v2015.03' +midonet::repository::midonet_thirdparty_repo: 'http://repo.midonet.org/misc' +midonet::repository::midonet_key: '35FEEF2BAD40EA777D0C5BA6FCE340D250F18FCF' +midonet::repository::midonet_stage: 'stable' +midonet::repository::midonet_key_url: 'http://repo.midonet.org/packages.midokura.key' + +# Midonet Host Agent-based attributes +midonet::midonet_agent::zk_servers: + - ip: 'localhost' + port: 2181 +midonet::midonet_agent::cassandra_seeds: + - 'localhost' + +# Midonet API-based attributes +midonet::midonet_api::zk_servers: + - ip: 'localhost' + port: 2181 +midonet::midonet_api::keystone_auth: false +midonet::midonet_api::vtep: false +midonet::midonet_api::tomcat_package: 'tomcat7' +midonet::midonet_api::catalina_base: '/var/lib/tomcat7' + +# Neutron Plugin based attributes +midonet::neutron_plugin::midonet_api_ip: 'localhost' +midonet::neutron_plugin::username: 'fake_user' +midonet::neutron_plugin::password: 'fake_password' +midonet::neutron_plugin::project_id: 'service' diff --git a/data/osfamily/RedHat/6.yaml b/data/osfamily/RedHat/6.yaml new file mode 100644 index 0000000..cd6ff80 --- /dev/null +++ b/data/osfamily/RedHat/6.yaml @@ -0,0 +1,4 @@ +--- +# Repository-based attributes +midonet::repository::midonet_openstack_repo: 'http://repo.midonet.org/openstack-icehouse/RHEL' +midonet::repository::openstack_release: 'icehouse' diff --git a/data/osfamily/RedHat/7.yaml b/data/osfamily/RedHat/7.yaml new file mode 100644 index 0000000..42f2237 --- /dev/null +++ b/data/osfamily/RedHat/7.yaml @@ -0,0 +1,4 @@ +--- +# Repository-based attributes +midonet::repository::midonet_openstack_repo: 'http://repo.midonet.org/openstack-juno/RHEL' +midonet::repository::openstack_release: 'juno' diff --git a/data/osfamily/RedHat/common.yaml b/data/osfamily/RedHat/common.yaml new file mode 100644 index 0000000..d1b1425 --- /dev/null +++ b/data/osfamily/RedHat/common.yaml @@ -0,0 +1,28 @@ +--- +# Repository-based attributes +midonet::repository::midonet_repo: 'http://repo.midonet.org/midonet/v2015.03/RHEL' +midonet::repository::midonet_thirdparty_repo: 'http://repo.midonet.org/misc/RHEL' +midonet::repository::midonet_stage: 'stable' +midonet::repository::midonet_key_url: 'http://repo.midonet.org/packages.midokura.key' + +# Midonet Host Agent-based attributes +midonet::midonet_agent::zk_servers: + - ip: 'localhost' + port: 2181 +midonet::midonet_agent::cassandra_seeds: + - 'localhost' + +# Midonet API-based attributes +midonet::midonet_api::zk_servers: + - ip: 'localhost' + port: 2181 +midonet::midonet_api::keystone_auth: false +midonet::midonet_api::vtep: false +midonet::midonet_api::tomcat_package: 'tomcat' +midonet::midonet_api::catalina_base: '/usr/share/tomcat' + +# Neutron Plugin based attributes +midonet::neutron_plugin::midonet_api_ip: 'localhost' +midonet::neutron_plugin::username: 'fake_user' +midonet::neutron_plugin::password: 'fake_password' +midonet::neutron_plugin::project_id: 'service' diff --git a/files/midonet-api/midonet-api.xml b/files/midonet-api/midonet-api.xml new file mode 100644 index 0000000..1d337b3 --- /dev/null +++ b/files/midonet-api/midonet-api.xml @@ -0,0 +1,6 @@ + diff --git a/manifests/init.pp b/manifests/init.pp new file mode 100644 index 0000000..36d1979 --- /dev/null +++ b/manifests/init.pp @@ -0,0 +1,63 @@ +# == Class: midonet +# +# Install all the midonet modules in a single machine with all +# the default parameters. +# +# == Examples +# +# The only way to call this class is using the include reserved word: +# +# include midonet +# +# To more advanced usage of the midonet puppet module, check out the +# documentation for the midonet's modules: +# +# - midonet::repository +# - midonet::cassandra +# - midonet::zookeeper +# - midonet::midonet_agent +# - midonet::midonet_api +# - midonet::midonet_cli +# - midonet::neutron_plugin +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet { + + # Add zookeeper + class {'::zookeeper': } + + # Add cassandra + class {'::cassandra': } + + # Add midonet-agent + class { 'midonet::midonet_agent': + require => [Class['::cassandra'], + Class['::zookeeper']] + } + + # Add midonet-api + class {'midonet::midonet_api':} + + # Add midonet-cli + class {'midonet::midonet_cli':} + +} diff --git a/manifests/midonet_agent.pp b/manifests/midonet_agent.pp new file mode 100644 index 0000000..9879487 --- /dev/null +++ b/manifests/midonet_agent.pp @@ -0,0 +1,75 @@ +# == Class: midonet::midonet_agent +# +# Install and run midonet_agent +# +# === Parameters +# +# [*zk_servers*] +# List of hash [{ip, port}] Zookeeper instances that run in cluster. +# [*cassandra_seeds] +# List of [ip] cassandra instances that run in cluster. +# +# === Examples +# +# 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': +# zk_servers => [{'ip' => 'host1', +# 'port' => '2183'}, +# {'ip' => 'host2'}], +# cassandra_seeds => ['host1', 'host2', 'host3'] +# } +# +# Please note that Zookeeper port is not mandatory and defaulted to 2181 +# +# You can alternatively use the Hiera.yaml style: +# +# midonet::midonet_agent::zk_servers: +# - ip: 'host1' +# port: 2183 +# - ip: 'host2' +# midonet::midonet_agent::cassandra_seeds: +# - 'host1' +# - 'host2' +# - 'host3' +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# + +class midonet::midonet_agent($zk_servers, $cassandra_seeds) { + + class {'midonet::midonet_agent::install': + } + + class {'midonet::midonet_agent::run': + zk_servers => $zk_servers, + cs_seeds => $cassandra_seeds + } +} diff --git a/manifests/midonet_agent/install.pp b/manifests/midonet_agent/install.pp new file mode 100644 index 0000000..88e4a7c --- /dev/null +++ b/manifests/midonet_agent/install.pp @@ -0,0 +1,40 @@ +# == Class: midonet::midonet_agent::install +# Check out the midonet::midonet-agent class for a full understanding of +# how to use the midonet_agent resource +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::midonet_agent::install { + + require midonet::repository + + if ! defined(Class['java']) { + class {'java': + distribution => 'jre', + require => Exec['update-midonet-repos'] + } + } + + package {'midolman': + ensure => present, + require => Class['java'] + } +} diff --git a/manifests/midonet_agent/run.pp b/manifests/midonet_agent/run.pp new file mode 100644 index 0000000..135295e --- /dev/null +++ b/manifests/midonet_agent/run.pp @@ -0,0 +1,40 @@ +# == Class: midonet::midonet_agent::run +# Check out the midonet::midonet_agent class for a full understanding of +# how to use the midonet_agent resource +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::midonet_agent::run ( + $zk_servers, + $cs_seeds) { + + require midonet::midonet_agent::install + + file {'/etc/midolman/midolman.conf': + ensure => present, + content => template('midonet/midonet-agent/midolman.conf.erb'), + require => Package['midolman'] + } ~> + + service {'midolman': + ensure => running + } +} diff --git a/manifests/midonet_api.pp b/manifests/midonet_api.pp new file mode 100644 index 0000000..173dd50 --- /dev/null +++ b/manifests/midonet_api.pp @@ -0,0 +1,123 @@ +# == Class: midonet::midonet_api +# +# Install and run midonet_api +# +# === Parameters +# +# [*zk_servers*] +# List of hash [{ip, port}] Zookeeper instances that run in cluster. +# [*keystone_auth*] +# Whether to authenticate the API request through a Keystone service. Default: +# false. +# [*vtep*] +# Whether to enable the vtep service endpoint. Default: false +# [*tomcat_package*] +# The name of the tomcat package to install. The module already inserts a +# value depending on the distribution used. Don't override it unless you know +# what you are doing. +# [*api_ip*] +# Exposed IP address. By default, it exposes the first internet address that +# founds in the host. +# [*api_port*] +# TCP listening port. By default, 8080 +# [*keystone_host*] +# Keystone service endpoint IP. Not used if keystone_auth is false. +# [*keystone_port*] +# Keystone service endpoint port. Not used if keystone_auth is false. +# [*keystone_admin_token*] +# Keystone admin token. Not used if keystone_auth is false. +# [*keystone_tenant_name*] +# Keystone tenant name. 'admin' by default. Not used if keystone_auth is false. +# +# === Examples +# +# 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'}], +# keystone_auth => true, +# vtep => true, +# api_ip => '92.234.12.4', +# keystone_host => '92.234.12.9', +# keystone_port => 35357 (35357 is already the default) +# keystone_admin_token => 'arrakis', +# keystone_tenant_name => 'other-than-admin' ('admin' by default) +# } +# +# You can alternatively use the Hiera.yaml style: +# +# midonet::midonet_api::zk_servers: +# - ip: 'host1' +# port: 2183 +# - ip: 'host2' +# 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: 'admin' +# +# Please note that Zookeeper port is not mandatory and defaulted to 2181. +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::midonet_api( + $zk_servers, + $keystone_auth, + $vtep, + $tomcat_package, + $keystone_host=$::ipaddress, + $keystone_port=35357, + $keystone_admin_token=undef, + $keystone_tenant_name='admin', + $api_ip=$::ipaddress, + $api_port='8084', + $catalina_base) { + + include midonet::midonet_api::augeas + + class {'midonet::midonet_api::install': } + + class {'midonet::midonet_api::run': + zk_servers => $zk_servers, + keystone_auth => $keystone_auth, + tomcat_package => $tomcat_package, + vtep => $vtep, + api_ip => $api_ip, + api_port => $api_port, + keystone_host => $keystone_host, + keystone_port => $keystone_port, + keystone_admin_token => $keystone_admin_token, + keystone_tenant_name => $keystone_tenant_name, + catalina_base => $catalina_base + } +} diff --git a/manifests/midonet_api/augeas.pp b/manifests/midonet_api/augeas.pp new file mode 100644 index 0000000..25c105e --- /dev/null +++ b/manifests/midonet_api/augeas.pp @@ -0,0 +1,31 @@ +# == Class: midonet::midonet_api::augeas +# +# Make sure augeas is installed before install tomcat + +class midonet::midonet_api::augeas { + + require midonet::repository + + case $::osfamily { + 'Debian': { + package {'libaugeas-ruby': + ensure => present + } + } + 'RedHat': { + package {'deltarpm': + ensure => present + } -> + package {'augeas': + ensure => present + } -> + package {'augeas-devel': + ensure => present + } -> + exec {'/usr/bin/gem install ruby-augeas': } + } + default: { + fail('Operating System not supported by this module') + } + } +} diff --git a/manifests/midonet_api/install.pp b/manifests/midonet_api/install.pp new file mode 100644 index 0000000..4db738a --- /dev/null +++ b/manifests/midonet_api/install.pp @@ -0,0 +1,46 @@ +# == Class: midonet::midonet_api::install +# Check out the midonet::midonet_api class for a full understanding of +# how to use the midonet_api resource +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::midonet_api::install { + + require midonet::repository + require midonet::midonet_api::augeas + + if ! defined(Class['java']) { + class {'java': + distribution => 'jre', + require => Exec['update-midonet-repos'] + } + } + + class {'tomcat': + install_from_source => false, + require => [Class['java'], + Exec['update-midonet-repos']] + } -> + + package {'midonet-api': + ensure => present, + } +} diff --git a/manifests/midonet_api/run.pp b/manifests/midonet_api/run.pp new file mode 100644 index 0000000..799b4cd --- /dev/null +++ b/manifests/midonet_api/run.pp @@ -0,0 +1,74 @@ +# == Class: midonet::midonet_api::run +# Check out the midonet::midonet_api class for a full understanding of +# how to use the midonet_api resource +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::midonet_api::run ( + $zk_servers, + $keystone_auth, + $vtep, + $tomcat_package, + $api_ip, + $api_port, + $keystone_host, + $keystone_port, + $keystone_admin_token, + $keystone_tenant_name, + $catalina_base +) { + + require midonet::midonet_api::install + + tomcat::instance{'midonet-api': + package_name => $tomcat_package, + } -> + + tomcat::config::server::connector {'midonet-api': + port => $api_port, + catalina_base => $catalina_base, + connector_ensure => 'present', + require => Tomcat::Instance['midonet-api'], + notify => Service[$tomcat_package] + } + + file {"/etc/${tomcat_package}/Catalina/localhost/midonet-api.xml": + ensure => present, + source => 'puppet:///modules/midonet/midonet-api/midonet-api.xml', + owner => 'root', + group => 'root', + require => Tomcat::Instance['midonet-api'], + notify => Service[$tomcat_package] + } + + file {'/usr/share/midonet-api/WEB-INF/web.xml': + ensure => present, + content => template('midonet/midonet-api/web.xml.erb'), + require => Package['midonet-api'], + notify => Service[$tomcat_package] + } + + service {$tomcat_package: + ensure => running, + require => [File['/usr/share/midonet-api/WEB-INF/web.xml'], + Tomcat::Config::Server::Connector['midonet-api']] + } +} diff --git a/manifests/midonet_cli.pp b/manifests/midonet_cli.pp new file mode 100644 index 0000000..76a5836 --- /dev/null +++ b/manifests/midonet_cli.pp @@ -0,0 +1,41 @@ +# == Class: midonet::midonet_cli +# +# Install midonet_cli +# +# === Parameters +# +# No parameters +# +# === Examples +# +# Just declare the class and the package will be installed +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::midonet_cli { + + require midonet::repository + + package {'python-midonetclient': + ensure => present, + require => Exec['update-midonet-repos'] + } +} diff --git a/manifests/neutron_plugin.pp b/manifests/neutron_plugin.pp new file mode 100644 index 0000000..ea3c7f3 --- /dev/null +++ b/manifests/neutron_plugin.pp @@ -0,0 +1,94 @@ +# == Class: midonet::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 +# +# === Parameters +# +# [*midonet_api_ip*] +# IP address of the midonet api service +# [*midonet_api_port*] +# port address of the midonet api service +# [*keystone_username*] +# Username from which midonet api will authenticate against Keystone (use +# neutron service username) +# [*keystone_password*] +# Password from which midonet api will authenticate against Keystone (use +# neutron service password) +# [*keystone_tenant*] +# Tenant from which midonet api will authenticate against Keystone (use +# neutron service tenant) +# [*sync_db*] +# Whether 'midonet-db-manage' should run to create and/or syncrhonize the database +# with MidoNet specific tables. Defaults to false +# +# === Examples +# +# An example call would be: +# +# class {'midonet::neutron_plugin': +# midonet_api_ip => '23.123.5.32', +# midonet_api_port => '8080', +# keystone_username => 'neutron', +# keystone_password => '32kjaxT0k3na', +# keystone_tenant => 'services', +# sync_db => true +# } +# +# You can alternatively use the Hiera's yaml style: +# midonet::neutron_plugin::midonet_api_ip: '23.213.5.32' +# midonet::neutron_plugin::port: '8080' +# midonet::neutron_plugin::keystone_username: 'neutron' +# midonet::neutron_plugin::keystone_password: '32.kjaxT0k3na' +# midonet::neutron_plugin::keystone_tenant: 'services' +# midonet::neutron_plugin::sync_db: true +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::neutron_plugin ( + $midonet_api_ip = '127.0.0.1', + $midonet_api_port = '8080', + $keystone_username = 'neutron', + $keystone_password = undef, + $keystone_tenant = 'services', + $sync_db = false + ) { + + require midonet::repository + + package {'python-neutron-plugin-midonet': + ensure => present, + require => Exec['update-midonet-repos'] + } -> + + class {'neutron::plugins::midonet': + midonet_api_ip => $midonet_api_ip, + midonet_api_port => $midonet_api_port, + keystone_username => $keystone_username, + keystone_password => $keystone_password, + keystone_tenant => $keystone_tenant, + sync_db => $sync_db + } +} diff --git a/manifests/repository.pp b/manifests/repository.pp new file mode 100644 index 0000000..fbb7b64 --- /dev/null +++ b/manifests/repository.pp @@ -0,0 +1,120 @@ +# == Class: midonet::repository +# +# Prepare the midonet repositories to install packages. +# +# === Parameters +# +# [*midonet_repo*] +# Midonet Repository URL location. Please note the version +# of midonet use to be part of that URL. +# Ex: 'http://repo.midonet.org/midonet/v2014.11' +# [*midonet_openstack_repo*] +# Midonet Repository URL for the Midonet Neutron Plugin. The version use to +# be part of the URL. The package avaiable in this repo (the midonet plugin) +# is released along each OpenStack release (Icehouse, Juno, Kilo...) , not +# the Midonet OSS release. This is why Midonet maintains different repos. +# Ex: 'http://repo.midonet.org/openstack'. +# [*midonet_thirdparty_repo*] +# Third party software pinned for Midonet stability URL. +# Ex: 'http://repo.midonet.org/misc'. +# [*midonet_release*] +# Stage of the package. It can be 'stable', 'testing' or 'unstable'. +# Stable by default. +# [*midoney_key_url*] +# Midonet Key URL path. +# [*midonet_key*] +# Midonet GPG key for validate packages. Only override it if you use a +# different fork of Midonet. +# +# === Examples +# +# The easiest way to run the class is: +# +# include midonet::repository +# +# And puppet will configure the system to use the latest stable version +# of MidoNet OSS. +# +# To install other releases than the last default's Midonet OSS, you can +# override the default's midonet_repository atributes by a resource-like +# declaration: +# +# class { 'midonet::repository': +# midonet_repo => 'http://repo.midonet.org/midonet/v2014.11', +# midonet_openstack_repo => 'http://repo.midonet.org/openstack', +# midonet_thirdparty_repo => 'http://repo.midonet.org/misc', +# midonet_key => '50F18FCF', +# midonet_stage => 'stable', +# midonet_key_url => 'http://repo.midonet.org/packages.midokura.key', +# openstack_release => 'juno' +# } +# +# or use a YAML file using the same attributes, accessible from Hiera: +# +# midonet::repository::midonet_repo: 'http://repo.midonet.org/midonet/v2014.11' +# midonet::repository::midonet_openstack_repo: 'http://repo.midonet.org/openstack' +# midonet::repository::midonet_thirdparty_repo: 'http://repo.midonet.org/misc' +# midonet::repository::midonet_key: '50F18FCF' +# midonet::repository::midonet_stage: 'stable' +# midonet::repository::midonet_key_url: 'http://repo.midonet.org/packages.midokura.key' +# midonet::repository::openstack_release: 'juno' +# +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# +class midonet::repository ( + $midonet_repo, + $midonet_openstack_repo, + $midonet_thirdparty_repo, + $midonet_stage, + $openstack_release, + $midonet_key_url, + $midonet_key=unset) { + + case $::osfamily { + 'Debian': { + class {'midonet::repository::ubuntu': + midonet_repo => $midonet_repo, + midonet_openstack_repo => $midonet_openstack_repo, + midonet_thirdparty_repo => $midonet_thirdparty_repo, + midonet_stage => $midonet_stage, + openstack_release => $openstack_release, + midonet_key_url => $midonet_key_url, + midonet_key => $midonet_key + } + } + + 'RedHat': { + class {'midonet::repository::centos': + midonet_repo => $midonet_repo, + midonet_openstack_repo => $midonet_openstack_repo, + midonet_thirdparty_repo => $midonet_thirdparty_repo, + midonet_stage => $midonet_stage, + openstack_release => $openstack_release, + midonet_key_url => $midonet_key_url + } + } + + default: { + fail('Operating System not supported by this module') + } + } +} diff --git a/manifests/repository/centos.pp b/manifests/repository/centos.pp new file mode 100644 index 0000000..d595a96 --- /dev/null +++ b/manifests/repository/centos.pp @@ -0,0 +1,84 @@ +# == Class: midonet::repository::centos +# NOTE: don't use this class, use midonet::repository(::init) instead +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# + +class midonet::repository::centos ( + $midonet_repo, + $midonet_openstack_repo, + $midonet_thirdparty_repo, + $midonet_stage, + $openstack_release, + $midonet_key_url) + { + # Adding repository for ubuntu + notice('Adding midonet sources for RedHat-like distribution') + if ($::operatingsystemmajrelease == 6 or + $::operatingsystemmajrelease == 7) { + if ($::operatingsystemmajrelease == 6 and + $openstack_release == 'juno') { + fail ("CentOS/Redhat 6 only supports + 'openstack_release => icehouse'") + } + + yumrepo { 'midonet': + baseurl => "${midonet_repo}/${::operatingsystemmajrelease}/${midonet_stage}", + descr => 'Midonet base repo', + enabled => 1, + gpgcheck => 1, + gpgkey => $midonet_key_url, + timeout => 60 + } + + yumrepo { 'midonet-openstack-integration': + baseurl => "${midonet_openstack_repo}/${::operatingsystemmajrelease}/${midonet_stage}", + descr => 'Midonet OS plugin repo', + enabled => 1, + gpgcheck => 1, + gpgkey => $midonet_key_url, + timeout => 60 + } + + package { 'epel-release': + ensure => installed + } + + package { 'rdo-release': + ensure => installed, + source => "https://repos.fedorapeople.org/repos/openstack/openstack-${openstack_release}/rdo-release-${openstack_release}.rpm", + provider => 'rpm', + require => Package['epel-release'] + } + + exec {'update-midonet-repos': + command => '/usr/bin/yum clean all && /usr/bin/yum makecache' + } + + Yumrepo<| |> -> Exec<| command == 'update-midonet-repos' |> + Package<| |> -> Exec<| command == 'update-midonet-repos' |> + } + else + { + fail("RedHat/CentOS version ${::operatingsystemmajrelease} + not supported") + } + } diff --git a/manifests/repository/ubuntu.pp b/manifests/repository/ubuntu.pp new file mode 100644 index 0000000..0de8e1b --- /dev/null +++ b/manifests/repository/ubuntu.pp @@ -0,0 +1,85 @@ +# == Class: midonet::repository::ubuntu +# NOTE: don't use this class, use midonet::repository(::init) instead +# +# === Authors +# +# Midonet (http://midonet.org) +# +# === Copyright +# +# Copyright (c) 2015 Midokura SARL, All Rights Reserved. +# +# 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. +# + +class midonet::repository::ubuntu ( + $midonet_repo, + $midonet_stage, + $midonet_openstack_repo, + $midonet_thirdparty_repo, + $midonet_key, + $midonet_key_url, + $openstack_release) + { + # Adding repository for ubuntu + notice('Adding midonet sources for Debian-like distribution') + if $::lsbdistrelease == '14.04' or $::lsbdistrelease == '12.04' { + if $::lsbdistrelease == '12.04' and $openstack_release == 'juno' { + fail ('Ubuntu 12.04 only supports icehouse') + } + notice('Adding midonet sources for Debian-like distribution') + + include apt + include apt::update + + # Update the package list each time a package is defined. That takes + # time, but it ensures it will not fail for out of date repository info + # Exec['apt_update'] -> Package<| |> + + apt::key {'midonetkey': + key => $midonet_key, + key_source => $midonet_key_url, + } + + apt::source {'midonet': + comment => 'Midonet apt repository', + location => $midonet_repo, + release => $midonet_stage, + include_src => false, + } + + apt::source {'midonet-openstack-integration': + comment => 'Midonet apt plugin repository', + location => $midonet_openstack_repo, + release => $midonet_stage, + include_src => false, + } + + # Dummy exec to wrap apt_update + exec {'update-midonet-repos': + command => '/bin/true', + require => [Exec['apt_update'], + Apt::Source['midonet'], + Apt::Source['midonet-openstack-integration']] + + } + + Apt::Key<| |> -> Apt::Source<| |> + Apt::Source<| |> -> Exec<| command == 'update-midonet-repos' |> + + } + else + { + fail("${::lsbdistid} ${::lsbdistrelease} version not supported") + } + } diff --git a/metadata.json b/metadata.json new file mode 100644 index 0000000..de4ff79 --- /dev/null +++ b/metadata.json @@ -0,0 +1,29 @@ +{ + "name": "midonet-midonet", + "version": "2015.3.0", + "author": "MidoNet", + "summary": "Configure and install MidoNet components", + "license": "Apache-2.0", + "source": "https://github.com/midonet/arrakis", + "project_page": "http://github.com/midonet/arrakis/tree/master/modules/midonet-midonet", + "issues_url": "https://midonet.atlassian.net/projects/MDT", + "dependencies": [ + { "name":"ripienaar-module_data","version_requirement":">=0.0.3" }, + { "name":"midonet-zookeeper","version_requirement":">=1.0.0" }, + { "name":"midonet-cassandra","version_requirement":">=1.0.0" }, + { "name":"puppetlabs-apt","version_requirement":">=1.7.0 <2.0.0" }, + { "name":"puppetlabs-java","version_requirement":">=1.3.0" }, + { "name":"puppetlabs-tomcat","version_requirement":">=1.2.0" } + ], + "tags": ["openstack", "sdn", "midonet"], + "operatingsystem_support": [ + { + "operatingsystem": "RedHat", + "operatingsystemrelease": [ "6.5", "6.6", "7.0" ] + }, + { + "operatingsystem": "Ubuntu", + "operatingsystemrelease": ["12.04", "14.04"] + } + ] +} diff --git a/templates/midonet-agent/midolman.conf.erb b/templates/midonet-agent/midolman.conf.erb new file mode 100644 index 0000000..84d4c9e --- /dev/null +++ b/templates/midonet-agent/midolman.conf.erb @@ -0,0 +1,168 @@ +opyright 2014 Midokura SARL +# +# 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. + +# Midolman configuration file + +[zookeeper] +<%- zkarr = Array.new -%> +<%- @zk_servers.each do |s| -%> + <%- zkarr.push("#{s['ip']}:#{s['port'] ||= 2181 }") -%> +<%- end -%> +zookeeper_hosts = <%= zkarr.join(",") %> +session_timeout = 30000 +midolman_root_key = /midonet/v1 +session_gracetime = 30000 + +[cassandra] +# The minimum recommended cassandra setup is a 3-node cluster with a +# replication factor of 3. Midolman uses Quorum as consistency policy, which +# would translate to 2 in the suggested setup. +# +# Refer to the docs/cassandra-cache.md documentation for more specific details +servers = <%= @cs_seeds.join(",") %> +# DO CHANGE THIS, recommended value is 3 +replication_factor = 1 +cluster = midonet + +[bridge] +mac_port_mapping_expire_millis = 15000 + +[arptable] +arp_retry_interval_seconds = 10 +arp_timeout_seconds = 60 +arp_stale_seconds = 1800 +arp_expiration_seconds = 3600 + +[midolman] +disconnected_ttl_seconds = 30 +control_interface = eth0 +cache_type = cassandra +check_flow_expiration_interval = 10000 #millis +# top_level_actor_supervisor = resume +top_level_actor_supervisor = crash +# after requesting an update to the kernel if a flow with idle expiration set +# has less then idle_flow_tolerance_interval to live, we expire it +# idle_flow_tolerance_interval = 10000 + +# bgpd options + +# path to directory containing bgpd binary, default is /usr/sbin +#bgpd_binary = /usr/sbin # for RHEL +#bgpd_binary = /usr/lib/quagga/ # for ubuntu + +# path to directory containing bgpd.conf configuration file for bgpd +#bgpd_config = /etc/quagga # default value + +# number of threads dedicated to packet processing +simulation_threads = 1 + +# number of datapath output channels +output_channels = 1 + +# threading model for datapath input channels. There is one channel per port. +# Allowed values are: +# + one_to_many: use one thread to service all ports +# + one_to_one: use one thread to service each port +input_channel_threading = one_to_many + +# dashboard, experimental +enable_dashboard=false +jetty_xml=/etc/midolman/jetty/etc/jetty.xml + +# location of the exterior vxlan vport uuid to vni key map (as a json object) +#uuid_vni_json_mapping_file=/etc/midolman/uuidtovni.json + +[host] +# This file holds the host UUID across reboots. It is created when +# midolman is first executed in the host, by default it will be stored +# in /etc/midolman/ +#properties_file = /etc/midolman/host_uuid.properties +wait_time_between_scans = 5000 # 5 * 1000 millis + +[datapath] + +# This option specifies the value of the udp port used for vxlan tunnelling +# to peer vteps. By default it is set to the standardized vxlan udp port value +# which is 4789. +#vxlan_vtep_udp_port = 4789 + +# This option specifies the value of the udp port used for vxlan tunnelling +# of overlay traffic from midolman hosts to other midolman hosts. The value +# needs to be the same across the cluster. It also needs to be different from +# the vxlan_vtep_udp_port value. +vxlan_overlay_udp_port = 6677 + +# Maximum number of flows a given datapath will be able to contain. +max_flow_count = 20000 +# Maximum number of wildcard flows a given datapath will be able to contain. +max_wildcard_flow_count = 20000 +# Midolman uses a pool of reusable buffers to send requests to the +# datapath. The options below tune the pool's size and that of its +# buffers. One pool is created for each output channel, the settings +# defined here will apply to each of those pools. +# max_size: maximum number of buffers to hold in the pool. When the +# pool is empty (all buffers are in use) and has reached +# its maximum size, temporary buffers will be allocated. +send_buffer_pool_max_size = 2048 +# initial_size: initial number of buffers to allocate in the pool +send_buffer_pool_initial_size = 2048 +# buf_size_kb: size of each buffer, in kb. Maximum total pool size would thus +# be: max_size * buf_size_kb. Beware that the buffer size puts a +# limit on the packet size that Midolman can send. In a network +# jumbo frames, adjust the size so that one buffer will accomodate +# a whole frame plus enough room for the flow's actions. +send_buffer_pool_buf_size_kb = 8 + +# How many datapath messages to process in each batch, increasing througput +# by reducing synchronization costs. Too high a value may hurt latency. +msgs_per_batch = 200 + + +# Midolman limits the amount of packets in flight in the system at any +# given time. This prevents its internal queues from growing infinitely. +# Additionally, midolman ensures that its processing capacity is shared +# fairly among ports connected to the datapath. This, for example, +# would prevent a single VM from setting up new flows at a rate that +# would starve other VMs in the system. +# +# This behaviour is achieved by routing packets that miss the datapath +# flow table and rise to userspace through a Hierarchical Token Bucket. +# This HTB is set up in such a way such that tunnel ports will get 50% +# of the resources, and the remaining 50% is shared fairly among all +# other ports (typically, VMs). +# +# The rate at which the buckets are refilled is automatic and dynamic. +# However the size of the buckets at each stage of the HTB can be tuned +# through the settings below, increasing a bucket size will increase the +# burstiness at which traffic can be queued before new tokens become +# available. +# +# Bucket size is measured in packets. + +# global_incoming_burts_capacity: size of the root bucket in the HTB. +global_incoming_burst_capacity = 128 + +# tunnel_incoming_burst_capacity: bucket size for tunnel ports (GRE, VxLAN) +tunnel_incoming_burst_capacity = 64 + +# vm_incoming_burst_capacity: bucket size for VM ports +vm_incoming_burst_capacity = 16 + +# vtep_incoming_burst_capacity: bucket size for VTEP (VxLAN) ports. +vtep_incoming_burst_capacity = 64 + +[haproxy_health_monitor] +# Health monitor is disabled by default. Please change the following value to +# true to activate it. +Health_monitor_enable = false diff --git a/templates/midonet-api/keystone_config.xml.erb b/templates/midonet-api/keystone_config.xml.erb new file mode 100644 index 0000000..3ed17bb --- /dev/null +++ b/templates/midonet-api/keystone_config.xml.erb @@ -0,0 +1,24 @@ + + + keystone-service_protocol + http + + + keystone-service_host + <%= @keystone_host %> + + + keystone-service_port + <%= @keystone_port %> + + + keystone-admin_token + <%= @keystone_admin_token %> + + + + keystone-tenant_name + <%= @keystone_tenant_name %> + diff --git a/templates/midonet-api/mockauth_config.xml.erb b/templates/midonet-api/mockauth_config.xml.erb new file mode 100644 index 0000000..4e42c13 --- /dev/null +++ b/templates/midonet-api/mockauth_config.xml.erb @@ -0,0 +1,14 @@ + + + + mock_auth-admin_token + 999888777666 + + + mock_auth-tenant_admin_token + 999888777666 + + + mock_auth-tenant_user_token + 999888777666 + diff --git a/templates/midonet-api/web.xml.erb b/templates/midonet-api/web.xml.erb new file mode 100644 index 0000000..eaea7ed --- /dev/null +++ b/templates/midonet-api/web.xml.erb @@ -0,0 +1,110 @@ + + + + MidoNet API + + + + + rest_api-base_uri + http://<%= @api_ip %>:<%= @api_port %>/midonet-api + + + + + cors-access_control_allow_origin + * + + + cors-access_control_allow_headers + Origin, X-Auth-Token, Content-Type, Accept, Authorization + + + cors-access_control_allow_methods + GET, POST, PUT, DELETE, OPTIONS + + + cors-access_control_expose_headers + Location + + + + + auth-auth_provider + + <%- if @keystone_auth -%> + org.midonet.api.auth.keystone.v2_0.KeystoneService + <%- else -%> + org.midonet.api.auth.MockAuthService + <%- end -%> + + + auth-admin_role + admin + + + <%- if @keystone_auth -%> + <%= scope.function_template(['midonet/midonet-api/keystone_config.xml.erb']) %> + <%- else -%> + <%= scope.function_template(['midonet/midonet-api/mockauth_config.xml.erb']) %> + <%- end -%> + + + + + zookeeper-use_mock + false + + + zookeeper-zookeeper_hosts + +<%- zkarr = Array.new -%> +<%- @zk_servers.each do |s| -%> + <%- zkarr.push("#{s['ip']}:#{s['port'] ||= 2181 }") -%> +<%- end -%> + <%= zkarr.join(",") %> + + + zookeeper-session_timeout + 30000 + + + zookeeper-midolman_root_key + /midonet/v1 + + + zookeeper-curator_enabled + true + + + + + midobrain-vxgw_enabled + <%= @vtep %> + + + + + + + org.midonet.api.servlet.JerseyGuiceServletContextListener + + + + + + + Guice Filter + com.google.inject.servlet.GuiceFilter + + + Guice Filter + /* + + + diff --git a/templates/neutron_plugin/midonet.ini.erb b/templates/neutron_plugin/midonet.ini.erb new file mode 100644 index 0000000..e5355d9 --- /dev/null +++ b/templates/neutron_plugin/midonet.ini.erb @@ -0,0 +1,5 @@ +[MIDONET] +midonet_uri = http://<%= @midonet_api_ip %>:8080/midonet-api +username = <%= @username %> +password = <%= @password %> +project_id = <%= @project_id %> diff --git a/templates/zookeeper/zoo.cfg.erb b/templates/zookeeper/zoo.cfg.erb new file mode 100644 index 0000000..5ddcfa2 --- /dev/null +++ b/templates/zookeeper/zoo.cfg.erb @@ -0,0 +1,19 @@ +# The number of milliseconds of each tick +tickTime=2000 +# The number of ticks that the initial +# synchronization phase can take +initLimit=10 +# The number of ticks that can pass between +# sending a request and getting an acknowledgement +syncLimit=5 +# the directory where the snapshot is stored. +dataDir=<%= @data_dir %> +# the port at which the clients will connect +clientPort=2181 + +# specify all zookeeper servers +# The fist port is used by followers to connect to the leader +# The second one is used for leader election +<% @servers.each do |s| %> +<%="server.#{s['id']}=#{s['host']}:#{s['peer_port'] ||= 2888}:#{s['lead_port'] || 3888}" %> +<% end %> diff --git a/templates/zookeeper/zookeeper-env.sh.erb b/templates/zookeeper/zookeeper-env.sh.erb new file mode 100644 index 0000000..4338f6a --- /dev/null +++ b/templates/zookeeper/zookeeper-env.sh.erb @@ -0,0 +1,2 @@ +export JAVA_HOME=<%= @java_home %> +export ZOO_LOG_DIR=/var/log/zookeeper diff --git a/test/init.pp b/test/init.pp new file mode 100644 index 0000000..3a01941 --- /dev/null +++ b/test/init.pp @@ -0,0 +1,19 @@ +# The baseline for module testing used by Puppet Labs is that each manifest +# should have a corresponding test manifest that declares that class or defined +# type. +# +# Tests are then run by using puppet apply --noop (to check for compilation +# errors and view a log of events) or by fully applying the test in a virtual +# environment (to compare the resulting system state to the desired state). +# +# Learn more about module testing here: +# http://docs.puppetlabs.com/guides/tests_smoke.html +# + +# Fake the facter when it compiles. The augeas version that will be installed +# will be this one +if empty($::augeasversion) { + $augeasversion = '1.0.0' +} + +class {'midonet':} diff --git a/test/integration/default/bats/verify_server.bats b/test/integration/default/bats/verify_server.bats new file mode 100644 index 0000000..f1e09cc --- /dev/null +++ b/test/integration/default/bats/verify_server.bats @@ -0,0 +1,155 @@ +# Test verify methods for midonet_repository + +command_exists() { + command -v "$@" > /dev/null 2>&1 +} + +# Code copied unashamedly from http://get.docker.io +get_distro() { + lsb_dist='' + if command_exists lsb_release; then + lsb_dist="$(lsb_release -si)" + fi + if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then + lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")" + fi + if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then + lsb_dist='debian' + fi + if [ -z "$lsb_dist" ] && [ -r /etc/redhat-release ]; then + lsb_dist='red-hat' + fi + if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then + lsb_dist="$(. /etc/os-release && echo "$ID")" + fi + + distro=$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]') +} + +get_distro + +@test 'midonet repo is set' { + + case $distro in + ubuntu) + run file /etc/apt/sources.list.d/midonet.list + [ "$status" -eq 0 ] + run file /etc/apt/sources.list.d/midonet-openstack-integration.list + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run ls /etc/yum.repos.d/midonet.repo + [ "$status" -eq 0 ] + run ls /etc/yum.repos.d/midonet-openstack-integration.repo + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +} + +@test 'midonet packages are available' { + case $distro in + ubuntu) + run bash -c "apt-cache search mido | grep midolman" + [ "$status" -eq 0 ] + run bash -c "apt-cache search mido | grep midonet-api" + [ "$status" -eq 0 ] + run bash -c "apt-cache search mido | grep python-midonetclient" + [ "$status" -eq 0 ] + run bash -c "apt-cache search mido | grep python-neutron-plugin-midonet" + [ "$status" -eq 0 ] + run bash -c "apt-cache search dsc20" + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run bash -c "yum search mido | grep midolman" + [ "$status" -eq 0 ] + run bash -c "yum search mido | grep midonet-api" + [ "$status" -eq 0 ] + run bash -c "yum search mido | grep python-midonetclient" + [ "$status" -eq 0 ] + run bash -c "yum search mido | grep python-neutron-plugin-midonet" + [ "$status" -eq 0 ] + run bash -c "yum search dsc20-2.0.10-1" + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +} + +@test 'zookeeper is running' { + case $distro in + ubuntu) + run bash -c "sudo /usr/share/zookeeper/bin/zkServer.sh status || sudo /usr/sbin/zkServer.sh status" + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run sudo /usr/sbin/zkServer.sh status + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +} + +@test 'cassandra is running' { + case $distro in + ubuntu) + run sudo service cassandra status + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run sudo service cassandra status + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +} + +@test 'midonet-agent is running' { + case $distro in + ubuntu) + run sudo service midolman status + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run sudo service midolman status + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +} + +@test 'midonet-api is running' { + case $distro in + ubuntu) + run sudo service tomcat7 status + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run sudo service tomcat status + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +} + +@test 'midonet-cli is installed' { + case $distro in + ubuntu) + run bash -c "dpkg -l | grep python-midonetclient" + [ "$status" -eq 0 ] + ;; + centos|red-hat) + run bash -c "rpm -qa | grep python-midonetclient" + [ "$status" -eq 0 ] + ;; + *) + exit 1; + esac +}