From bbac058ade8934bea04993888f4ae223ea599cfd Mon Sep 17 00:00:00 2001 From: Tao Liu Date: Mon, 1 Jul 2019 22:43:34 -0400 Subject: [PATCH] ANSIBLE Bootstrap changes for System Controller This update contains the following misc. config changes to support ansible bootstrap for system controller. Creates deps model for dcmanager and dcorch puppet modules. Creates a system controller postgres run time manifest which is applied upon the creation of initial controller host or replay after the distributed cloud role has been changed. The patch_vault file system is created during the first controller unlocked. And allows the dc role to be modified during bootstrap. Change-Id: Id7b416274b2a854c469bfdca7448bf1ddea639d7 Story: 2004766 Task: 35650 Signed-off-by: Tao Liu --- .../modules/openstack/manifests/keystone.pp | 1 + .../modules/platform/manifests/dcmanager.pp | 12 ++++++ .../src/modules/platform/manifests/dcorch.pp | 13 ++++++ .../src/modules/platform/manifests/drbd.pp | 4 +- .../modules/platform/manifests/postgresql.pp | 29 +++++++++++++ .../src/dcmanager/manifests/api.pp | 22 +++------- .../src/dcmanager/manifests/client.pp | 2 + .../src/dcmanager/manifests/db/postgresql.pp | 8 ++-- .../src/dcmanager/manifests/db/sync.pp | 12 +++++- .../src/dcmanager/manifests/deps.pp | 25 +++++++++++ .../src/dcmanager/manifests/init.pp | 3 +- .../src/dcmanager/manifests/manager.pp | 9 ++-- .../src/dcorch/manifests/api_proxy.pp | 24 +++-------- .../src/dcorch/manifests/client.pp | 2 + .../src/dcorch/manifests/db/postgresql.pp | 8 ++-- .../src/dcorch/manifests/db/sync.pp | 12 +++++- .../src/dcorch/manifests/deps.pp | 29 +++++++++++++ .../src/dcorch/manifests/engine.pp | 9 ++-- .../src/dcorch/manifests/init.pp | 5 +-- .../src/dcorch/manifests/snmp.pp | 9 ++-- .../sysinv/sysinv/api/controllers/v1/host.py | 6 +++ .../api/controllers/v1/interface_network.py | 2 +- .../sysinv/api/controllers/v1/system.py | 36 ++++++++++++---- .../sysinv/sysinv/sysinv/conductor/manager.py | 41 +++++++++++++++++++ .../sysinv/sysinv/sysinv/conductor/rpcapi.py | 13 ++++++ 25 files changed, 259 insertions(+), 77 deletions(-) create mode 100644 puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/deps.pp create mode 100644 puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/deps.pp diff --git a/puppet-manifests/src/modules/openstack/manifests/keystone.pp b/puppet-manifests/src/modules/openstack/manifests/keystone.pp index 4b922b5d38..6d092273f4 100644 --- a/puppet-manifests/src/modules/openstack/manifests/keystone.pp +++ b/puppet-manifests/src/modules/openstack/manifests/keystone.pp @@ -344,6 +344,7 @@ class openstack::keystone::endpoint::runtime { if $::platform::params::distributed_cloud_role =='systemcontroller' { include ::dcorch::keystone::auth include ::dcmanager::keystone::auth + include ::dcdbsync::keystone::auth } include ::smapi::keystone::auth diff --git a/puppet-manifests/src/modules/platform/manifests/dcmanager.pp b/puppet-manifests/src/modules/platform/manifests/dcmanager.pp index 6f32803ea0..f6460d296f 100644 --- a/puppet-manifests/src/modules/platform/manifests/dcmanager.pp +++ b/puppet-manifests/src/modules/platform/manifests/dcmanager.pp @@ -61,9 +61,21 @@ class platform::dcmanager::api class { '::dcmanager::api': bind_host => $api_host, + sync_db => $::platform::params::init_database, } include ::platform::dcmanager::haproxy } } + +class platform::dcmanager::runtime { + if $::platform::params::distributed_cloud_role == 'systemcontroller' { + include ::platform::amqp::params + include ::dcmanager + include ::dcmanager::db::postgresql + class { '::dcmanager::api': + sync_db => str2bool($::is_standalone_controller), + } + } +} diff --git a/puppet-manifests/src/modules/platform/manifests/dcorch.pp b/puppet-manifests/src/modules/platform/manifests/dcorch.pp index 3ea5d87d72..213bcfe7eb 100644 --- a/puppet-manifests/src/modules/platform/manifests/dcorch.pp +++ b/puppet-manifests/src/modules/platform/manifests/dcorch.pp @@ -130,9 +130,22 @@ class platform::dcorch::api_proxy class { '::dcorch::api_proxy': bind_host => $api_host, + sync_db => $::platform::params::init_database, } include ::platform::dcorch::firewall include ::platform::dcorch::haproxy } } + +class platform::dcorch::runtime { + if $::platform::params::distributed_cloud_role == 'systemcontroller' { + include ::platform::amqp::params + include ::dcorch + include ::dcorch::db::postgresql + + class { '::dcorch::api_proxy': + sync_db => str2bool($::is_standalone_controller), + } + } +} diff --git a/puppet-manifests/src/modules/platform/manifests/drbd.pp b/puppet-manifests/src/modules/platform/manifests/drbd.pp index 4eca538358..15c3fe32a5 100644 --- a/puppet-manifests/src/modules/platform/manifests/drbd.pp +++ b/puppet-manifests/src/modules/platform/manifests/drbd.pp @@ -254,7 +254,7 @@ class platform::drbd::patch_vault::params ( $service_enabled = false, $device = '/dev/drbd6', $lv_name = 'patch-vault-lv', - $lv_size = '1', + $lv_size = '8', $mountpoint = '/opt/patch-vault', $port = '7794', $resource_name = 'drbd-patch-vault', @@ -264,7 +264,7 @@ class platform::drbd::patch_vault::params ( class platform::drbd::patch_vault ( ) inherits ::platform::drbd::patch_vault::params { - if str2bool($::is_initial_config_primary) { + if str2bool($::is_standalone_controller) { $drbd_primary = true $drbd_initial = true $drbd_automount = true diff --git a/puppet-manifests/src/modules/platform/manifests/postgresql.pp b/puppet-manifests/src/modules/platform/manifests/postgresql.pp index 56e27b000b..d82e5a9ed3 100644 --- a/puppet-manifests/src/modules/platform/manifests/postgresql.pp +++ b/puppet-manifests/src/modules/platform/manifests/postgresql.pp @@ -204,3 +204,32 @@ class platform::postgresql::upgrade include ::fm::db::postgresql } +class platform::postgresql::sc::configured { + + file { '/etc/platform/.sc_database_configured': + ensure => present, + owner => 'root', + group => 'root', + mode => '0644', + } +} + +class platform::postgresql::sc::runtime + inherits ::platform::postgresql::params { + class {'::postgresql::globals': + datadir => $data_dir, + confdir => $config_dir, + needs_initdb => false, + } + + -> class {'::postgresql::server': + } + + include ::platform::dcmanager::runtime + include ::platform::dcorch::runtime + + class {'::platform::postgresql::sc::configured': + stage => post + } +} + diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/api.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/api.pp index e43f52062c..31e0d08f53 100644 --- a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/api.pp +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/api.pp @@ -99,20 +99,18 @@ class dcmanager::api ( $service_port = '5000', $package_ensure = 'latest', $bind_host = '0.0.0.0', - $enabled = false + $enabled = false, + $sync_db = false, ) { include dcmanager::params - - Dcmanager_config<||> ~> Service['dcmanager-api'] - Dcmanager_config<||> ~> Exec['dcmanager-dbsync'] + include dcmanager::deps if $::dcmanager::params::api_package { - Package['dcmanager'] -> Dcmanager_config<||> - Package['dcmanager'] -> Service['dcmanager-api'] package { 'dcmanager': ensure => $package_ensure, name => $::dcmanager::params::api_package, + tag => 'dcmanager-package', } } @@ -194,15 +192,7 @@ class dcmanager::api ( } Keystone_endpoint<||> -> Service['dcmanager-api'] - exec { 'dcmanager-dbsync': - command => $::dcmanager::params::db_sync_command, - path => '/usr/bin', - refreshonly => true, - logoutput => 'on_failure', - require => Package['dcmanager'], - # Only do the db sync if both controllers are running the same software - # version. Avoids impacting mate controller during an upgrade. - onlyif => "test ${::controller_sw_versions_match} = true", + if $sync_db { + include ::dcmanager::db::sync } - } diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/client.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/client.pp index 30e50302dd..7cd0f05249 100644 --- a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/client.pp +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/client.pp @@ -22,9 +22,11 @@ class dcmanager::client( ) { include dcmanager::params + include dcmanager::deps package { 'dcmanagerclient': ensure => $package_ensure, name => $::dcmanager::params::client_package, + tag => 'dcmanager-package', } } diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/postgresql.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/postgresql.pp index 2ef94a630e..7a4dcc98c4 100644 --- a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/postgresql.pp +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/postgresql.pp @@ -40,6 +40,8 @@ class dcmanager::db::postgresql( $privileges = 'ALL', ) { + include dcmanager::deps + ::openstacklib::db::postgresql { 'dcmanager': password_hash => postgresql_password($user, $password), dbname => $dbname, @@ -48,7 +50,7 @@ class dcmanager::db::postgresql( privileges => $privileges, } - ::Openstacklib::Db::Postgresql['dcmanager'] ~> Service <| title == 'dcmanager-api' |> - ::Openstacklib::Db::Postgresql['dcmanager'] ~> Service <| title == 'dcmanager-manager' |> - ::Openstacklib::Db::Postgresql['dcmanager'] ~> Exec <| title == 'dcmanager-dbsync' |> + Anchor['dcmanager::db::begin'] + ~> Class['dcmanager::db::postgresql'] + ~> Anchor['dcmanager::db::end'] } diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/sync.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/sync.pp index 2b338cce14..e8e08c98ba 100644 --- a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/sync.pp +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/db/sync.pp @@ -10,12 +10,22 @@ class dcmanager::db::sync { include dcmanager::params + include dcmanager::deps exec { 'dcmanager-dbsync': command => $::dcmanager::params::db_sync_command, path => '/usr/bin', refreshonly => true, - require => [File[$::dcmanager::params::dcmanager_conf], Class['dcmanager']], logoutput => 'on_failure', + subscribe => [ + Anchor['dcmanager::install::end'], + Anchor['dcmanager::config::end'], + Anchor['dcmanager::db::end'], + Anchor['dcmanager::dbsync::begin'] + ], + notify => Anchor['dcmanager::dbsync::end'], + # Only do the db sync if both controllers are running the same software + # version. Avoids impacting mate controller during an upgrade. + onlyif => "test ${::controller_sw_versions_match} = true", } } diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/deps.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/deps.pp new file mode 100644 index 0000000000..6aa77eb808 --- /dev/null +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/deps.pp @@ -0,0 +1,25 @@ +# == Class: dcmanager::deps +# +# dcmanager anchors and dependency management +# +class dcmanager::deps { + anchor { 'dcmanager::install::begin': } + -> Package<| tag == 'dcmanager-package'|> + ~> anchor { 'dcmanager::install::end': } + -> anchor { 'dcmanager::config::begin': } + -> Dcmanager_config<||> + ~> anchor { 'dcmanager::config::end': } + -> anchor { 'dcmanager::db::begin': } + -> anchor { 'dcmanager::db::end': } + ~> anchor { 'dcmanager::dbsync::begin': } + -> anchor { 'dcmanager::dbsync::end': } + ~> anchor { 'dcmanager::service::begin': } + ~> Service<| tag == 'dcmanager-service' |> + ~> anchor { 'dcmanager::service::end': } + + Oslo::Db<||> -> Anchor['dcmanager::dbsync::begin'] + + # Installation or config changes will always restart services. + Anchor['dcmanager::install::end'] ~> Anchor['dcmanager::service::begin'] + Anchor['dcmanager::config::end'] ~> Anchor['dcmanager::service::begin'] +} diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/init.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/init.pp index c692cb4766..c6d6e64ea6 100644 --- a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/init.pp +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/init.pp @@ -45,8 +45,7 @@ class dcmanager ( ) { include dcmanager::params - - Package['dcmanager'] -> Dcmanager_config<||> + include dcmanager::deps # this anchor is used to simplify the graph between dcmanager components by # allowing a resource to serve as a point where the configuration of dcmanager begins diff --git a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/manager.pp b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/manager.pp index 5b304fb0ec..ce35ce87f5 100644 --- a/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/manager.pp +++ b/puppet-modules-wrs/puppet-dcmanager/src/dcmanager/manifests/manager.pp @@ -14,15 +14,13 @@ class dcmanager::manager ( ) { include dcmanager::params - - Dcmanager_config<||> ~> Service['dcmanager-manager'] + include dcmanager::deps if $::dcmanager::params::manager_package { - Package['dcmanager-manager'] -> Dcmanager_config<||> - Package['dcmanager-manager'] -> Service['dcmanager-manager'] package { 'dcmanager-manager': ensure => $package_ensure, name => $::dcmanager::params::manager_package, + tag => 'dcmanager-package', } } @@ -38,7 +36,6 @@ class dcmanager::manager ( enable => $enabled, hasstatus => false, require => Package['dcmanager'], + tag => 'dcmanager-service', } - - Exec<| title == 'dcmanager-dbsync' |> -> Service['dcmanager-manager'] } diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/api_proxy.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/api_proxy.pp index 90c2487195..5fbca812a5 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/api_proxy.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/api_proxy.pp @@ -99,22 +99,18 @@ class dcorch::api_proxy ( $service_port = '5000', $package_ensure = 'latest', $bind_host = '0.0.0.0', - $enabled = false + $enabled = false, + $sync_db = false, ) { include dcorch::params - - Dcorch_config<||> ~> Service['dcorch-api-proxy'] - Dcorch_config<||> ~> Exec['dcorch-dbsync'] - Dcorch_api_paste_ini<||> ~> Service['dcorch-api-proxy'] + include dcorch::deps if $::dcorch::params::api_package { - Package['dcorch'] -> Dcorch_config<||> - Package['dcorch'] -> Dcorch_api_paste_ini<||> - Package['dcorch'] -> Service['dcorch-api-proxy'] package { 'dcorch': ensure => $package_ensure, name => $::dcorch::params::api_proxy_package, + tag => 'dcorch-package', } } @@ -196,15 +192,7 @@ class dcorch::api_proxy ( } Keystone_endpoint<||> -> Service['dcorch-api-proxy'] - exec { 'dcorch-dbsync': - command => $::dcorch::params::db_sync_command, - path => '/usr/bin', - refreshonly => true, - logoutput => 'on_failure', - require => Package['dcorch'], - # Only do the db sync if both controllers are running the same software - # version. Avoids impacting mate controller during an upgrade. - onlyif => "test ${::controller_sw_versions_match} = true", + if $sync_db { + include ::dcorch::db::sync } - } diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/client.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/client.pp index 58c46ed735..88813d3741 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/client.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/client.pp @@ -23,9 +23,11 @@ class dcorch::client( ) { include dcorch::params + include dcorch::deps package { 'dcorchclient': ensure => $package_ensure, name => $::dcorch::params::client_package, + tag => 'dcorch-package', } } diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/postgresql.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/postgresql.pp index 9bdfa6e168..65c63a489a 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/postgresql.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/postgresql.pp @@ -40,6 +40,8 @@ class dcorch::db::postgresql( $privileges = 'ALL', ) { + include dcorch::deps + ::openstacklib::db::postgresql { 'dcorch': password_hash => postgresql_password($user, $password), dbname => $dbname, @@ -48,7 +50,7 @@ class dcorch::db::postgresql( privileges => $privileges, } - ::Openstacklib::Db::Postgresql['dcorch'] ~> Service <| title == 'dcorch-api-proxy' |> - ::Openstacklib::Db::Postgresql['dcorch'] ~> Service <| title == 'dcorch-engine' |> - ::Openstacklib::Db::Postgresql['dcorch'] ~> Exec <| title == 'dcorch-dbsync' |> + Anchor['dcorch::db::begin'] + ~> Class['dcorch::db::postgresql'] + ~> Anchor['dcorch::db::end'] } diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/sync.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/sync.pp index d716f977fd..2fd1942566 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/sync.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/db/sync.pp @@ -10,12 +10,22 @@ class dcorch::db::sync { include dcorch::params + include dcorch::deps exec { 'dcorch-dbsync': command => $::dcorch::params::db_sync_command, path => '/usr/bin', refreshonly => true, - require => [File[$::dcorch::params::dcorch_conf], Class['dcorch']], logoutput => 'on_failure', + subscribe => [ + Anchor['dcorch::install::end'], + Anchor['dcorch::config::end'], + Anchor['dcorch::db::end'], + Anchor['dcorch::dbsync::begin'] + ], + notify => Anchor['dcorch::dbsync::end'], + # Only do the db sync if both controllers are running the same software + # version. Avoids impacting mate controller during an upgrade. + onlyif => "test ${::controller_sw_versions_match} = true", } } diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/deps.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/deps.pp new file mode 100644 index 0000000000..1d11d23d8e --- /dev/null +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/deps.pp @@ -0,0 +1,29 @@ +# == Class: dcorch::deps +# +# dcorch anchors and dependency management +# +class dcorch::deps { + anchor { 'dcorch::install::begin': } + -> Package<| tag == 'dcorch-package'|> + ~> anchor { 'dcorch::install::end': } + -> anchor { 'dcorch::config::begin': } + -> Dcorch_config<||> + ~> anchor { 'dcorch::config::end': } + -> anchor { 'dcorch::db::begin': } + -> anchor { 'dcorch::db::end': } + ~> anchor { 'dcorch::dbsync::begin': } + -> anchor { 'dcorch::dbsync::end': } + ~> anchor { 'dcorch::service::begin': } + ~> Service<| tag == 'dcorch-service' |> + ~> anchor { 'dcorch::service::end': } + + Anchor['dcorch::config::begin'] + -> Dcorch_api_paste_ini<||> + ~> Anchor['dcorch::config::end'] + + Oslo::Db<||> -> Anchor['dcorch::dbsync::begin'] + + # Installation or config changes will always restart services. + Anchor['dcorch::install::end'] ~> Anchor['dcorch::service::begin'] + Anchor['dcorch::config::end'] ~> Anchor['dcorch::service::begin'] +} diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/engine.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/engine.pp index c512402066..96808e5cf5 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/engine.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/engine.pp @@ -14,15 +14,13 @@ class dcorch::engine ( ) { include dcorch::params - - Dcorch_config<||> ~> Service['dcorch-engine'] + include dcorch::deps if $::dcorch::params::engine_package { - Package['dcorch-engine'] -> Dcorch_config<||> - Package['dcorch-engine'] -> Service['dcorch-engine'] package { 'dcorch-engine': ensure => $package_ensure, name => $::dcorch::params::engine_package, + tag => 'dcorch-package', } } @@ -37,8 +35,7 @@ class dcorch::engine ( name => $::dcorch::params::engine_service, enable => $enabled, hasstatus => false, - require => Package['dcorch'], + tag => 'dcorch-service', } - Exec<| title == 'dcorch-dbsync' |> -> Service['dcorch-engine'] } diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/init.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/init.pp index b2d3987e39..95167e61e4 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/init.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/init.pp @@ -60,9 +60,7 @@ class dcorch ( ) { include dcorch::params - - Package['dcorch'] -> Dcorch_config<||> - Package['dcorch'] -> Dcorch_api_paste_ini<||> + include dcorch::deps # this anchor is used to simplify the graph between dcorch components by # allowing a resource to serve as a point where the configuration of dcorch begins @@ -72,6 +70,7 @@ class dcorch ( ensure => $package_ensure, name => $::dcorch::params::package_name, require => Anchor['dcorch-start'], + tag => 'dcorch-package', } file { $::dcorch::params::dcorch_conf: diff --git a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/snmp.pp b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/snmp.pp index f997b617f0..f82a57c060 100644 --- a/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/snmp.pp +++ b/puppet-modules-wrs/puppet-dcorch/src/dcorch/manifests/snmp.pp @@ -16,15 +16,13 @@ class dcorch::snmp ( ) { include dcorch::params - - Dcorch_config<||> ~> Service['dcorch-snmp'] + include dcorch::deps if $::dcorch::params::snmp_package { - Package['dcorch-snmp'] -> Dcorch_config<||> - Package['dcorch-snmp'] -> Service['dcorch-snmp'] package { 'dcorch-snmp': ensure => $package_ensure, name => $::dcorch::params::snmp_package, + tag => 'dcorch-package', } } dcorch_config { @@ -43,8 +41,7 @@ class dcorch::snmp ( name => $::dcorch::params::snmp_service, enable => $enabled, hasstatus => false, - require => Package['dcorch'], + tag => 'dcorch-service', } - Exec<| title == 'dcorch-dbsync' |> -> Service['dcorch-snmp'] } diff --git a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/host.py b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/host.py index b4088c5890..ba47b1e5ef 100644 --- a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/host.py +++ b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/host.py @@ -1412,6 +1412,12 @@ class HostController(rest.RestController): pecan.request.rpcapi.reconfigure_service_endpoints( pecan.request.context, controller_ihost) + # if it is a system controller, config the database + if (utils.get_distributed_cloud_role() == + constants.DISTRIBUTED_CLOUD_ROLE_SYSTEMCONTROLLER): + pecan.request.rpcapi.configure_sc_database( + pecan.request.context, controller_ihost) + return Host.convert_with_links(controller_ihost) if ihost_dict['personality'] in (constants.CONTROLLER, constants.STORAGE): diff --git a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/interface_network.py b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/interface_network.py index 4a144261ce..d9dbeb3165 100644 --- a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/interface_network.py +++ b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/interface_network.py @@ -191,7 +191,7 @@ class InterfaceNetworkController(rest.RestController): ethernet_port_mac = tmp_interface['imac'] _update_host_mgmt_mac(host, ethernet_port_mac) cutils.perform_distributed_cloud_config(pecan.request.dbapi, - interface_id) + interface_uuid) return InterfaceNetwork.convert_with_links(result) diff --git a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/system.py b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/system.py index 079a08f003..3a5ef6aa3b 100644 --- a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/system.py +++ b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/system.py @@ -477,18 +477,26 @@ class SystemController(rest.RestController): " as %s" % https_enabled)) if 'distributed_cloud_role' in updates: - # At this point dc role cannot be changed after config_controller - # and config_subcloud - if rpc_isystem['distributed_cloud_role'] is None and \ - distributed_cloud_role in \ - [constants.DISTRIBUTED_CLOUD_ROLE_SYSTEMCONTROLLER, - constants.DISTRIBUTED_CLOUD_ROLE_SUBCLOUD]: - + # At this point dc role cannot be changed after initial + # configuration is complete + if (rpc_isystem['distributed_cloud_role'] is not None and + cutils.is_initial_config_complete()): + raise wsme.exc.ClientSideError( + _("distributed_cloud_role is already set " + " as %s" % rpc_isystem['distributed_cloud_role'])) + # allow set the role to None before the initial config + # is complete + elif ((distributed_cloud_role in + [constants.DISTRIBUTED_CLOUD_ROLE_SYSTEMCONTROLLER, + constants.DISTRIBUTED_CLOUD_ROLE_SUBCLOUD] or + distributed_cloud_role is None) and not + cutils.is_initial_config_complete()): change_dc_role = True patched_system['distributed_cloud_role'] = distributed_cloud_role else: - raise wsme.exc.ClientSideError(_("distributed_cloud_role is already set " - " as %s" % rpc_isystem['distributed_cloud_role'])) + raise wsme.exc.ClientSideError(_("Unexpected value %s specified" + " for distributed_cloud_role" + % distributed_cloud_role)) if 'vswitch_type' in updates: if vswitch_type == rpc_isystem['capabilities']['vswitch_type']: @@ -575,6 +583,16 @@ class SystemController(rest.RestController): pecan.request.rpcapi.update_distributed_cloud_role( pecan.request.context) + # check if we need to config the system controller database + if (change_dc_role and distributed_cloud_role == + constants.DISTRIBUTED_CLOUD_ROLE_SYSTEMCONTROLLER): + hosts = pecan.request.dbapi.ihost_get_by_personality( + constants.CONTROLLER) + # this is a replay case after the first host has been created + if len(hosts) == 1: + pecan.request.rpcapi.configure_sc_database( + pecan.request.context, hosts[0]) + if 'security_feature' in delta_handle: LOG.info("update security_feature %s" % security_feature) pecan.request.rpcapi.update_security_feature_config( diff --git a/sysinv/sysinv/sysinv/sysinv/conductor/manager.py b/sysinv/sysinv/sysinv/sysinv/conductor/manager.py index fcd54d3277..a6c00ef93c 100644 --- a/sysinv/sysinv/sysinv/sysinv/conductor/manager.py +++ b/sysinv/sysinv/sysinv/sysinv/conductor/manager.py @@ -10417,3 +10417,44 @@ class ConductorManager(service.PeriodicService): else: LOG.error("Received a request to update management mac for host " "%s under the wrong condition." % host.hostname) + + def configure_sc_database(self, context, host): + """Configure the system controller database upon the creation of initial + controller host and distributed_cloud_role change from 'none' to + 'systemcontroller' during bootstrap playbook play and replay. + + :param context: request context. + :param host: an ihost object + + """ + if (os.path.isfile(constants.ANSIBLE_BOOTSTRAP_FLAG) and + host.hostname == constants.CONTROLLER_0_HOSTNAME): + + inventory_completed = True + + # This could be called as part of host creation, wait for + # inventory to complete + for i in range(constants.INVENTORY_WAIT_TIMEOUT_IN_SECS): + if cutils.is_inventory_config_complete(self.dbapi, host.uuid): + break + LOG.info('Inventory incomplete, will try again in 1 second.') + greenthread.sleep(1) + else: + inventory_completed = False + + if inventory_completed: + personalities = [constants.CONTROLLER] + config_uuid = self._config_update_hosts(context, personalities) + config_dict = { + "personalities": personalities, + "host_uuids": [host.uuid], + "classes": ['platform::postgresql::sc::runtime'] + } + self._config_apply_runtime_manifest( + context, config_uuid, config_dict, force=True) + else: + LOG.error("Unable to configure the sc database. Timed out " + "waiting for inventory to complete.") + else: + LOG.error("Received a request to configure the sc database " + "for host %s under the wrong condition." % host.hostname) diff --git a/sysinv/sysinv/sysinv/sysinv/conductor/rpcapi.py b/sysinv/sysinv/sysinv/sysinv/conductor/rpcapi.py index 14e7ce91ed..3a65108032 100644 --- a/sysinv/sysinv/sysinv/sysinv/conductor/rpcapi.py +++ b/sysinv/sysinv/sysinv/sysinv/conductor/rpcapi.py @@ -1815,3 +1815,16 @@ class ConductorAPI(sysinv.openstack.common.rpc.proxy.RpcProxy): self.make_msg('mgmt_mac_set_by_ihost', host=host, mgmt_mac=mgmt_mac)) + + def configure_sc_database(self, context, host): + """Synchronously, configure system controller database upon the + creation of initial controller host and distributed_cloud_role + change from 'none' to 'systemcontroller' during bootstrap + playbook play and replay. + + :param context: request context. + :param host: an ihost object + """ + return self.call(context, + self.make_msg('configure_sc_database', + host=host))