Skip to content

Commit

Permalink
(#469) Assign correct environment to node groups (#479)
Browse files Browse the repository at this point in the history
This checks if a user configured a environment in pe.conf. If that's the
case, it will be used for the PEADM-specific node groups. Otherwise we
fall back to production.

This fixes a timing issue discovered in #469. In situations where the PE
infra isn't running in production, we cannot assume that a production
environment exists. And a node group can only reference classes from the
environment the node group belongs to.
  • Loading branch information
bastelfreak authored Aug 29, 2024
1 parent ab9db39 commit e6092ff
Show file tree
Hide file tree
Showing 14 changed files with 186 additions and 13 deletions.
55 changes: 55 additions & 0 deletions REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
* [`peadm::file_or_content`](#peadm--file_or_content)
* [`peadm::flatten_compact`](#peadm--flatten_compact)
* [`peadm::generate_pe_conf`](#peadm--generate_pe_conf): Generate a pe.conf file in JSON format
* [`peadm::get_node_group_environment`](#peadm--get_node_group_environment): check if a custom PE environment is set in pe.conf
* [`peadm::get_pe_conf`](#peadm--get_pe_conf)
* [`peadm::get_targets`](#peadm--get_targets): Accept undef or a SingleTargetSpec, and return an Array[Target, 1, 0]. This differs from get_target() in that: - It returns an Array[Target
* [`peadm::migration_opts_default`](#peadm--migration_opts_default)
Expand Down Expand Up @@ -715,6 +716,24 @@ Data type: `Hash`
A hash of settings to set in the config file. Any keys that are set to
undef will not be included in the config file.

### <a name="peadm--get_node_group_environment"></a>`peadm::get_node_group_environment`

Type: Puppet Language

check if a custom PE environment is set in pe.conf

#### `peadm::get_node_group_environment(Peadm::SingleTargetSpec $primary)`

The peadm::get_node_group_environment function.

Returns: `String` the desired environment for PE specific node groups

##### `primary`

Data type: `Peadm::SingleTargetSpec`

the FQDN for the primary, here we will read the pe.conf from

### <a name="peadm--get_pe_conf"></a>`peadm::get_pe_conf`

Type: Puppet Language
Expand Down Expand Up @@ -1563,11 +1582,20 @@ The peadm::add_database class.

The following parameters are available in the `peadm::add_database` plan:

* [`node_group_environment`](#-peadm--add_database--node_group_environment)
* [`targets`](#-peadm--add_database--targets)
* [`primary_host`](#-peadm--add_database--primary_host)
* [`mode`](#-peadm--add_database--mode)
* [`begin_at_step`](#-peadm--add_database--begin_at_step)

##### <a name="-peadm--add_database--node_group_environment"></a>`node_group_environment`

Data type: `String[1]`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

Default value: `peadm::get_node_group_environment($primary_host)`

##### <a name="-peadm--add_database--targets"></a>`targets`

Data type: `Peadm::SingleTargetSpec`
Expand Down Expand Up @@ -1692,6 +1720,7 @@ management using PEAdm.

The following parameters are available in the `peadm::convert` plan:

* [`node_group_environment`](#-peadm--convert--node_group_environment)
* [`primary_host`](#-peadm--convert--primary_host)
* [`replica_host`](#-peadm--convert--replica_host)
* [`compiler_hosts`](#-peadm--convert--compiler_hosts)
Expand All @@ -1703,6 +1732,14 @@ The following parameters are available in the `peadm::convert` plan:
* [`dns_alt_names`](#-peadm--convert--dns_alt_names)
* [`begin_at_step`](#-peadm--convert--begin_at_step)

##### <a name="-peadm--convert--node_group_environment"></a>`node_group_environment`

Data type: `String[1]`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

Default value: `peadm::get_node_group_environment($primary_host)`

##### <a name="-peadm--convert--primary_host"></a>`primary_host`

Data type: `Peadm::SingleTargetSpec`
Expand Down Expand Up @@ -1805,6 +1842,7 @@ The following parameters are available in the `peadm::install` plan:
* [`final_agent_state`](#-peadm--install--final_agent_state)
* [`stagingdir`](#-peadm--install--stagingdir)
* [`uploaddir`](#-peadm--install--uploaddir)
* [`node_group_environment`](#-peadm--install--node_group_environment)
* [`primary_host`](#-peadm--install--primary_host)
* [`replica_host`](#-peadm--install--replica_host)
* [`compiler_hosts`](#-peadm--install--compiler_hosts)
Expand Down Expand Up @@ -1904,6 +1942,14 @@ for offline usage.

Default value: `undef`

##### <a name="-peadm--install--node_group_environment"></a>`node_group_environment`

Data type: `String[1]`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

Default value: `peadm::get_node_group_environment($primary_host)`

##### <a name="-peadm--install--primary_host"></a>`primary_host`

Data type: `Peadm::SingleTargetSpec`
Expand Down Expand Up @@ -2277,6 +2323,7 @@ The following parameters are available in the `peadm::upgrade` plan:
* [`r10k_known_hosts`](#-peadm--upgrade--r10k_known_hosts)
* [`stagingdir`](#-peadm--upgrade--stagingdir)
* [`uploaddir`](#-peadm--upgrade--uploaddir)
* [`node_group_environment`](#-peadm--upgrade--node_group_environment)
* [`primary_host`](#-peadm--upgrade--primary_host)
* [`replica_host`](#-peadm--upgrade--replica_host)
* [`compiler_hosts`](#-peadm--upgrade--compiler_hosts)
Expand Down Expand Up @@ -2366,6 +2413,14 @@ for offline usage.

Default value: `'/tmp'`

##### <a name="-peadm--upgrade--node_group_environment"></a>`node_group_environment`

Data type: `String[1]`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

Default value: `peadm::get_node_group_environment($primary_host)`

##### <a name="-peadm--upgrade--primary_host"></a>`primary_host`

Data type: `Peadm::SingleTargetSpec`
Expand Down
33 changes: 33 additions & 0 deletions functions/get_node_group_environment.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#
# @summary check if a custom PE environment is set in pe.conf
#
# @param primary the FQDN for the primary, here we will read the pe.conf from
#
# @return [String] the desired environment for PE specific node groups
#
# @see https://www.puppet.com/docs/pe/latest/upgrade_pe#update_environment
#
# @author Tim Meusel <[email protected]>
#
function peadm::get_node_group_environment(Peadm::SingleTargetSpec $primary) {
$peconf = peadm::get_pe_conf(get_target($primary))
# if both are set, they need to be set to the same value
# if they are not set, we assume that the user runs their infra in production
$pe_install = $peconf['pe_install::install::classification::pe_node_group_environment']
$puppet_enterprise = $peconf['puppet_enterprise::master::recover_configuration::pe_environment']

# check if both are equal
# This also evaluates to true if both are undef
if $pe_install == $puppet_enterprise {
# check if the option isn't undef
# ToDo: A proper regex for allowed characters in an environment would be nice
# https://github.com/puppetlabs/puppet-docs/issues/1158
if $pe_install =~ String[1] {
return $pe_install
} else {
return 'production'
}
} else {
fail("pe_install::install::classification::pe_node_group_environment and puppet_enterprise::master::recover_configuration::pe_environment need to be set to the same value, not '${pe_install}' and '${puppet_enterprise}'")
}
}
3 changes: 3 additions & 0 deletions manifests/setup/node_manager.pp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
# A load balancer address directing traffic to any of the "B" pool
# compilers. This is used for DR configuration in large and extra large
# architectures.
# @param node_group_environment the environment that will be assigned to all the PE Infra node groups
#
class peadm::setup::node_manager (
String[1] $primary_host,
Expand All @@ -36,6 +37,7 @@
Optional[String[1]] $compiler_pool_address = undef,
Optional[String[1]] $internal_compiler_a_pool_address = $server_a_host,
Optional[String[1]] $internal_compiler_b_pool_address = $server_b_host,
String[1] $node_group_environment = 'production',
) {
# "Not-configured" placeholder string. This will be used in places where we
# cannot set an explicit null, and need to supply some kind of value.
Expand All @@ -46,6 +48,7 @@
# else.
Node_group {
purge_behavior => none,
environment => $node_group_environment,
}

##################################################
Expand Down
20 changes: 13 additions & 7 deletions plans/add_database.pp
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::add_database(
Peadm::SingleTargetSpec $targets,
Peadm::SingleTargetSpec $primary_host,
Expand All @@ -9,6 +12,7 @@
'update-db-settings',
'cleanup-db',
'finalize']] $begin_at_step = undef,
String[1] $node_group_environment = peadm::get_node_group_environment($primary_host),
) {
$primary_target = peadm::get_targets($primary_host, 1)
$postgresql_target = peadm::get_targets($targets, 1)
Expand Down Expand Up @@ -91,7 +95,7 @@
run_plan('peadm::subplans::component_install', $postgresql_target,
primary_host => $primary_target,
avail_group_letter => $avail_group_letter,
role => 'puppet/puppetdb-database'
role => 'puppet/puppetdb-database',
)
}

Expand Down Expand Up @@ -128,15 +132,17 @@
$host = pick($a_host, $b_host)
out::verbose("In transitive state, setting classification to ${host}")
run_plan('peadm::util::update_classification', $primary_target,
postgresql_a_host => $host,
postgresql_b_host => $host,
peadm_config => $peadm_config
postgresql_a_host => $host,
postgresql_b_host => $host,
peadm_config => $peadm_config,
node_group_environment => $node_group_environment,
)
} else {
run_plan('peadm::util::update_classification', $primary_target,
postgresql_a_host => $avail_group_letter ? { 'A' => $postgresql_host, default => undef },
postgresql_b_host => $avail_group_letter ? { 'B' => $postgresql_host, default => undef },
peadm_config => $peadm_config
postgresql_a_host => $avail_group_letter ? { 'A' => $postgresql_host, default => undef },
postgresql_b_host => $avail_group_letter ? { 'B' => $postgresql_host, default => undef },
peadm_config => $peadm_config,
node_group_environment => $node_group_environment,
)
}
}
Expand Down
7 changes: 5 additions & 2 deletions plans/add_replica.pp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
# @param replica_host - The hostname and certname of the replica VM
# @param replica_postgresql_host - The hostname and certname of the host with the replica PE-PosgreSQL database.
# @param token_file - (optional) the token file in a different location than the default.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
# Can be a separate host in an XL architecture, or undef in Standard or Large.
plan peadm::add_replica(
# Standard or Large
Expand All @@ -21,6 +22,7 @@

# Common Configuration
Optional[String] $token_file = undef,
String[1] $node_group_environment = peadm::get_node_group_environment($primary_host),
) {
$primary_target = peadm::get_targets($primary_host, 1)
$replica_target = peadm::get_targets($replica_host, 1)
Expand Down Expand Up @@ -94,7 +96,8 @@
server_b_host => $replica_avail_group_letter ? { 'B' => $replica_host, default => undef },
internal_compiler_a_pool_address => $replica_avail_group_letter ? { 'A' => $replica_host, default => undef },
internal_compiler_b_pool_address => $replica_avail_group_letter ? { 'B' => $replica_host, default => undef },
peadm_config => $peadm_config
peadm_config => $peadm_config,
node_group_environment => $node_group_environment,
)

# Source list of files on Primary and synchronize to new Replica
Expand Down
6 changes: 6 additions & 0 deletions plans/convert.pp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
# This plan sets required certificate extensions on PE nodes, and configures
# the required PE node groups to make an existing cluster compatible with
# management using PEAdm.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::convert (
# Standard
Peadm::SingleTargetSpec $primary_host,
Expand All @@ -26,6 +29,8 @@
'modify-infra-certs',
'convert-node-groups',
'finalize']] $begin_at_step = undef,

String[1] $node_group_environment = peadm::get_node_group_environment($primary_host),
) {
peadm::assert_supported_bolt_version()

Expand Down Expand Up @@ -223,6 +228,7 @@
compiler_pool_address => $compiler_pool_address,
internal_compiler_a_pool_address => $internal_compiler_a_pool_address,
internal_compiler_b_pool_address => $internal_compiler_b_pool_address,
node_group_environment => $node_group_environment,
require => Class['peadm::setup::node_manager_yaml'],
}

Expand Down
4 changes: 4 additions & 0 deletions plans/install.pp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
# Directory the installer tarball will be uploaded to or expected to be in
# for offline usage.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::install (
# Standard
Peadm::SingleTargetSpec $primary_host,
Expand Down Expand Up @@ -73,6 +75,7 @@
Enum['direct', 'bolthost'] $download_mode = 'bolthost',
Boolean $permit_unsafe_versions = false,
String $token_lifetime = '1y',
String[1] $node_group_environment = peadm::get_node_group_environment($primary_host),
) {
peadm::assert_supported_bolt_version()

Expand Down Expand Up @@ -134,6 +137,7 @@
internal_compiler_b_pool_address => $internal_compiler_b_pool_address,
deploy_environment => $deploy_environment,
ldap_config => $ldap_config,
node_group_environment => $node_group_environment,

# Other
stagingdir => $stagingdir,
Expand Down
6 changes: 5 additions & 1 deletion plans/subplans/configure.pp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
# Configures the state the puppet agent should be in on infrastructure nodes
# after PE is configured successfully.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::subplans::configure (
# Standard
Peadm::SingleTargetSpec $primary_host,
Expand All @@ -42,7 +44,8 @@

# Other
String $stagingdir = '/tmp',
Enum['running', 'stopped'] $final_agent_state = 'running'
Enum['running', 'stopped'] $final_agent_state = 'running',
String[1] $node_group_environment = peadm::get_node_group_environment($primary_host),
) {
# TODO: get and validate PE version

Expand Down Expand Up @@ -102,6 +105,7 @@
compiler_pool_address => $compiler_pool_address,
internal_compiler_a_pool_address => $internal_compiler_a_pool_address,
internal_compiler_b_pool_address => $internal_compiler_b_pool_address,
node_group_environment => $node_group_environment,
require => Class['peadm::setup::node_manager_yaml'],
}
}
Expand Down
4 changes: 4 additions & 0 deletions plans/upgrade.pp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
# Directory the installer tarball will be uploaded to or expected to be in
# for offline usage.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::upgrade (
# Standard
Peadm::SingleTargetSpec $primary_host,
Expand Down Expand Up @@ -66,6 +68,7 @@
'upgrade-replica',
'upgrade-replica-compilers',
'finalize']] $begin_at_step = undef,
String[1] $node_group_environment = peadm::get_node_group_environment($primary_host),
) {
# Ensure input valid for a supported architecture
$arch = peadm::assert_supported_architecture(
Expand Down Expand Up @@ -326,6 +329,7 @@
compiler_pool_address => $compiler_pool_address,
internal_compiler_a_pool_address => $internal_compiler_a_pool_address,
internal_compiler_b_pool_address => $internal_compiler_b_pool_address,
node_group_environment => $node_group_environment,
require => Class['peadm::setup::node_manager_yaml'],
}
}
Expand Down
4 changes: 4 additions & 0 deletions plans/util/update_classification.pp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
#
# @summary Configure classification
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::util::update_classification (
# Standard
Peadm::SingleTargetSpec $targets,
String[1] $node_group_environment,
Optional[Hash] $peadm_config = undef,
Optional[Peadm::SingleTargetSpec] $server_a_host = undef,
Optional[Peadm::SingleTargetSpec] $server_b_host = undef,
Expand Down Expand Up @@ -76,6 +79,7 @@
compiler_pool_address => $new['params']['compiler_pool_address'],
internal_compiler_a_pool_address => $new['params']['internal_compiler_a_pool_address'],
internal_compiler_b_pool_address => $new['params']['internal_compiler_b_pool_address'],
node_group_environment => $node_group_environment,
require => Class['peadm::setup::node_manager_yaml'],
}
}
Expand Down
Loading

0 comments on commit e6092ff

Please sign in to comment.