Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added plan to upgrade MongoDB #319

Merged
merged 2 commits into from
Oct 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
- `nginx_ssl_port`
- `nginx_ssl_protocols`
Contributed by @nmaludy

- Added a new plan `st2::upgrade_mongodb` that can be used to upgrade a standalone MongoDB
database between versions. (Feature)
Contributed by @nmaludy

## 1.7.0 (Jun 26, 2020)

Expand Down
124 changes: 123 additions & 1 deletion REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ by the user is greater than or equal to <code>$version</code>.
* [`rule_list`](#rule_list): Return a list of rules.
* [`run`](#run): Runs a StackStorm action

**Plans**

* [`st2::upgrade_mongodb`](#st2upgrade_mongodb): Upgrades a standalone MongoDB database between versions.

## Classes

### st2
Expand Down Expand Up @@ -1916,6 +1920,14 @@ StackStorm compatible installation of nginx and dependencies.
include st2::profile::nginx
```

##### Disable managing the nginx repo so you can manage it yourself

```puppet
class { 'st2::profile::nginx':
manage_repo => false,
}
```

#### Parameters

The following parameters are available in the `st2::profile::nginx` class.
Expand Down Expand Up @@ -2451,7 +2463,7 @@ Data type: `St2::Repository`

Release repository to enable

Default value: 'stable'
Default value: $st2::repository

### st2::repo::apt

Expand Down Expand Up @@ -3650,3 +3662,113 @@ Data type: `Optional[String]`

Password to use for StackStorm authentication.

## Plans

### st2::upgrade_mongodb

The default upgrade for this plan goes from 3.4 to 3.6 and ultimately to 4.0

High level steps:
- stop stackstorm
## https://docs.mongodb.com/manual/release-notes/3.6-upgrade-standalone/
- set MongoDB feature compatibility to 3.4
- change Yum repo to 3.6
nmaludy marked this conversation as resolved.
Show resolved Hide resolved
- upgrade packages
- set MongoDB feature compatibility to 3.6
## https://docs.mongodb.com/manual/release-notes/4.0-upgrade-standalone/
- change Yum repo to 4.0
- upgrade packages
- set MongoDB feature compatibility to 4.0
- start stackstorm

#### Examples

##### Basic usage

```puppet
bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx"}'
```

##### Upgrading enterprise packages

```puppet
bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx", "mongo_packages": ["mongodb-enterprise-server", "mongodb-enterprise-shell", "mongodb-enterprise-tools"], "mongo_edition": "enterprise"}'
```

##### Upgrading from 3.6 to 4.0

```puppet
bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx", "upgrade_version_start": "3.6", "upgrade_version_path": ["4.0"]}'
```

##### Upgrading from 3.4 to 3.6 to 4.0

```puppet
bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx", "upgrade_version_start": "3.4", "upgrade_version_path": ["3.6", "4.0"]}'
```

#### Parameters

The following parameters are available in the `st2::upgrade_mongodb` plan.

##### `targets`

Data type: `TargetSpec`

Set of targets (MongoDB hosts) that this plan will be executed on.

##### `mongo_admin_db`

Data type: `String`

Name of the admin database for MongoDB

Default value: 'admin'

##### `mongo_username`

Data type: `String`

Name of the admin user on the admin database

Default value: 'admin'

##### `mongo_password`

Data type: `String`

Password of the admin user on the admin database

##### `mongo_packages`

Data type: `Array[String]`

List of MongoDB packages that will be upgraded

Default value: ['mongodb-org-server', 'mongodb-org-shell', 'mongodb-org-tools']

##### `mongo_edition`

Data type: `Enum['enterprise', 'org']`

What edition of MongoDB should be setup from a repo perspective,
either 'org' for community edition, or 'enterprise' for enterprise edition.

Default value: 'org'

##### `upgrade_version_start`

Data type: `String`

Version of MongoDB that the database is currently on, ie. where we are starting from.

Default value: '3.4'

##### `upgrade_version_path`

Data type: `Array[String]`

List of versions that we will upgrade through along our path to success!

Default value: ['3.6', '4.0']

2 changes: 1 addition & 1 deletion manifests/profile/nginx.pp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# @example Basic Usage
# include st2::profile::nginx
#
# @example Disable manging the nginx repo so you can manage it yourself
# @example Disable managing the nginx repo so you can manage it yourself
# class { 'st2::profile::nginx':
# manage_repo => false,
# }
Expand Down
4 changes: 2 additions & 2 deletions manifests/repo.pp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
#
class st2::repo (
Enum['present', 'absent'] $ensure = 'present',
St2::Repository $repository = 'stable',
) {
St2::Repository $repository = $st2::repository,
) inherits st2 {
case $facts['os']['family'] {
'RedHat': {
# RedHat distros need EPEL
Expand Down
172 changes: 172 additions & 0 deletions plans/upgrade_mongodb.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
# @summary Upgrades a standalone MongoDB database between versions.
# The default upgrade for this plan goes from 3.4 to 3.6 and ultimately to 4.0
#
# High level steps:
# - stop stackstorm
# ## https://docs.mongodb.com/manual/release-notes/3.6-upgrade-standalone/
# - set MongoDB feature compatibility to 3.4
# - change package repo to 3.6
# - upgrade packages
# - set MongoDB feature compatibility to 3.6
# ## https://docs.mongodb.com/manual/release-notes/4.0-upgrade-standalone/
# - change package repo to 4.0
# - upgrade packages
# - set MongoDB feature compatibility to 4.0
# - start stackstorm
#
# @param [TargetSpec] targets
# Set of targets (MongoDB hosts) that this plan will be executed on.
#
# @param [String] mongo_admin_db
# Name of the admin database for MongoDB
#
# @param [String] mongo_username
# Name of the admin user on the admin database
#
# @param [String] mongo_password
# Password of the admin user on the admin database
#
# @param [Array[String]] mongo_packages
# List of MongoDB packages that will be upgraded
#
# @param [Enum['enterprise', 'org']] mongo_edition
# What edition of MongoDB should be setup from a repo perspective,
# either 'org' for community edition, or 'enterprise' for enterprise edition.
#
# @param [String] upgrade_version_start
# Version of MongoDB that the database is currently on, ie. where we are starting from.
#
# @param [Array[String]] upgrade_version_path
# List of versions that we will upgrade through along our path to success!
#
# @example Basic usage
# bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx"}'
#
# @example Upgrading enterprise packages
# bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx", "mongo_packages": ["mongodb-enterprise-server", "mongodb-enterprise-shell", "mongodb-enterprise-tools"], "mongo_edition": "enterprise"}'
#
# @example Upgrading from 3.6 to 4.0
# bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx", "upgrade_version_start": "3.6", "upgrade_version_path": ["4.0"]}'
#
# @example Upgrading from 3.4 to 3.6 to 4.0
# bolt plan run st2::upgrade_mongodb --targets ssh_nodes --params '{"mongo_password": "xxx", "upgrade_version_start": "3.4", "upgrade_version_path": ["3.6", "4.0"]}'
#
plan st2::upgrade_mongodb (
String $mongo_admin_db = 'admin',
String $mongo_username = 'admin',
String $mongo_password,
Array[String] $mongo_packages = ['mongodb-org-server', 'mongodb-org-shell', 'mongodb-org-tools'],
Enum['enterprise', 'org'] $mongo_edition = 'org',
String $upgrade_version_start = '3.4',
Array[String] $upgrade_version_path = ['3.6', '4.0'],
TargetSpec $targets,
) {
# stop stackstorm
run_command('st2ctl stop', $targets)

$mongo_cmd = "mongo ${mongo_admin_db} --username ${mongo_username} --password ${mongo_password} --quiet"

# set MongoDB feature compatibility to 3.4
$start_ver = $upgrade_version_start
run_command("${mongo_cmd} --eval \"db.adminCommand( { setFeatureCompatibilityVersion: '${start_ver}' } )\"",
$targets,
"Mongodb - Set Feature Compatibility Version ${start_ver}")

# gather facts on the targets so that we can determine RHEL/CentOS vs Ubuntu
run_plan('facts', $targets)

$upgrade_version_path.each |$ver| {
# Change Yum repo to this version
apply($targets) {
if $mongo_edition == 'enterprise' {
$repo_domain = 'repo.mongodb.com'
$repo_path = 'mongodb-enterprise'
} else {
$repo_domain = 'repo.mongodb.org'
$repo_path = 'mongodb-org'
}

if ($facts['os']['family'] == 'RedHat') {
yumrepo { 'mongodb':
descr => 'MongoDB Repository',
baseurl => "https://${repo_domain}/yum/redhat/\$releasever/${repo_path}/${ver}/\$basearch/",
gpgcheck => '0',
enabled => '1',
notify => Exec['yum_clean_all'],
}

# rebuild yum cache since we just changed repositories
exec { 'yum_clean_all':
command => '/usr/bin/yum clean all',
refreshonly => true,
notify => Exec['yum_makecache_fast'],
}
exec { 'yum_makecache_fast':
command => '/usr/bin/yum makecache fast',
refreshonly => true,
}
}
else {
$location = $facts['os']['name'] ? {
'Debian' => "https://${repo_domain}/apt/debian",
'Ubuntu' => "https://${repo_domain}/apt/ubuntu",
default => undef
}
$release = "${facts['os']['distro']['codename']}/${repo_path}/${ver}"
$repos = $facts['os']['name'] ? {
'Debian' => 'main',
'Ubuntu' => 'multiverse',
default => undef
}
$key = $ver ? {
'4.4' => '20691EEC35216C63CAF66CE1656408E390CFB1F5',
'4.2' => 'E162F504A20CDF15827F718D4B7C549A058F8B6B',
'4.0' => '9DA31620334BD75D9DCB49F368818C72E52529D4',
'3.6' => '2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5',
'3.4' => '0C49F3730359A14518585931BC711F9BA15703C6',
'3.2' => '42F3E95A2C4F08279C4960ADD68FA50FEA312927',
default => '492EAFE8CD016A07919F1D2B9ECBEC467F0CEB10'
}
$key_server = 'hkp://keyserver.ubuntu.com:80'

apt::source { 'mongodb':
location => $location,
release => $release,
repos => $repos,
key => {
'id' => $key,
'server' => $key_server,
},
notify => Exec['apt-get-clean'],
}

# rebuild apt cache since we just changed repositories
exec { 'apt-get-clean':
command => '/usr/bin/apt-get -y clean',
refreshonly => true,
notify => Exec['apt-get-update'],
}
exec { 'apt-get-update':
command => '/usr/bin/apt-get -y update',
refreshonly => true,
}
}
}


# Upgrade packages
$mongo_packages.each |$package| {
run_task('package::linux', $targets,
name => $package,
action => 'upgrade')
}

# Set compatibility level to this version
run_command("${mongo_cmd} --eval \"db.adminCommand( { setFeatureCompatibilityVersion: '${ver}' } )\"",
$targets,
"Mongodb - Set Feature Compatibility Version ${ver}")
}

# start stackstorm
run_command('st2ctl start', $targets)
}