Add swift ringbuilder profile
authorSteven Hardy <shardy@redhat.com>
Tue, 5 Jul 2016 17:23:28 +0000 (18:23 +0100)
committerSteven Hardy <shardy@redhat.com>
Thu, 14 Jul 2016 15:19:21 +0000 (16:19 +0100)
I think this will need refinement in future, but for now this is
just a copy of what we have in t-h-t

Change-Id: I427f0b5ee93a0870d43419009178e0690ac66bd6
Partially-Implements: blueprint refactor-puppet-manifests

manifests/profile/base/swift/add_devices.pp [new file with mode: 0644]
manifests/profile/base/swift/ringbuilder.pp [new file with mode: 0644]

diff --git a/manifests/profile/base/swift/add_devices.pp b/manifests/profile/base/swift/add_devices.pp
new file mode 100644 (file)
index 0000000..f61f418
--- /dev/null
@@ -0,0 +1,59 @@
+# Copyright 2015 Red Hat, Inc.
+# 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.
+# == Function: tripleo::profile::base::swift::add_devices
+#
+# Swift add_devices helper function
+#
+# === Parameters
+#
+# [*swift_zones*]
+#   (Optional) The number of swift zones.
+
+define tripleo::profile::base::swift::add_devices(
+  $swift_zones = '1'
+){
+
+  # NOTE(dprince): Swift zones is not yet properly wired into the Heat
+  # templates. See: https://review.openstack.org/#/c/97758/3
+  # For now our regex supports the r1z1-192.0.2.6:%PORT%/d1 syntax or the
+  # newer r1z%<controller or SwiftStorage><N>%-192.0.2.6:%PORT%/d1 syntax.
+  $server_num_or_device = regsubst($name,'^r1z%+[A-Za-z]*([0-9]+)%+-(.*)$','\1')
+  if (is_integer($server_num_or_device)) {
+    $server_num = $server_num_or_device
+  } else {
+    $server_num = '1'
+  }
+  # Function to place server in its zone.  Zone is calculated by
+  # server number in heat template modulo the number of zones + 1.
+  $zone = (($server_num%$swift_zones) + 1)
+
+  # add the rings
+  $base = regsubst($name,'^r1.*-(.*)$','\1')
+  $object = regsubst($base, '%PORT%', '6000')
+  ring_object_device { $object:
+    zone   => '1',
+    weight => 100,
+  }
+  $container = regsubst($base, '%PORT%', '6001')
+  ring_container_device { $container:
+    zone   => '1',
+    weight => 100,
+  }
+  $account = regsubst($base, '%PORT%', '6002')
+  ring_account_device { $account:
+    zone   => '1',
+    weight => 100,
+  }
+}
diff --git a/manifests/profile/base/swift/ringbuilder.pp b/manifests/profile/base/swift/ringbuilder.pp
new file mode 100644 (file)
index 0000000..d94c6be
--- /dev/null
@@ -0,0 +1,77 @@
+# Copyright 2015 Red Hat, Inc.
+# 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: tripleo::profile::base::swift::ringbuilder
+#
+# Swift ringbuilder profile for tripleo
+#
+# === Parameters
+#
+# [*step*]
+#   (Optional) The current step in deployment. See tripleo-heat-templates
+#   for more details.
+#   Defaults to hiera('step')
+#  [*swift_zones*]
+#   (Optional) The swift zones
+#   Defaults to 1
+#  [*devices*]
+#   (Optional) The swift devices
+#   Defaults to ''
+#  [*build_ring*]      = true,
+#   (Optional) Whether to build the ring
+#   Defaults to true
+#  [*replicas*]
+#    replicas
+
+class tripleo::profile::base::swift::ringbuilder (
+  $step = hiera('step'),
+  $swift_zones     = '1',
+  $devices         = '',
+  $build_ring      = true,
+  $replicas,
+) {
+
+  if $step >= 2 {
+    # pre-install swift here so we can build rings
+    include ::swift
+  }
+
+  if $step >= 3 {
+    validate_bool($build_ring)
+
+    if $build_ring {
+
+      $device_array = strip(split(rstrip($devices), ','))
+
+      # create local rings
+      swift::ringbuilder::create{ ['object', 'account', 'container']:
+        replicas       => min(count($device_array), $replicas),
+      } ->
+
+      # add all other devices
+      tripleo::profile::base::swift::add_devices {$device_array:
+        swift_zones => $swift_zones,
+      } ->
+
+      # rebalance
+      swift::ringbuilder::rebalance{ ['object', 'account', 'container']:
+        seed => 999,
+      }
+
+      Ring_object_device<| |> ~> Exec['rebalance_object']
+      Ring_object_device<| |> ~> Exec['rebalance_account']
+      Ring_object_device<| |> ~> Exec['rebalance_container']
+    }
+  }
+}