Add base profile for Octavia services
authorbeagles <beagles@redhat.com>
Fri, 5 Aug 2016 20:04:20 +0000 (17:34 -0230)
committerBrent Eagles <beagles@redhat.com>
Thu, 19 Jan 2017 16:35:27 +0000 (13:05 -0330)
Adds initial base profile and profile for API service.

Partially-implements: blueprint octavia-service-integration
Change-Id: I77783029797be4fb488c6e743c51d228eba9c474

manifests/profile/base/octavia.pp [new file with mode: 0644]
manifests/profile/base/octavia/api.pp [new file with mode: 0644]
spec/classes/tripleo_profile_base_octavia_api_spec.rb [new file with mode: 0644]
spec/classes/tripleo_profile_base_octavia_spec.rb [new file with mode: 0644]

diff --git a/manifests/profile/base/octavia.pp b/manifests/profile/base/octavia.pp
new file mode 100644 (file)
index 0000000..46ca009
--- /dev/null
@@ -0,0 +1,57 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# 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: tripleo::profile::base::octavia
+#
+# Octavia server profile for tripleo
+#
+# === Parameters
+#
+# [*step*]
+#   (Optional) The current step of the deployment
+#   Defaults to hiera('step')
+#
+# [*rabbit_user*]
+# [*rabbit_password*]
+#  (Optional) RabbitMQ user details
+#  Defaults to undef
+#
+# [*rabbit_hosts*]
+#   list of the rabbbit host fqdns
+#   Defaults to hiera('rabbitmq_node_names')
+#
+# [*rabbit_port*]
+#   IP port for rabbitmq service
+#   Defaults to 5672.
+#
+class tripleo::profile::base::octavia (
+  $step            = hiera('step'),
+  $rabbit_user     = undef,
+  $rabbit_password = undef,
+  $rabbit_hosts    = hiera('rabbitmq_node_names', undef),
+  $rabbit_port     = '5672'
+) {
+  if $step >= 3 {
+    class { '::octavia' :
+      default_transport_url => os_transport_url({
+        'transport' => 'rabbit',
+        'hosts'     => $rabbit_hosts,
+        'port'      => sprintf('%s', $rabbit_port),
+        'username'  => $rabbit_user,
+        'password'  => $rabbit_password
+        })
+    }
+    include ::octavia::config
+  }
+}
diff --git a/manifests/profile/base/octavia/api.pp b/manifests/profile/base/octavia/api.pp
new file mode 100644 (file)
index 0000000..d457478
--- /dev/null
@@ -0,0 +1,54 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# 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: tripleo::profile::base::octavia::api
+#
+# Octavia API server profile for tripleo
+#
+# === Parameters
+#
+# [*bootstrap_node*]
+#   (Optional) The hostname of the node responsible for bootstrapping tasks
+#   Defaults to hiera('bootstrap_nodeid')
+#
+# [*step*]
+#   (Optional) The current step in deployment. See tripleo-heat-templates
+#   for more details.
+#   Defaults to hiera('step')
+#
+class tripleo::profile::base::octavia::api (
+  $bootstrap_node = hiera('bootstrap_nodeid', undef),
+  $step           = hiera('step'),
+) {
+  if $::hostname == downcase($bootstrap_node) {
+    $sync_db = true
+  } else {
+    $sync_db = false
+  }
+
+  include ::tripleo::profile::base::octavia
+
+  if $step >= 3 and $sync_db {
+    include ::octavia::db::mysql
+  }
+
+  # We start the Octavia API server on the bootstrap node first, because
+  # it will try to populate tables and we need to make sure this happens
+  # before it starts on other nodes
+  if ($step >= 4 and $sync_db) or ($step >= 5 and !$sync_db) {
+    class { '::octavia::api':
+      sync_db => $sync_db,
+    }
+  }
+}
diff --git a/spec/classes/tripleo_profile_base_octavia_api_spec.rb b/spec/classes/tripleo_profile_base_octavia_api_spec.rb
new file mode 100644 (file)
index 0000000..d916a32
--- /dev/null
@@ -0,0 +1,135 @@
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# 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.
+#
+
+require 'spec_helper'
+
+describe 'tripleo::profile::base::octavia::api' do
+
+  let :params do
+    { :step            => 5,
+      :bootstrap_node  => 'notbootstrap.example.com'
+    }
+  end
+
+  shared_examples_for 'tripleo::profile::base::octavia::api' do
+    before :each do
+      facts.merge!({ :step => params[:step] })
+    end
+
+    let(:pre_condition) do
+      <<-eos
+      class { 'tripleo::profile::base::octavia' :
+        step => #{params[:step]},
+        rabbit_user     => 'bugs',
+        rabbit_password => 'rabbits_R_c00l',
+        rabbit_hosts    => ['hole.field.com']
+      }
+      class { 'octavia::db::mysql':
+        password => 'some_password'
+      }
+eos
+    end
+
+    context 'with step less than 3 on bootstrap' do
+      before do
+        params.merge!({
+          :step           => 2,
+          :bootstrap_node => 'node.example.com'
+        })
+      end
+
+      it 'should not do anything' do
+        is_expected.to_not contain_class('octavia::api')
+      end
+    end
+
+    context 'with step less than 3 on non-bootstrap' do
+      before do
+        params.merge!({ :step => 2 })
+      end
+
+      it 'should not do anything' do
+        is_expected.to_not contain_class('octavia::api')
+      end
+    end
+
+    context 'with step 3 on bootstrap node' do
+      before do
+        params.merge!({
+          :step           => 3,
+          :bootstrap_node => 'node.example.com'
+        })
+      end
+
+      it 'should should start configurating database' do
+        is_expected.to_not contain_class('octavia::api')
+      end
+    end
+
+    context 'with step 3 on non-bootstrap node' do
+      before do
+        params.merge!({ :step => 3 })
+      end
+
+      it 'should do nothing' do
+        is_expected.to_not contain_class('octavia::api')
+      end
+    end
+
+    context 'with step 4 on bootstrap node' do
+      before do
+        params.merge!({
+          :step           => 4,
+          :bootstrap_node => 'node.example.com'
+        })
+      end
+
+      it 'should should sync database' do
+        is_expected.to contain_class('octavia::api').with(:sync_db => true)
+      end
+    end
+
+    context 'with step 4 on non-bootstrap node' do
+      before do
+        params.merge!({ :step => 4 })
+      end
+
+      it 'should do nothing' do
+        is_expected.to_not contain_class('octavia::api')
+      end
+    end
+
+    context 'with step 5 on non-bootstrap node' do
+      before do
+        params.merge!({ :step => 5 })
+      end
+
+      it 'should do nothing' do
+        is_expected.to contain_class('octavia::api').with(:sync_db => false)
+      end
+    end
+  end
+
+  on_supported_os.each do |os, facts|
+    context "on #{os}" do
+      let(:facts) do
+        facts.merge({ :hostname => 'node.example.com' })
+      end
+      it_behaves_like 'tripleo::profile::base::octavia::api'
+    end
+  end
+end
+
diff --git a/spec/classes/tripleo_profile_base_octavia_spec.rb b/spec/classes/tripleo_profile_base_octavia_spec.rb
new file mode 100644 (file)
index 0000000..89820ef
--- /dev/null
@@ -0,0 +1,119 @@
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# 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.
+#
+
+require 'spec_helper'
+
+describe 'tripleo::profile::base::octavia' do
+
+  let :params do
+    { :rabbit_hosts => ['some.server.com'],
+      :step         => 5
+    }
+  end
+
+  shared_examples_for 'tripleo::profile::base::octavia' do
+
+    context 'with step less than 3' do
+      before do
+        params.merge!({ :step => 2 })
+      end
+
+      it 'should not do anything' do
+        is_expected.to_not contain_class('octavia')
+        is_expected.to_not contain_class('octavia::config')
+      end
+    end
+
+    context 'with step 3' do
+      before do
+        params.merge!({ :step => 3 })
+      end
+
+      it 'should provide basic initialization' do
+        is_expected.to contain_class('octavia').with(
+          :default_transport_url => 'rabbit://some.server.com:5672/'
+        )
+        is_expected.to contain_class('octavia::config')
+      end
+    end
+
+    context 'with multiple hosts' do
+      before do
+        params.merge!({ :rabbit_hosts => ['some.server.com', 'someother.server.com'] })
+      end
+
+      it 'should construct a multihost URL' do
+        is_expected.to contain_class('octavia').with(
+          :default_transport_url => 'rabbit://some.server.com:5672,someother.server.com:5672/'
+        )
+      end
+    end
+
+    context 'with username provided' do
+      before do
+        params.merge!({ :rabbit_user => 'bunny' })
+      end
+
+      it 'should construct URL with username' do
+        is_expected.to contain_class('octavia').with(
+          :default_transport_url => 'rabbit://bunny@some.server.com:5672/'
+        )
+      end
+    end
+
+    context 'with username and password provided' do
+      before do
+        params.merge!(
+          { :rabbit_user      => 'bunny',
+            :rabbit_password  => 'carrot'
+          }
+        )
+      end
+
+      it 'should construct URL with username and password' do
+        is_expected.to contain_class('octavia').with(
+          :default_transport_url => 'rabbit://bunny:carrot@some.server.com:5672/'
+        )
+      end
+    end
+
+    context 'with multiple hosts and user info provided' do
+      before do
+        params.merge!(
+          { :rabbit_hosts     => ['some.server.com', 'someother.server.com'],
+            :rabbit_user      => 'bunny',
+            :rabbit_password  => 'carrot'
+          }
+        )
+      end
+
+      it 'should distributed user info across hosts URL' do
+        is_expected.to contain_class('octavia').with(
+          :default_transport_url => 'rabbit://bunny:carrot@some.server.com:5672,bunny:carrot@someother.server.com:5672/'
+        )
+      end
+    end
+  end
+
+  on_supported_os.each do |os, facts|
+    context "on #{os}" do
+      let(:facts) do
+        facts.merge({})
+      end
+      it_behaves_like 'tripleo::profile::base::octavia'
+    end
+  end
+end