commit
836d75c274
@ -0,0 +1 @@
|
||||
5f4de38850f9691dc9789bd4db4be512c9717d7b SOURCES/cloud-init-19.4.tar.gz
|
@ -0,0 +1 @@
|
||||
SOURCES/cloud-init-19.4.tar.gz
|
@ -0,0 +1,533 @@
|
||||
From 4114343d0cd2fc3e5566eed27272480e003c89cc Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Thu, 31 May 2018 16:45:23 +0200
|
||||
Subject: Add initial redhat setup
|
||||
|
||||
Rebase notes (18.5):
|
||||
- added bash_completition file
|
||||
- added cloud-id file
|
||||
|
||||
Merged patches (19.4):
|
||||
- 4ab5a61 Fix for network configuration not persisting after reboot
|
||||
- 84cf125 Removing cloud-user from wheel
|
||||
- 31290ab Adding gating tests for Azure, ESXi and AWS
|
||||
|
||||
Merged patches (18.5):
|
||||
- 2d6b469 add power-state-change module to cloud_final_modules
|
||||
- 764159f Adding systemd mount options to wait for cloud-init
|
||||
- da4d99e Adding disk_setup to rhel/cloud.cfg
|
||||
- f5c6832 Enable cloud-init by default on vmware
|
||||
---
|
||||
.gitignore | 1 +
|
||||
cloudinit/config/cc_chef.py | 6 +-
|
||||
cloudinit/settings.py | 7 +-
|
||||
redhat/.gitignore | 1 +
|
||||
redhat/Makefile | 71 ++++++
|
||||
redhat/Makefile.common | 37 +++
|
||||
redhat/cloud-init-tmpfiles.conf | 1 +
|
||||
redhat/cloud-init.spec.template | 438 ++++++++++++++++++++++++++++++++++
|
||||
redhat/gating.yaml | 9 +
|
||||
redhat/rpmbuild/BUILD/.gitignore | 3 +
|
||||
redhat/rpmbuild/RPMS/.gitignore | 3 +
|
||||
redhat/rpmbuild/SOURCES/.gitignore | 3 +
|
||||
redhat/rpmbuild/SPECS/.gitignore | 3 +
|
||||
redhat/rpmbuild/SRPMS/.gitignore | 3 +
|
||||
redhat/scripts/frh.py | 27 +++
|
||||
redhat/scripts/git-backport-diff | 327 +++++++++++++++++++++++++
|
||||
redhat/scripts/git-compile-check | 215 +++++++++++++++++
|
||||
redhat/scripts/process-patches.sh | 73 ++++++
|
||||
redhat/scripts/tarball_checksum.sh | 3 +
|
||||
rhel/README.rhel | 5 +
|
||||
rhel/cloud-init-tmpfiles.conf | 1 +
|
||||
rhel/cloud.cfg | 69 ++++++
|
||||
rhel/systemd/cloud-config.service | 18 ++
|
||||
rhel/systemd/cloud-config.target | 11 +
|
||||
rhel/systemd/cloud-final.service | 19 ++
|
||||
rhel/systemd/cloud-init-local.service | 31 +++
|
||||
rhel/systemd/cloud-init.service | 25 ++
|
||||
rhel/systemd/cloud-init.target | 7 +
|
||||
setup.py | 70 +-----
|
||||
tools/read-version | 28 +--
|
||||
30 files changed, 1417 insertions(+), 98 deletions(-)
|
||||
create mode 100644 redhat/.gitignore
|
||||
create mode 100644 redhat/Makefile
|
||||
create mode 100644 redhat/Makefile.common
|
||||
create mode 100644 redhat/cloud-init-tmpfiles.conf
|
||||
create mode 100644 redhat/cloud-init.spec.template
|
||||
create mode 100644 redhat/gating.yaml
|
||||
create mode 100644 redhat/rpmbuild/BUILD/.gitignore
|
||||
create mode 100644 redhat/rpmbuild/RPMS/.gitignore
|
||||
create mode 100644 redhat/rpmbuild/SOURCES/.gitignore
|
||||
create mode 100644 redhat/rpmbuild/SPECS/.gitignore
|
||||
create mode 100644 redhat/rpmbuild/SRPMS/.gitignore
|
||||
create mode 100755 redhat/scripts/frh.py
|
||||
create mode 100755 redhat/scripts/git-backport-diff
|
||||
create mode 100755 redhat/scripts/git-compile-check
|
||||
create mode 100755 redhat/scripts/process-patches.sh
|
||||
create mode 100755 redhat/scripts/tarball_checksum.sh
|
||||
create mode 100644 rhel/README.rhel
|
||||
create mode 100644 rhel/cloud-init-tmpfiles.conf
|
||||
create mode 100644 rhel/cloud.cfg
|
||||
create mode 100644 rhel/systemd/cloud-config.service
|
||||
create mode 100644 rhel/systemd/cloud-config.target
|
||||
create mode 100644 rhel/systemd/cloud-final.service
|
||||
create mode 100644 rhel/systemd/cloud-init-local.service
|
||||
create mode 100644 rhel/systemd/cloud-init.service
|
||||
create mode 100644 rhel/systemd/cloud-init.target
|
||||
|
||||
diff --git a/cloudinit/config/cc_chef.py b/cloudinit/config/cc_chef.py
|
||||
index 0ad6b7f..e4408a4 100644
|
||||
--- a/cloudinit/config/cc_chef.py
|
||||
+++ b/cloudinit/config/cc_chef.py
|
||||
@@ -33,7 +33,7 @@ file).
|
||||
|
||||
chef:
|
||||
directories: (defaulting to /etc/chef, /var/log/chef, /var/lib/chef,
|
||||
- /var/cache/chef, /var/backups/chef, /var/run/chef)
|
||||
+ /var/cache/chef, /var/backups/chef, /run/chef)
|
||||
validation_cert: (optional string to be written to file validation_key)
|
||||
special value 'system' means set use existing file
|
||||
validation_key: (optional the path for validation_cert. default
|
||||
@@ -89,7 +89,7 @@ CHEF_DIRS = tuple([
|
||||
'/var/lib/chef',
|
||||
'/var/cache/chef',
|
||||
'/var/backups/chef',
|
||||
- '/var/run/chef',
|
||||
+ '/run/chef',
|
||||
])
|
||||
REQUIRED_CHEF_DIRS = tuple([
|
||||
'/etc/chef',
|
||||
@@ -113,7 +113,7 @@ CHEF_RB_TPL_DEFAULTS = {
|
||||
'json_attribs': CHEF_FB_PATH,
|
||||
'file_cache_path': "/var/cache/chef",
|
||||
'file_backup_path': "/var/backups/chef",
|
||||
- 'pid_file': "/var/run/chef/client.pid",
|
||||
+ 'pid_file': "/run/chef/client.pid",
|
||||
'show_time': True,
|
||||
'encrypted_data_bag_secret': None,
|
||||
}
|
||||
diff --git a/cloudinit/settings.py b/cloudinit/settings.py
|
||||
index ca4ffa8..3a04a58 100644
|
||||
--- a/cloudinit/settings.py
|
||||
+++ b/cloudinit/settings.py
|
||||
@@ -46,13 +46,16 @@ CFG_BUILTIN = {
|
||||
],
|
||||
'def_log_file': '/var/log/cloud-init.log',
|
||||
'log_cfgs': [],
|
||||
- 'syslog_fix_perms': ['syslog:adm', 'root:adm', 'root:wheel', 'root:root'],
|
||||
+ 'mount_default_fields': [None, None, 'auto', 'defaults,nofail', '0', '2'],
|
||||
+ 'ssh_deletekeys': False,
|
||||
+ 'ssh_genkeytypes': [],
|
||||
+ 'syslog_fix_perms': [],
|
||||
'system_info': {
|
||||
'paths': {
|
||||
'cloud_dir': '/var/lib/cloud',
|
||||
'templates_dir': '/etc/cloud/templates/',
|
||||
},
|
||||
- 'distro': 'ubuntu',
|
||||
+ 'distro': 'rhel',
|
||||
'network': {'renderers': None},
|
||||
},
|
||||
'vendor_data': {'enabled': True, 'prefix': []},
|
||||
diff --git a/rhel/README.rhel b/rhel/README.rhel
|
||||
new file mode 100644
|
||||
index 0000000..aa29630
|
||||
--- /dev/null
|
||||
+++ b/rhel/README.rhel
|
||||
@@ -0,0 +1,5 @@
|
||||
+The following cloud-init modules are currently unsupported on this OS:
|
||||
+ - apt_update_upgrade ('apt_update', 'apt_upgrade', 'apt_mirror', 'apt_preserve_sources_list', 'apt_old_mirror', 'apt_sources', 'debconf_selections', 'packages' options)
|
||||
+ - byobu ('byobu_by_default' option)
|
||||
+ - chef
|
||||
+ - grub_dpkg
|
||||
diff --git a/rhel/cloud-init-tmpfiles.conf b/rhel/cloud-init-tmpfiles.conf
|
||||
new file mode 100644
|
||||
index 0000000..0c6d2a3
|
||||
--- /dev/null
|
||||
+++ b/rhel/cloud-init-tmpfiles.conf
|
||||
@@ -0,0 +1 @@
|
||||
+d /run/cloud-init 0700 root root - -
|
||||
diff --git a/rhel/cloud.cfg b/rhel/cloud.cfg
|
||||
new file mode 100644
|
||||
index 0000000..82e8bf6
|
||||
--- /dev/null
|
||||
+++ b/rhel/cloud.cfg
|
||||
@@ -0,0 +1,69 @@
|
||||
+users:
|
||||
+ - default
|
||||
+
|
||||
+disable_root: 1
|
||||
+ssh_pwauth: 0
|
||||
+
|
||||
+mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2']
|
||||
+resize_rootfs_tmp: /dev
|
||||
+ssh_deletekeys: 0
|
||||
+ssh_genkeytypes: ~
|
||||
+syslog_fix_perms: ~
|
||||
+disable_vmware_customization: false
|
||||
+
|
||||
+cloud_init_modules:
|
||||
+ - disk_setup
|
||||
+ - migrator
|
||||
+ - bootcmd
|
||||
+ - write-files
|
||||
+ - growpart
|
||||
+ - resizefs
|
||||
+ - set_hostname
|
||||
+ - update_hostname
|
||||
+ - update_etc_hosts
|
||||
+ - rsyslog
|
||||
+ - users-groups
|
||||
+ - ssh
|
||||
+
|
||||
+cloud_config_modules:
|
||||
+ - mounts
|
||||
+ - locale
|
||||
+ - set-passwords
|
||||
+ - rh_subscription
|
||||
+ - yum-add-repo
|
||||
+ - package-update-upgrade-install
|
||||
+ - timezone
|
||||
+ - puppet
|
||||
+ - chef
|
||||
+ - salt-minion
|
||||
+ - mcollective
|
||||
+ - disable-ec2-metadata
|
||||
+ - runcmd
|
||||
+
|
||||
+cloud_final_modules:
|
||||
+ - rightscale_userdata
|
||||
+ - scripts-per-once
|
||||
+ - scripts-per-boot
|
||||
+ - scripts-per-instance
|
||||
+ - scripts-user
|
||||
+ - ssh-authkey-fingerprints
|
||||
+ - keys-to-console
|
||||
+ - phone-home
|
||||
+ - final-message
|
||||
+ - power-state-change
|
||||
+
|
||||
+system_info:
|
||||
+ default_user:
|
||||
+ name: cloud-user
|
||||
+ lock_passwd: true
|
||||
+ gecos: Cloud User
|
||||
+ groups: [adm, systemd-journal]
|
||||
+ sudo: ["ALL=(ALL) NOPASSWD:ALL"]
|
||||
+ shell: /bin/bash
|
||||
+ distro: rhel
|
||||
+ paths:
|
||||
+ cloud_dir: /var/lib/cloud
|
||||
+ templates_dir: /etc/cloud/templates
|
||||
+ ssh_svcname: sshd
|
||||
+
|
||||
+# vim:syntax=yaml
|
||||
diff --git a/rhel/systemd/cloud-config.service b/rhel/systemd/cloud-config.service
|
||||
new file mode 100644
|
||||
index 0000000..f3dcd4b
|
||||
--- /dev/null
|
||||
+++ b/rhel/systemd/cloud-config.service
|
||||
@@ -0,0 +1,18 @@
|
||||
+[Unit]
|
||||
+Description=Apply the settings specified in cloud-config
|
||||
+After=network-online.target cloud-config.target
|
||||
+Wants=network-online.target cloud-config.target
|
||||
+ConditionPathExists=!/etc/cloud/cloud-init.disabled
|
||||
+ConditionKernelCommandLine=!cloud-init=disabled
|
||||
+
|
||||
+[Service]
|
||||
+Type=oneshot
|
||||
+ExecStart=/usr/bin/cloud-init modules --mode=config
|
||||
+RemainAfterExit=yes
|
||||
+TimeoutSec=0
|
||||
+
|
||||
+# Output needs to appear in instance console output
|
||||
+StandardOutput=journal+console
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=cloud-init.target
|
||||
diff --git a/rhel/systemd/cloud-config.target b/rhel/systemd/cloud-config.target
|
||||
new file mode 100644
|
||||
index 0000000..ae9b7d0
|
||||
--- /dev/null
|
||||
+++ b/rhel/systemd/cloud-config.target
|
||||
@@ -0,0 +1,11 @@
|
||||
+# cloud-init normally emits a "cloud-config" upstart event to inform third
|
||||
+# parties that cloud-config is available, which does us no good when we're
|
||||
+# using systemd. cloud-config.target serves as this synchronization point
|
||||
+# instead. Services that would "start on cloud-config" with upstart can
|
||||
+# instead use "After=cloud-config.target" and "Wants=cloud-config.target"
|
||||
+# as appropriate.
|
||||
+
|
||||
+[Unit]
|
||||
+Description=Cloud-config availability
|
||||
+Wants=cloud-init-local.service cloud-init.service
|
||||
+After=cloud-init-local.service cloud-init.service
|
||||
diff --git a/rhel/systemd/cloud-final.service b/rhel/systemd/cloud-final.service
|
||||
new file mode 100644
|
||||
index 0000000..739b7e3
|
||||
--- /dev/null
|
||||
+++ b/rhel/systemd/cloud-final.service
|
||||
@@ -0,0 +1,19 @@
|
||||
+[Unit]
|
||||
+Description=Execute cloud user/final scripts
|
||||
+After=network-online.target cloud-config.service rc-local.service
|
||||
+Wants=network-online.target cloud-config.service
|
||||
+ConditionPathExists=!/etc/cloud/cloud-init.disabled
|
||||
+ConditionKernelCommandLine=!cloud-init=disabled
|
||||
+
|
||||
+[Service]
|
||||
+Type=oneshot
|
||||
+ExecStart=/usr/bin/cloud-init modules --mode=final
|
||||
+RemainAfterExit=yes
|
||||
+TimeoutSec=0
|
||||
+KillMode=process
|
||||
+
|
||||
+# Output needs to appear in instance console output
|
||||
+StandardOutput=journal+console
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=cloud-init.target
|
||||
diff --git a/rhel/systemd/cloud-init-local.service b/rhel/systemd/cloud-init-local.service
|
||||
new file mode 100644
|
||||
index 0000000..8f9f6c9
|
||||
--- /dev/null
|
||||
+++ b/rhel/systemd/cloud-init-local.service
|
||||
@@ -0,0 +1,31 @@
|
||||
+[Unit]
|
||||
+Description=Initial cloud-init job (pre-networking)
|
||||
+DefaultDependencies=no
|
||||
+Wants=network-pre.target
|
||||
+After=systemd-remount-fs.service
|
||||
+Requires=dbus.socket
|
||||
+After=dbus.socket
|
||||
+Before=NetworkManager.service network.service
|
||||
+Before=network-pre.target
|
||||
+Before=shutdown.target
|
||||
+Before=firewalld.target
|
||||
+Conflicts=shutdown.target
|
||||
+RequiresMountsFor=/var/lib/cloud
|
||||
+ConditionPathExists=!/etc/cloud/cloud-init.disabled
|
||||
+ConditionKernelCommandLine=!cloud-init=disabled
|
||||
+
|
||||
+[Service]
|
||||
+Type=oneshot
|
||||
+ExecStartPre=/bin/mkdir -p /run/cloud-init
|
||||
+ExecStartPre=/sbin/restorecon /run/cloud-init
|
||||
+ExecStartPre=/usr/bin/touch /run/cloud-init/enabled
|
||||
+ExecStart=/usr/bin/cloud-init init --local
|
||||
+ExecStart=/bin/touch /run/cloud-init/network-config-ready
|
||||
+RemainAfterExit=yes
|
||||
+TimeoutSec=0
|
||||
+
|
||||
+# Output needs to appear in instance console output
|
||||
+StandardOutput=journal+console
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=cloud-init.target
|
||||
diff --git a/rhel/systemd/cloud-init.service b/rhel/systemd/cloud-init.service
|
||||
new file mode 100644
|
||||
index 0000000..d0023a0
|
||||
--- /dev/null
|
||||
+++ b/rhel/systemd/cloud-init.service
|
||||
@@ -0,0 +1,25 @@
|
||||
+[Unit]
|
||||
+Description=Initial cloud-init job (metadata service crawler)
|
||||
+Wants=cloud-init-local.service
|
||||
+Wants=sshd-keygen.service
|
||||
+Wants=sshd.service
|
||||
+After=cloud-init-local.service
|
||||
+After=NetworkManager.service network.service
|
||||
+Before=network-online.target
|
||||
+Before=sshd-keygen.service
|
||||
+Before=sshd.service
|
||||
+Before=systemd-user-sessions.service
|
||||
+ConditionPathExists=!/etc/cloud/cloud-init.disabled
|
||||
+ConditionKernelCommandLine=!cloud-init=disabled
|
||||
+
|
||||
+[Service]
|
||||
+Type=oneshot
|
||||
+ExecStart=/usr/bin/cloud-init init
|
||||
+RemainAfterExit=yes
|
||||
+TimeoutSec=0
|
||||
+
|
||||
+# Output needs to appear in instance console output
|
||||
+StandardOutput=journal+console
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=cloud-init.target
|
||||
diff --git a/rhel/systemd/cloud-init.target b/rhel/systemd/cloud-init.target
|
||||
new file mode 100644
|
||||
index 0000000..083c3b6
|
||||
--- /dev/null
|
||||
+++ b/rhel/systemd/cloud-init.target
|
||||
@@ -0,0 +1,7 @@
|
||||
+# cloud-init target is enabled by cloud-init-generator
|
||||
+# To disable it you can either:
|
||||
+# a.) boot with kernel cmdline of 'cloud-init=disabled'
|
||||
+# b.) touch a file /etc/cloud/cloud-init.disabled
|
||||
+[Unit]
|
||||
+Description=Cloud-init target
|
||||
+After=multi-user.target
|
||||
diff --git a/setup.py b/setup.py
|
||||
index 01a67b9..b2ac9bb 100755
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -139,14 +139,6 @@ INITSYS_FILES = {
|
||||
'sysvinit_deb': [f for f in glob('sysvinit/debian/*') if is_f(f)],
|
||||
'sysvinit_openrc': [f for f in glob('sysvinit/gentoo/*') if is_f(f)],
|
||||
'sysvinit_suse': [f for f in glob('sysvinit/suse/*') if is_f(f)],
|
||||
- 'systemd': [render_tmpl(f)
|
||||
- for f in (glob('systemd/*.tmpl') +
|
||||
- glob('systemd/*.service') +
|
||||
- glob('systemd/*.target'))
|
||||
- if (is_f(f) and not is_generator(f))],
|
||||
- 'systemd.generators': [
|
||||
- render_tmpl(f, mode=0o755)
|
||||
- for f in glob('systemd/*') if is_f(f) and is_generator(f)],
|
||||
'upstart': [f for f in glob('upstart/*') if is_f(f)],
|
||||
}
|
||||
INITSYS_ROOTS = {
|
||||
@@ -155,9 +147,6 @@ INITSYS_ROOTS = {
|
||||
'sysvinit_deb': 'etc/init.d',
|
||||
'sysvinit_openrc': 'etc/init.d',
|
||||
'sysvinit_suse': 'etc/init.d',
|
||||
- 'systemd': pkg_config_read('systemd', 'systemdsystemunitdir'),
|
||||
- 'systemd.generators': pkg_config_read('systemd',
|
||||
- 'systemdsystemgeneratordir'),
|
||||
'upstart': 'etc/init/',
|
||||
}
|
||||
INITSYS_TYPES = sorted([f.partition(".")[0] for f in INITSYS_ROOTS.keys()])
|
||||
@@ -208,47 +197,6 @@ class MyEggInfo(egg_info):
|
||||
return ret
|
||||
|
||||
|
||||
-# TODO: Is there a better way to do this??
|
||||
-class InitsysInstallData(install):
|
||||
- init_system = None
|
||||
- user_options = install.user_options + [
|
||||
- # This will magically show up in member variable 'init_sys'
|
||||
- ('init-system=', None,
|
||||
- ('init system(s) to configure (%s) [default: None]' %
|
||||
- (", ".join(INITSYS_TYPES)))),
|
||||
- ]
|
||||
-
|
||||
- def initialize_options(self):
|
||||
- install.initialize_options(self)
|
||||
- self.init_system = ""
|
||||
-
|
||||
- def finalize_options(self):
|
||||
- install.finalize_options(self)
|
||||
-
|
||||
- if self.init_system and isinstance(self.init_system, str):
|
||||
- self.init_system = self.init_system.split(",")
|
||||
-
|
||||
- if len(self.init_system) == 0:
|
||||
- self.init_system = ['systemd']
|
||||
-
|
||||
- bad = [f for f in self.init_system if f not in INITSYS_TYPES]
|
||||
- if len(bad) != 0:
|
||||
- raise DistutilsArgError(
|
||||
- "Invalid --init-system: %s" % (','.join(bad)))
|
||||
-
|
||||
- for system in self.init_system:
|
||||
- # add data files for anything that starts with '<system>.'
|
||||
- datakeys = [k for k in INITSYS_ROOTS
|
||||
- if k.partition(".")[0] == system]
|
||||
- for k in datakeys:
|
||||
- if not INITSYS_FILES[k]:
|
||||
- continue
|
||||
- self.distribution.data_files.append(
|
||||
- (INITSYS_ROOTS[k], INITSYS_FILES[k]))
|
||||
- # Force that command to reinitalize (with new file list)
|
||||
- self.distribution.reinitialize_command('install_data', True)
|
||||
-
|
||||
-
|
||||
if not in_virtualenv():
|
||||
USR = "/" + USR
|
||||
ETC = "/" + ETC
|
||||
@@ -258,14 +206,11 @@ if not in_virtualenv():
|
||||
INITSYS_ROOTS[k] = "/" + INITSYS_ROOTS[k]
|
||||
|
||||
data_files = [
|
||||
- (ETC + '/cloud', [render_tmpl("config/cloud.cfg.tmpl")]),
|
||||
+ (ETC + '/bash_completion.d', ['bash_completion/cloud-init']),
|
||||
(ETC + '/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')),
|
||||
(ETC + '/cloud/templates', glob('templates/*')),
|
||||
- (USR_LIB_EXEC + '/cloud-init', ['tools/ds-identify',
|
||||
- 'tools/uncloud-init',
|
||||
+ (USR_LIB_EXEC + '/cloud-init', ['tools/uncloud-init',
|
||||
'tools/write-ssh-key-fingerprints']),
|
||||
- (USR + '/share/bash-completion/completions',
|
||||
- ['bash_completion/cloud-init']),
|
||||
(USR + '/share/doc/cloud-init', [f for f in glob('doc/*') if is_f(f)]),
|
||||
(USR + '/share/doc/cloud-init/examples',
|
||||
[f for f in glob('doc/examples/*') if is_f(f)]),
|
||||
@@ -276,15 +221,8 @@ if os.uname()[0] != 'FreeBSD':
|
||||
data_files.extend([
|
||||
(ETC + '/NetworkManager/dispatcher.d/',
|
||||
['tools/hook-network-manager']),
|
||||
- (ETC + '/dhcp/dhclient-exit-hooks.d/', ['tools/hook-dhclient']),
|
||||
- (LIB + '/udev/rules.d', [f for f in glob('udev/*.rules')])
|
||||
+ ('/usr/lib/udev/rules.d', [f for f in glob('udev/*.rules')])
|
||||
])
|
||||
-# Use a subclass for install that handles
|
||||
-# adding on the right init system configuration files
|
||||
-cmdclass = {
|
||||
- 'install': InitsysInstallData,
|
||||
- 'egg_info': MyEggInfo,
|
||||
-}
|
||||
|
||||
requirements = read_requires()
|
||||
|
||||
@@ -299,8 +237,6 @@ setuptools.setup(
|
||||
scripts=['tools/cloud-init-per'],
|
||||
license='Dual-licensed under GPLv3 or Apache 2.0',
|
||||
data_files=data_files,
|
||||
- install_requires=requirements,
|
||||
- cmdclass=cmdclass,
|
||||
entry_points={
|
||||
'console_scripts': [
|
||||
'cloud-init = cloudinit.cmd.main:main',
|
||||
diff --git a/tools/read-version b/tools/read-version
|
||||
index 6dca659..d43cc8f 100755
|
||||
--- a/tools/read-version
|
||||
+++ b/tools/read-version
|
||||
@@ -65,32 +65,8 @@ output_json = '--json' in sys.argv
|
||||
src_version = ci_version.version_string()
|
||||
version_long = None
|
||||
|
||||
-if is_gitdir(_tdir) and which("git"):
|
||||
- flags = []
|
||||
- if use_tags:
|
||||
- flags = ['--tags']
|
||||
- cmd = ['git', 'describe', '--abbrev=8', '--match=[0-9]*'] + flags
|
||||
-
|
||||
- try:
|
||||
- version = tiny_p(cmd).strip()
|
||||
- except RuntimeError:
|
||||
- version = None
|
||||
-
|
||||
- if version is None or not version.startswith(src_version):
|
||||
- sys.stderr.write("git describe version (%s) differs from "
|
||||
- "cloudinit.version (%s)\n" % (version, src_version))
|
||||
- sys.stderr.write(
|
||||
- "Please get the latest upstream tags.\n"
|
||||
- "As an example, this can be done with the following:\n"
|
||||
- "$ git remote add upstream https://git.launchpad.net/cloud-init\n"
|
||||
- "$ git fetch upstream --tags\n"
|
||||
- )
|
||||
- sys.exit(1)
|
||||
-
|
||||
- version_long = tiny_p(cmd + ["--long"]).strip()
|
||||
-else:
|
||||
- version = src_version
|
||||
- version_long = None
|
||||
+version = src_version
|
||||
+version_long = None
|
||||
|
||||
# version is X.Y.Z[+xxx.gHASH]
|
||||
# version_long is None or X.Y.Z-xxx-gHASH
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,271 @@
|
||||
From aa7ae9da7e10a5bcf190f8df3072e3864b2d8fb3 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Thu, 31 May 2018 19:37:55 +0200
|
||||
Subject: Do not write NM_CONTROLLED=no in generated interface config files
|
||||
|
||||
X-downstream-only: true
|
||||
Signed-off-by: Ryan McCabe <rmccabe@redhat.com>
|
||||
---
|
||||
cloudinit/net/sysconfig.py | 1 -
|
||||
tests/unittests/test_net.py | 30 ------------------------------
|
||||
2 files changed, 31 deletions(-)
|
||||
|
||||
diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
|
||||
index 310cdf0..8bd7e88 100644
|
||||
--- a/cloudinit/net/sysconfig.py
|
||||
+++ b/cloudinit/net/sysconfig.py
|
||||
@@ -272,7 +272,6 @@ class Renderer(renderer.Renderer):
|
||||
iface_defaults = tuple([
|
||||
('ONBOOT', True),
|
||||
('USERCTL', False),
|
||||
- ('NM_CONTROLLED', False),
|
||||
('BOOTPROTO', 'none'),
|
||||
('STARTMODE', 'auto'),
|
||||
])
|
||||
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
|
||||
index 01119e0..a931a3e 100644
|
||||
--- a/tests/unittests/test_net.py
|
||||
+++ b/tests/unittests/test_net.py
|
||||
@@ -530,7 +530,6 @@ GATEWAY=172.19.3.254
|
||||
HWADDR=fa:16:3e:ed:9a:59
|
||||
IPADDR=172.19.1.34
|
||||
NETMASK=255.255.252.0
|
||||
-NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -636,7 +635,6 @@ IPADDR=172.19.1.34
|
||||
IPADDR1=10.0.0.10
|
||||
NETMASK=255.255.252.0
|
||||
NETMASK1=255.255.255.0
|
||||
-NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -772,7 +770,6 @@ IPV6ADDR_SECONDARIES="2001:DB9::10/64 2001:DB10::10/64"
|
||||
IPV6INIT=yes
|
||||
IPV6_DEFAULTGW=2001:DB8::1
|
||||
NETMASK=255.255.252.0
|
||||
-NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -889,7 +886,6 @@ NETWORK_CONFIGS = {
|
||||
BOOTPROTO=none
|
||||
DEVICE=eth1
|
||||
HWADDR=cf:d6:af:48:e8:80
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -907,7 +903,6 @@ NETWORK_CONFIGS = {
|
||||
IPADDR=192.168.21.3
|
||||
NETMASK=255.255.255.0
|
||||
METRIC=10000
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -1022,7 +1017,6 @@ NETWORK_CONFIGS = {
|
||||
IPV6ADDR=2001:1::1/64
|
||||
IPV6INIT=yes
|
||||
NETMASK=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -1491,7 +1485,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
DHCPV6C=yes
|
||||
IPV6INIT=yes
|
||||
MACADDR=aa:bb:cc:dd:ee:ff
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Bond
|
||||
@@ -1500,7 +1493,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
BOOTPROTO=dhcp
|
||||
DEVICE=bond0.200
|
||||
DHCLIENT_SET_DEFAULT_ROUTE=no
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
PHYSDEV=bond0
|
||||
STARTMODE=auto
|
||||
@@ -1519,7 +1511,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
IPV6_DEFAULTGW=2001:4800:78ff:1b::1
|
||||
MACADDR=bb:bb:bb:bb:bb:aa
|
||||
NETMASK=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
PRIO=22
|
||||
STARTMODE=auto
|
||||
@@ -1530,7 +1521,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
BOOTPROTO=none
|
||||
DEVICE=eth0
|
||||
HWADDR=c0:d6:9f:2c:e8:80
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -1548,7 +1538,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
MTU=1500
|
||||
NETMASK=255.255.255.0
|
||||
NETMASK1=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
PHYSDEV=eth0
|
||||
STARTMODE=auto
|
||||
@@ -1560,7 +1549,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
DEVICE=eth1
|
||||
HWADDR=aa:d6:9f:2c:e8:80
|
||||
MASTER=bond0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
SLAVE=yes
|
||||
@@ -1571,7 +1559,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
DEVICE=eth2
|
||||
HWADDR=c0:bb:9f:2c:e8:80
|
||||
MASTER=bond0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
SLAVE=yes
|
||||
@@ -1582,7 +1569,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
BRIDGE=br0
|
||||
DEVICE=eth3
|
||||
HWADDR=66:bb:9f:2c:e8:80
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -1592,7 +1578,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
BRIDGE=br0
|
||||
DEVICE=eth4
|
||||
HWADDR=98:bb:9f:2c:e8:80
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -1602,7 +1587,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
DEVICE=eth5
|
||||
DHCLIENT_SET_DEFAULT_ROUTE=no
|
||||
HWADDR=98:bb:9f:2c:e8:8a
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=no
|
||||
STARTMODE=manual
|
||||
TYPE=Ethernet
|
||||
@@ -2088,7 +2072,6 @@ iface bond0 inet6 static
|
||||
MTU=9000
|
||||
NETMASK=255.255.255.0
|
||||
NETMASK1=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Bond
|
||||
@@ -2099,7 +2082,6 @@ iface bond0 inet6 static
|
||||
DEVICE=bond0s0
|
||||
HWADDR=aa:bb:cc:dd:e8:00
|
||||
MASTER=bond0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
SLAVE=yes
|
||||
STARTMODE=auto
|
||||
@@ -2122,7 +2104,6 @@ iface bond0 inet6 static
|
||||
DEVICE=bond0s1
|
||||
HWADDR=aa:bb:cc:dd:e8:01
|
||||
MASTER=bond0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
SLAVE=yes
|
||||
STARTMODE=auto
|
||||
@@ -2161,7 +2142,6 @@ iface bond0 inet6 static
|
||||
BOOTPROTO=none
|
||||
DEVICE=en0
|
||||
HWADDR=aa:bb:cc:dd:e8:00
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -2180,7 +2160,6 @@ iface bond0 inet6 static
|
||||
MTU=2222
|
||||
NETMASK=255.255.255.0
|
||||
NETMASK1=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
PHYSDEV=en0
|
||||
STARTMODE=auto
|
||||
@@ -2222,7 +2201,6 @@ iface bond0 inet6 static
|
||||
DEVICE=br0
|
||||
IPADDR=192.168.2.2
|
||||
NETMASK=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
PRIO=22
|
||||
STARTMODE=auto
|
||||
@@ -2238,7 +2216,6 @@ iface bond0 inet6 static
|
||||
IPADDR6=2001:1::100/96
|
||||
IPV6ADDR=2001:1::100/96
|
||||
IPV6INIT=yes
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -2252,7 +2229,6 @@ iface bond0 inet6 static
|
||||
IPADDR6=2001:1::101/96
|
||||
IPV6ADDR=2001:1::101/96
|
||||
IPV6INIT=yes
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -2327,7 +2303,6 @@ iface bond0 inet6 static
|
||||
HWADDR=52:54:00:12:34:00
|
||||
IPADDR=192.168.1.2
|
||||
NETMASK=255.255.255.0
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=no
|
||||
STARTMODE=manual
|
||||
TYPE=Ethernet
|
||||
@@ -2338,7 +2313,6 @@ iface bond0 inet6 static
|
||||
DEVICE=eth1
|
||||
HWADDR=52:54:00:12:34:aa
|
||||
MTU=1480
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -2348,7 +2322,6 @@ iface bond0 inet6 static
|
||||
BOOTPROTO=none
|
||||
DEVICE=eth2
|
||||
HWADDR=52:54:00:12:34:ff
|
||||
- NM_CONTROLLED=no
|
||||
ONBOOT=no
|
||||
STARTMODE=manual
|
||||
TYPE=Ethernet
|
||||
@@ -2766,7 +2739,6 @@ class TestRhelSysConfigRendering(CiTestCase):
|
||||
BOOTPROTO=dhcp
|
||||
DEVICE=eth1000
|
||||
HWADDR=07-1c-c6-75-a4-be
|
||||
-NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -2888,7 +2860,6 @@ GATEWAY=10.0.2.2
|
||||
HWADDR=52:54:00:12:34:00
|
||||
IPADDR=10.0.2.15
|
||||
NETMASK=255.255.255.0
|
||||
-NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
@@ -2961,7 +2932,6 @@ USERCTL=no
|
||||
#
|
||||
BOOTPROTO=dhcp
|
||||
DEVICE=eth0
|
||||
-NM_CONTROLLED=no
|
||||
ONBOOT=yes
|
||||
STARTMODE=auto
|
||||
TYPE=Ethernet
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,66 @@
|
||||
From f15946568fe731dc9bf477f3f06c9c4e0f74f7c1 Mon Sep 17 00:00:00 2001
|
||||
From: Lars Kellogg-Stedman <lars@redhat.com>
|
||||
Date: Fri, 7 Apr 2017 18:50:54 -0400
|
||||
Subject: limit permissions on def_log_file
|
||||
|
||||
This sets a default mode of 0600 on def_log_file, and makes this
|
||||
configurable via the def_log_file_mode option in cloud.cfg.
|
||||
|
||||
LP: #1541196
|
||||
Resolves: rhbz#1424612
|
||||
X-approved-upstream: true
|
||||
---
|
||||
cloudinit/settings.py | 1 +
|
||||
cloudinit/stages.py | 3 ++-
|
||||
doc/examples/cloud-config.txt | 4 ++++
|
||||
3 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/cloudinit/settings.py b/cloudinit/settings.py
|
||||
index 3a04a58..439eee0 100644
|
||||
--- a/cloudinit/settings.py
|
||||
+++ b/cloudinit/settings.py
|
||||
@@ -45,6 +45,7 @@ CFG_BUILTIN = {
|
||||
'None',
|
||||
],
|
||||
'def_log_file': '/var/log/cloud-init.log',
|
||||
+ 'def_log_file_mode': 0o600,
|
||||
'log_cfgs': [],
|
||||
'mount_default_fields': [None, None, 'auto', 'defaults,nofail', '0', '2'],
|
||||
'ssh_deletekeys': False,
|
||||
diff --git a/cloudinit/stages.py b/cloudinit/stages.py
|
||||
index 71f3a49..68b83af 100644
|
||||
--- a/cloudinit/stages.py
|
||||
+++ b/cloudinit/stages.py
|
||||
@@ -149,8 +149,9 @@ class Init(object):
|
||||
def _initialize_filesystem(self):
|
||||
util.ensure_dirs(self._initial_subdirs())
|
||||
log_file = util.get_cfg_option_str(self.cfg, 'def_log_file')
|
||||
+ log_file_mode = util.get_cfg_option_int(self.cfg, 'def_log_file_mode')
|
||||
if log_file:
|
||||
- util.ensure_file(log_file)
|
||||
+ util.ensure_file(log_file, mode=log_file_mode)
|
||||
perms = self.cfg.get('syslog_fix_perms')
|
||||
if not perms:
|
||||
perms = {}
|
||||
diff --git a/doc/examples/cloud-config.txt b/doc/examples/cloud-config.txt
|
||||
index eb84dcf..0e82b83 100644
|
||||
--- a/doc/examples/cloud-config.txt
|
||||
+++ b/doc/examples/cloud-config.txt
|
||||
@@ -413,10 +413,14 @@ timezone: US/Eastern
|
||||
# if syslog_fix_perms is a list, it will iterate through and use the
|
||||
# first pair that does not raise error.
|
||||
#
|
||||
+# 'def_log_file' will be created with mode 'def_log_file_mode', which
|
||||
+# is specified as a numeric value and defaults to 0600.
|
||||
+#
|
||||
# the default values are '/var/log/cloud-init.log' and 'syslog:adm'
|
||||
# the value of 'def_log_file' should match what is configured in logging
|
||||
# if either is empty, then no change of ownership will be done
|
||||
def_log_file: /var/log/my-logging-file.log
|
||||
+def_log_file_mode: 0600
|
||||
syslog_fix_perms: syslog:root
|
||||
|
||||
# you can set passwords for a user or multiple users
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,34 @@
|
||||
From e2b22710db558df261883eaf5dde866c69ba17dd Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Thu, 31 May 2018 20:00:32 +0200
|
||||
Subject: sysconfig: Don't write BOOTPROTO=dhcp for ipv6 dhcp
|
||||
|
||||
Don't write BOOTPROTO=dhcp for ipv6 dhcp, as BOOTPROTO applies
|
||||
only to ipv4. Explicitly write IPV6_AUTOCONF=no for dhcp on ipv6.
|
||||
|
||||
X-downstream-only: yes
|
||||
|
||||
Resolves: rhbz#1519271
|
||||
Signed-off-by: Ryan McCabe <rmccabe@redhat.com>
|
||||
|
||||
Merged patches (19.4):
|
||||
- 6444df4 sysconfig: Don't disable IPV6_AUTOCONF
|
||||
---
|
||||
tests/unittests/test_net.py | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
|
||||
index a931a3e..1306a0f 100644
|
||||
--- a/tests/unittests/test_net.py
|
||||
+++ b/tests/unittests/test_net.py
|
||||
@@ -1483,6 +1483,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
BOOTPROTO=none
|
||||
DEVICE=bond0
|
||||
DHCPV6C=yes
|
||||
+ IPV6_AUTOCONF=no
|
||||
IPV6INIT=yes
|
||||
MACADDR=aa:bb:cc:dd:ee:ff
|
||||
ONBOOT=yes
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From 9a09efb49c2d7cade1f0ac309293166c3c2d8d7b Mon Sep 17 00:00:00 2001
|
||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Date: Tue, 17 Apr 2018 13:07:54 +0200
|
||||
Subject: DataSourceAzure.py: use hostnamectl to set hostname
|
||||
|
||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Message-id: <20180417130754.12918-3-vkuznets@redhat.com>
|
||||
Patchwork-id: 79659
|
||||
O-Subject: [RHEL7.6/7.5.z cloud-init PATCH 2/2] DataSourceAzure.py: use hostnamectl to set hostname
|
||||
Bugzilla: 1568717
|
||||
RH-Acked-by: Eduardo Otubo <otubo@redhat.com>
|
||||
RH-Acked-by: Mohammed Gamal <mgamal@redhat.com>
|
||||
RH-Acked-by: Cathy Avery <cavery@redhat.com>
|
||||
|
||||
The right way to set hostname in RHEL7 is:
|
||||
|
||||
$ hostnamectl set-hostname HOSTNAME
|
||||
|
||||
DataSourceAzure, however, uses:
|
||||
$ hostname HOSTSNAME
|
||||
|
||||
instead and this causes problems. We can't simply change
|
||||
'BUILTIN_DS_CONFIG' in DataSourceAzure.py as 'hostname' is being used
|
||||
for both getting and setting the hostname.
|
||||
|
||||
Long term, this should be fixed in a different way. Cloud-init
|
||||
has distro-specific hostname setting/getting (see
|
||||
cloudinit/distros/rhel.py) and DataSourceAzure.py needs to be switched
|
||||
to use these.
|
||||
|
||||
Resolves: rhbz#1434109
|
||||
|
||||
X-downstream-only: yes
|
||||
|
||||
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
cloudinit/sources/DataSourceAzure.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
|
||||
index 24f448c..6fb889c 100755
|
||||
--- a/cloudinit/sources/DataSourceAzure.py
|
||||
+++ b/cloudinit/sources/DataSourceAzure.py
|
||||
@@ -256,7 +256,7 @@ def get_hostname(hostname_command='hostname'):
|
||||
|
||||
|
||||
def set_hostname(hostname, hostname_command='hostname'):
|
||||
- util.subp([hostname_command, hostname])
|
||||
+ util.subp(['hostnamectl', 'set-hostname', str(hostname)])
|
||||
|
||||
|
||||
@azure_ds_telemetry_reporter
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,65 @@
|
||||
From 13ee71a3add0dd2e7c60fc672134e696bd7f6a77 Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Wed, 20 Mar 2019 11:45:59 +0100
|
||||
Subject: include 'NOZEROCONF=yes' in /etc/sysconfig/network
|
||||
|
||||
RH-Author: Eduardo Otubo <otubo@redhat.com>
|
||||
Message-id: <20190320114559.23708-1-otubo@redhat.com>
|
||||
Patchwork-id: 84937
|
||||
O-Subject: [RHEL-7.7 cloud-init PATCH] include 'NOZEROCONF=yes' in /etc/sysconfig/network
|
||||
Bugzilla: 1653131
|
||||
RH-Acked-by: Cathy Avery <cavery@redhat.com>
|
||||
RH-Acked-by: Mohammed Gamal <mgamal@redhat.com>
|
||||
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
|
||||
The option NOZEROCONF=yes is not included by default in
|
||||
/etc/sysconfig/network, which is required by Overcloud instances. The
|
||||
patch also includes tests for the modifications.
|
||||
|
||||
X-downstream-only: yes
|
||||
Resolves: rhbz#1653131
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
cloudinit/net/sysconfig.py | 11 ++++++++++-
|
||||
tests/unittests/test_net.py | 1 -
|
||||
2 files changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
|
||||
index 8bd7e88..810b283 100644
|
||||
--- a/cloudinit/net/sysconfig.py
|
||||
+++ b/cloudinit/net/sysconfig.py
|
||||
@@ -754,7 +754,16 @@ class Renderer(renderer.Renderer):
|
||||
# Distros configuring /etc/sysconfig/network as a file e.g. Centos
|
||||
if sysconfig_path.endswith('network'):
|
||||
util.ensure_dir(os.path.dirname(sysconfig_path))
|
||||
- netcfg = [_make_header(), 'NETWORKING=yes']
|
||||
+ netcfg = []
|
||||
+ for line in util.load_file(sysconfig_path, quiet=True).split('\n'):
|
||||
+ if 'cloud-init' in line:
|
||||
+ break
|
||||
+ if not line.startswith(('NETWORKING=',
|
||||
+ 'IPV6_AUTOCONF=',
|
||||
+ 'NETWORKING_IPV6=')):
|
||||
+ netcfg.append(line)
|
||||
+ # Now generate the cloud-init portion of sysconfig/network
|
||||
+ netcfg.extend([_make_header(), 'NETWORKING=yes'])
|
||||
if network_state.use_ipv6:
|
||||
netcfg.append('NETWORKING_IPV6=yes')
|
||||
netcfg.append('IPV6_AUTOCONF=no')
|
||||
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
|
||||
index 1306a0f..a931a3e 100644
|
||||
--- a/tests/unittests/test_net.py
|
||||
+++ b/tests/unittests/test_net.py
|
||||
@@ -1483,7 +1483,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
|
||||
BOOTPROTO=none
|
||||
DEVICE=bond0
|
||||
DHCPV6C=yes
|
||||
- IPV6_AUTOCONF=no
|
||||
IPV6INIT=yes
|
||||
MACADDR=aa:bb:cc:dd:ee:ff
|
||||
ONBOOT=yes
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From 9d951d55a1be44bbeb5df485d14d4f84ddf01142 Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Mon, 2 Mar 2020 10:46:35 +0100
|
||||
Subject: Remove race condition between cloud-init and NetworkManager
|
||||
|
||||
Message-id: <20200302104635.11648-1-otubo@redhat.com>
|
||||
Patchwork-id: 94098
|
||||
O-Subject: [RHEL-7.9/RHEL-8.2.0 cloud-init PATCH] Remove race condition between cloud-init and NetworkManager
|
||||
Bugzilla: 1807797
|
||||
RH-Acked-by: Cathy Avery <cavery@redhat.com>
|
||||
RH-Acked-by: Mohammed Gamal <mgamal@redhat.com>
|
||||
|
||||
BZ: 1748015
|
||||
BRANCH: rhel7/master-18.5
|
||||
BREW: 26924611
|
||||
|
||||
BZ: 1807797
|
||||
BRANCH: rhel820/master-18.5
|
||||
BREW: 26924957
|
||||
|
||||
cloud-init service is set to start before NetworkManager service starts,
|
||||
but this does not avoid a race condition between them. NetworkManager
|
||||
starts before cloud-init can write `dns=none' to the file:
|
||||
/etc/NetworkManager/conf.d/99-cloud-init.conf. This way NetworkManager
|
||||
doesn't read the configuration and erases all resolv.conf values upon
|
||||
shutdown. On the next reboot neither cloud-init or NetworkManager will
|
||||
write anything to resolv.conf, leaving it blank.
|
||||
|
||||
This patch introduces a NM reload (try-restart) at the end of cloud-init
|
||||
start up so it won't erase resolv.conf upon first shutdown.
|
||||
|
||||
x-downstream-only: yes
|
||||
resolves: rhbz#1748015, rhbz#1807797 and rhbz#1804780
|
||||
|
||||
Signed-off-by: Eduardo Otubo otubo@redhat.com
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
rhel/systemd/cloud-final.service | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/rhel/systemd/cloud-final.service b/rhel/systemd/cloud-final.service
|
||||
index 739b7e3..f303483 100644
|
||||
--- a/rhel/systemd/cloud-final.service
|
||||
+++ b/rhel/systemd/cloud-final.service
|
||||
@@ -11,6 +11,8 @@ ExecStart=/usr/bin/cloud-init modules --mode=final
|
||||
RemainAfterExit=yes
|
||||
TimeoutSec=0
|
||||
KillMode=process
|
||||
+ExecStartPost=/bin/echo "try restart NetworkManager.service"
|
||||
+ExecStartPost=/usr/bin/systemctl try-restart NetworkManager.service
|
||||
|
||||
# Output needs to appear in instance console output
|
||||
StandardOutput=journal+console
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,488 @@
|
||||
From ec14b8ed9cb4264333b80b4361171b1b529c58f3 Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Tue, 3 Nov 2020 12:11:45 +0100
|
||||
Subject: [PATCH 3/5] Add config modules for controlling IBM PowerVM RMC.
|
||||
(#584)
|
||||
|
||||
RH-Author: Eduardo Terrell Ferrari Otubo (eterrell)
|
||||
RH-MergeRequest: 16: Add config modules for controlling IBM PowerVM RMC. (#584)
|
||||
RH-Commit: [1/1] 734e2c48d323af31aa36abefae346ef62ba3ef5d (eterrell/cloud-init)
|
||||
RH-Bugzilla: 1894014
|
||||
|
||||
commit f99d4f96b00a9cfec1c721d364cbfd728674e5dc
|
||||
Author: Aman306 <45781773+Aman306@users.noreply.github.com>
|
||||
Date: Wed Oct 28 23:36:09 2020 +0530
|
||||
|
||||
Add config modules for controlling IBM PowerVM RMC. (#584)
|
||||
|
||||
Reliable Scalable Cluster Technology (RSCT) is a set of software
|
||||
components that together provide a comprehensive clustering
|
||||
environment(RAS features) for IBM PowerVM based virtual machines. RSCT
|
||||
includes the Resource Monitoring and Control (RMC) subsystem. RMC is a
|
||||
generalized framework used for managing, monitoring, and manipulating
|
||||
resources. RMC runs as a daemon process on individual machines and needs
|
||||
creation of unique node id and restarts during VM boot.
|
||||
|
||||
LP: #1895979
|
||||
|
||||
Co-authored-by: Scott Moser <smoser@brickies.net>
|
||||
|
||||
Conflicts:
|
||||
* Calls to module subp.* are replaced by old calls to util.* since the
|
||||
patch that groups subp.* calls into its own module are introduced after
|
||||
19.4 release - and it's a huge reafctoring not worth the cherry-pick.
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
---
|
||||
cloudinit/config/cc_refresh_rmc_and_interface.py | 158 +++++++++++++++++++++
|
||||
cloudinit/config/cc_reset_rmc.py | 142 ++++++++++++++++++
|
||||
config/cloud.cfg.tmpl | 2 +
|
||||
.../test_handler_refresh_rmc_and_interface.py | 109 ++++++++++++++
|
||||
4 files changed, 411 insertions(+)
|
||||
create mode 100644 cloudinit/config/cc_refresh_rmc_and_interface.py
|
||||
create mode 100644 cloudinit/config/cc_reset_rmc.py
|
||||
create mode 100644 tests/unittests/test_handler/test_handler_refresh_rmc_and_interface.py
|
||||
|
||||
diff --git a/cloudinit/config/cc_refresh_rmc_and_interface.py b/cloudinit/config/cc_refresh_rmc_and_interface.py
|
||||
new file mode 100644
|
||||
index 0000000..07050c4
|
||||
--- /dev/null
|
||||
+++ b/cloudinit/config/cc_refresh_rmc_and_interface.py
|
||||
@@ -0,0 +1,158 @@
|
||||
+# (c) Copyright IBM Corp. 2020 All Rights Reserved
|
||||
+#
|
||||
+# Author: Aman Kumar Sinha <amansi26@in.ibm.com>
|
||||
+#
|
||||
+# This file is part of cloud-init. See LICENSE file for license information.
|
||||
+
|
||||
+"""
|
||||
+Refresh IPv6 interface and RMC
|
||||
+------------------------------
|
||||
+**Summary:** Ensure Network Manager is not managing IPv6 interface
|
||||
+
|
||||
+This module is IBM PowerVM Hypervisor specific
|
||||
+
|
||||
+Reliable Scalable Cluster Technology (RSCT) is a set of software components
|
||||
+that together provide a comprehensive clustering environment(RAS features)
|
||||
+for IBM PowerVM based virtual machines. RSCT includes the Resource
|
||||
+Monitoring and Control (RMC) subsystem. RMC is a generalized framework used
|
||||
+for managing, monitoring, and manipulating resources. RMC runs as a daemon
|
||||
+process on individual machines and needs creation of unique node id and
|
||||
+restarts during VM boot.
|
||||
+More details refer
|
||||
+https://www.ibm.com/support/knowledgecenter/en/SGVKBA_3.2/admin/bl503_ovrv.htm
|
||||
+
|
||||
+This module handles
|
||||
+- Refreshing RMC
|
||||
+- Disabling NetworkManager from handling IPv6 interface, as IPv6 interface
|
||||
+ is used for communication between RMC daemon and PowerVM hypervisor.
|
||||
+
|
||||
+**Internal name:** ``cc_refresh_rmc_and_interface``
|
||||
+
|
||||
+**Module frequency:** per always
|
||||
+
|
||||
+**Supported distros:** RHEL
|
||||
+
|
||||
+"""
|
||||
+
|
||||
+from cloudinit import log as logging
|
||||
+from cloudinit.settings import PER_ALWAYS
|
||||
+from cloudinit import util
|
||||
+from cloudinit import netinfo
|
||||
+
|
||||
+import errno
|
||||
+
|
||||
+frequency = PER_ALWAYS
|
||||
+
|
||||
+LOG = logging.getLogger(__name__)
|
||||
+# Ensure that /opt/rsct/bin has been added to standard PATH of the
|
||||
+# distro. The symlink to rmcctrl is /usr/sbin/rsct/bin/rmcctrl .
|
||||
+RMCCTRL = 'rmcctrl'
|
||||
+
|
||||
+
|
||||
+def handle(name, _cfg, _cloud, _log, _args):
|
||||
+ if not util.which(RMCCTRL):
|
||||
+ LOG.debug("No '%s' in path, disabled", RMCCTRL)
|
||||
+ return
|
||||
+
|
||||
+ LOG.debug(
|
||||
+ 'Making the IPv6 up explicitly. '
|
||||
+ 'Ensuring IPv6 interface is not being handled by NetworkManager '
|
||||
+ 'and it is restarted to re-establish the communication with '
|
||||
+ 'the hypervisor')
|
||||
+
|
||||
+ ifaces = find_ipv6_ifaces()
|
||||
+
|
||||
+ # Setting NM_CONTROLLED=no for IPv6 interface
|
||||
+ # making it down and up
|
||||
+
|
||||
+ if len(ifaces) == 0:
|
||||
+ LOG.debug("Did not find any interfaces with ipv6 addresses.")
|
||||
+ else:
|
||||
+ for iface in ifaces:
|
||||
+ refresh_ipv6(iface)
|
||||
+ disable_ipv6(sysconfig_path(iface))
|
||||
+ restart_network_manager()
|
||||
+
|
||||
+
|
||||
+def find_ipv6_ifaces():
|
||||
+ info = netinfo.netdev_info()
|
||||
+ ifaces = []
|
||||
+ for iface, data in info.items():
|
||||
+ if iface == "lo":
|
||||
+ LOG.debug('Skipping localhost interface')
|
||||
+ if len(data.get("ipv4", [])) != 0:
|
||||
+ # skip this interface, as it has ipv4 addrs
|
||||
+ continue
|
||||
+ ifaces.append(iface)
|
||||
+ return ifaces
|
||||
+
|
||||
+
|
||||
+def refresh_ipv6(interface):
|
||||
+ # IPv6 interface is explicitly brought up, subsequent to which the
|
||||
+ # RMC services are restarted to re-establish the communication with
|
||||
+ # the hypervisor.
|
||||
+ util.subp(['ip', 'link', 'set', interface, 'down'])
|
||||
+ util.subp(['ip', 'link', 'set', interface, 'up'])
|
||||
+
|
||||
+
|
||||
+def sysconfig_path(iface):
|
||||
+ return '/etc/sysconfig/network-scripts/ifcfg-' + iface
|
||||
+
|
||||
+
|
||||
+def restart_network_manager():
|
||||
+ util.subp(['systemctl', 'restart', 'NetworkManager'])
|
||||
+
|
||||
+
|
||||
+def disable_ipv6(iface_file):
|
||||
+ # Ensuring that the communication b/w the hypervisor and VM is not
|
||||
+ # interrupted due to NetworkManager. For this purpose, as part of
|
||||
+ # this function, the NM_CONTROLLED is explicitly set to No for IPV6
|
||||
+ # interface and NetworkManager is restarted.
|
||||
+ try:
|
||||
+ contents = util.load_file(iface_file)
|
||||
+ except IOError as e:
|
||||
+ if e.errno == errno.ENOENT:
|
||||
+ LOG.debug("IPv6 interface file %s does not exist\n",
|
||||
+ iface_file)
|
||||
+ else:
|
||||
+ raise e
|
||||
+
|
||||
+ if 'IPV6INIT' not in contents:
|
||||
+ LOG.debug("Interface file %s did not have IPV6INIT", iface_file)
|
||||
+ return
|
||||
+
|
||||
+ LOG.debug("Editing interface file %s ", iface_file)
|
||||
+
|
||||
+ # Dropping any NM_CONTROLLED or IPV6 lines from IPv6 interface file.
|
||||
+ lines = contents.splitlines()
|
||||
+ lines = [line for line in lines if not search(line)]
|
||||
+ lines.append("NM_CONTROLLED=no")
|
||||
+
|
||||
+ with open(iface_file, "w") as fp:
|
||||
+ fp.write("\n".join(lines) + "\n")
|
||||
+
|
||||
+
|
||||
+def search(contents):
|
||||
+ # Search for any NM_CONTROLLED or IPV6 lines in IPv6 interface file.
|
||||
+ return(
|
||||
+ contents.startswith("IPV6ADDR") or
|
||||
+ contents.startswith("IPADDR6") or
|
||||
+ contents.startswith("IPV6INIT") or
|
||||
+ contents.startswith("NM_CONTROLLED"))
|
||||
+
|
||||
+
|
||||
+def refresh_rmc():
|
||||
+ # To make a healthy connection between RMC daemon and hypervisor we
|
||||
+ # refresh RMC. With refreshing RMC we are ensuring that making IPv6
|
||||
+ # down and up shouldn't impact communication between RMC daemon and
|
||||
+ # hypervisor.
|
||||
+ # -z : stop Resource Monitoring & Control subsystem and all resource
|
||||
+ # managers, but the command does not return control to the user
|
||||
+ # until the subsystem and all resource managers are stopped.
|
||||
+ # -s : start Resource Monitoring & Control subsystem.
|
||||
+ try:
|
||||
+ util.subp([RMCCTRL, '-z'])
|
||||
+ util.subp([RMCCTRL, '-s'])
|
||||
+ except Exception:
|
||||
+ util.logexc(LOG, 'Failed to refresh the RMC subsystem.')
|
||||
+ raise
|
||||
diff --git a/cloudinit/config/cc_reset_rmc.py b/cloudinit/config/cc_reset_rmc.py
|
||||
new file mode 100644
|
||||
index 0000000..68373ad
|
||||
--- /dev/null
|
||||
+++ b/cloudinit/config/cc_reset_rmc.py
|
||||
@@ -0,0 +1,142 @@
|
||||
+# (c) Copyright IBM Corp. 2020 All Rights Reserved
|
||||
+#
|
||||
+# Author: Aman Kumar Sinha <amansi26@in.ibm.com>
|
||||
+#
|
||||
+# This file is part of cloud-init. See LICENSE file for license information.
|
||||
+
|
||||
+
|
||||
+"""
|
||||
+Reset RMC
|
||||
+------------
|
||||
+**Summary:** reset rsct node id
|
||||
+
|
||||
+Reset RMC module is IBM PowerVM Hypervisor specific
|
||||
+
|
||||
+Reliable Scalable Cluster Technology (RSCT) is a set of software components,
|
||||
+that together provide a comprehensive clustering environment (RAS features)
|
||||
+for IBM PowerVM based virtual machines. RSCT includes the Resource monitoring
|
||||
+and control (RMC) subsystem. RMC is a generalized framework used for managing,
|
||||
+monitoring, and manipulating resources. RMC runs as a daemon process on
|
||||
+individual machines and needs creation of unique node id and restarts
|
||||
+during VM boot.
|
||||
+More details refer
|
||||
+https://www.ibm.com/support/knowledgecenter/en/SGVKBA_3.2/admin/bl503_ovrv.htm
|
||||
+
|
||||
+This module handles
|
||||
+- creation of the unique RSCT node id to every instance/virtual machine
|
||||
+ and ensure once set, it isn't changed subsequently by cloud-init.
|
||||
+ In order to do so, it restarts RSCT service.
|
||||
+
|
||||
+Prerequisite of using this module is to install RSCT packages.
|
||||
+
|
||||
+**Internal name:** ``cc_reset_rmc``
|
||||
+
|
||||
+**Module frequency:** per instance
|
||||
+
|
||||
+**Supported distros:** rhel, sles and ubuntu
|
||||
+
|
||||
+"""
|
||||
+import os
|
||||
+
|
||||
+from cloudinit import log as logging
|
||||
+from cloudinit.settings import PER_INSTANCE
|
||||
+from cloudinit import util
|
||||
+
|
||||
+frequency = PER_INSTANCE
|
||||
+
|
||||
+# RMCCTRL is expected to be in system PATH (/opt/rsct/bin)
|
||||
+# The symlink for RMCCTRL and RECFGCT are
|
||||
+# /usr/sbin/rsct/bin/rmcctrl and
|
||||
+# /usr/sbin/rsct/install/bin/recfgct respectively.
|
||||
+RSCT_PATH = '/opt/rsct/install/bin'
|
||||
+RMCCTRL = 'rmcctrl'
|
||||
+RECFGCT = 'recfgct'
|
||||
+
|
||||
+LOG = logging.getLogger(__name__)
|
||||
+
|
||||
+NODE_ID_FILE = '/etc/ct_node_id'
|
||||
+
|
||||
+
|
||||
+def handle(name, _cfg, cloud, _log, _args):
|
||||
+ # Ensuring node id has to be generated only once during first boot
|
||||
+ if cloud.datasource.platform_type == 'none':
|
||||
+ LOG.debug('Skipping creation of new ct_node_id node')
|
||||
+ return
|
||||
+
|
||||
+ if not os.path.isdir(RSCT_PATH):
|
||||
+ LOG.debug("module disabled, RSCT_PATH not present")
|
||||
+ return
|
||||
+
|
||||
+ orig_path = os.environ.get('PATH')
|
||||
+ try:
|
||||
+ add_path(orig_path)
|
||||
+ reset_rmc()
|
||||
+ finally:
|
||||
+ if orig_path:
|
||||
+ os.environ['PATH'] = orig_path
|
||||
+ else:
|
||||
+ del os.environ['PATH']
|
||||
+
|
||||
+
|
||||
+def reconfigure_rsct_subsystems():
|
||||
+ # Reconfigure the RSCT subsystems, which includes removing all RSCT data
|
||||
+ # under the /var/ct directory, generating a new node ID, and making it
|
||||
+ # appear as if the RSCT components were just installed
|
||||
+ try:
|
||||
+ out = util.subp([RECFGCT])[0]
|
||||
+ LOG.debug(out.strip())
|
||||
+ return out
|
||||
+ except util.ProcessExecutionError:
|
||||
+ util.logexc(LOG, 'Failed to reconfigure the RSCT subsystems.')
|
||||
+ raise
|
||||
+
|
||||
+
|
||||
+def get_node_id():
|
||||
+ try:
|
||||
+ fp = util.load_file(NODE_ID_FILE)
|
||||
+ node_id = fp.split('\n')[0]
|
||||
+ return node_id
|
||||
+ except Exception:
|
||||
+ util.logexc(LOG, 'Failed to get node ID from file %s.' % NODE_ID_FILE)
|
||||
+ raise
|
||||
+
|
||||
+
|
||||
+def add_path(orig_path):
|
||||
+ # Adding the RSCT_PATH to env standard path
|
||||
+ # So thet cloud init automatically find and
|
||||
+ # run RECFGCT to create new node_id.
|
||||
+ suff = ":" + orig_path if orig_path else ""
|
||||
+ os.environ['PATH'] = RSCT_PATH + suff
|
||||
+ return os.environ['PATH']
|
||||
+
|
||||
+
|
||||
+def rmcctrl():
|
||||
+ # Stop the RMC subsystem and all resource managers so that we can make
|
||||
+ # some changes to it
|
||||
+ try:
|
||||
+ return util.subp([RMCCTRL, '-z'])
|
||||
+ except Exception:
|
||||
+ util.logexc(LOG, 'Failed to stop the RMC subsystem.')
|
||||
+ raise
|
||||
+
|
||||
+
|
||||
+def reset_rmc():
|
||||
+ LOG.debug('Attempting to reset RMC.')
|
||||
+
|
||||
+ node_id_before = get_node_id()
|
||||
+ LOG.debug('Node ID at beginning of module: %s', node_id_before)
|
||||
+
|
||||
+ # Stop the RMC subsystem and all resource managers so that we can make
|
||||
+ # some changes to it
|
||||
+ rmcctrl()
|
||||
+ reconfigure_rsct_subsystems()
|
||||
+
|
||||
+ node_id_after = get_node_id()
|
||||
+ LOG.debug('Node ID at end of module: %s', node_id_after)
|
||||
+
|
||||
+ # Check if new node ID is generated or not
|
||||
+ # by comparing old and new node ID
|
||||
+ if node_id_after == node_id_before:
|
||||
+ msg = 'New node ID did not get generated.'
|
||||
+ LOG.error(msg)
|
||||
+ raise Exception(msg)
|
||||
diff --git a/config/cloud.cfg.tmpl b/config/cloud.cfg.tmpl
|
||||
index 87c37ba..52a259c 100644
|
||||
--- a/config/cloud.cfg.tmpl
|
||||
+++ b/config/cloud.cfg.tmpl
|
||||
@@ -121,6 +121,8 @@ cloud_final_modules:
|
||||
- mcollective
|
||||
{% endif %}
|
||||
- salt-minion
|
||||
+ - reset_rmc
|
||||
+ - refresh_rmc_and_interface
|
||||
- rightscale_userdata
|
||||
- scripts-vendor
|
||||
- scripts-per-once
|
||||
diff --git a/tests/unittests/test_handler/test_handler_refresh_rmc_and_interface.py b/tests/unittests/test_handler/test_handler_refresh_rmc_and_interface.py
|
||||
new file mode 100644
|
||||
index 0000000..0c35710
|
||||
--- /dev/null
|
||||
+++ b/tests/unittests/test_handler/test_handler_refresh_rmc_and_interface.py
|
||||
@@ -0,0 +1,109 @@
|
||||
+from cloudinit.config import cc_refresh_rmc_and_interface as ccrmci
|
||||
+
|
||||
+from cloudinit import util
|
||||
+
|
||||
+from cloudinit.tests import helpers as t_help
|
||||
+from cloudinit.tests.helpers import mock
|
||||
+
|
||||
+from textwrap import dedent
|
||||
+import logging
|
||||
+
|
||||
+LOG = logging.getLogger(__name__)
|
||||
+MPATH = "cloudinit.config.cc_refresh_rmc_and_interface"
|
||||
+NET_INFO = {
|
||||
+ 'lo': {'ipv4': [{'ip': '127.0.0.1',
|
||||
+ 'bcast': '', 'mask': '255.0.0.0',
|
||||
+ 'scope': 'host'}],
|
||||
+ 'ipv6': [{'ip': '::1/128',
|
||||
+ 'scope6': 'host'}], 'hwaddr': '',
|
||||
+ 'up': 'True'},
|
||||
+ 'env2': {'ipv4': [{'ip': '8.0.0.19',
|
||||
+ 'bcast': '8.0.0.255', 'mask': '255.255.255.0',
|
||||
+ 'scope': 'global'}],
|
||||
+ 'ipv6': [{'ip': 'fe80::f896:c2ff:fe81:8220/64',
|
||||
+ 'scope6': 'link'}], 'hwaddr': 'fa:96:c2:81:82:20',
|
||||
+ 'up': 'True'},
|
||||
+ 'env3': {'ipv4': [{'ip': '90.0.0.14',
|
||||
+ 'bcast': '90.0.0.255', 'mask': '255.255.255.0',
|
||||
+ 'scope': 'global'}],
|
||||
+ 'ipv6': [{'ip': 'fe80::f896:c2ff:fe81:8221/64',
|
||||
+ 'scope6': 'link'}], 'hwaddr': 'fa:96:c2:81:82:21',
|
||||
+ 'up': 'True'},
|
||||
+ 'env4': {'ipv4': [{'ip': '9.114.23.7',
|
||||
+ 'bcast': '9.114.23.255', 'mask': '255.255.255.0',
|
||||
+ 'scope': 'global'}],
|
||||
+ 'ipv6': [{'ip': 'fe80::f896:c2ff:fe81:8222/64',
|
||||
+ 'scope6': 'link'}], 'hwaddr': 'fa:96:c2:81:82:22',
|
||||
+ 'up': 'True'},
|
||||
+ 'env5': {'ipv4': [],
|
||||
+ 'ipv6': [{'ip': 'fe80::9c26:c3ff:fea4:62c8/64',
|
||||
+ 'scope6': 'link'}], 'hwaddr': '42:20:86:df:fa:4c',
|
||||
+ 'up': 'True'}}
|
||||
+
|
||||
+
|
||||
+class TestRsctNodeFile(t_help.CiTestCase):
|
||||
+ def test_disable_ipv6_interface(self):
|
||||
+ """test parsing of iface files."""
|
||||
+ fname = self.tmp_path("iface-eth5")
|
||||
+ util.write_file(fname, dedent("""\
|
||||
+ BOOTPROTO=static
|
||||
+ DEVICE=eth5
|
||||
+ HWADDR=42:20:86:df:fa:4c
|
||||
+ IPV6INIT=yes
|
||||
+ IPADDR6=fe80::9c26:c3ff:fea4:62c8/64
|
||||
+ IPV6ADDR=fe80::9c26:c3ff:fea4:62c8/64
|
||||
+ NM_CONTROLLED=yes
|
||||
+ ONBOOT=yes
|
||||
+ STARTMODE=auto
|
||||
+ TYPE=Ethernet
|
||||
+ USERCTL=no
|
||||
+ """))
|
||||
+
|
||||
+ ccrmci.disable_ipv6(fname)
|
||||
+ self.assertEqual(dedent("""\
|
||||
+ BOOTPROTO=static
|
||||
+ DEVICE=eth5
|
||||
+ HWADDR=42:20:86:df:fa:4c
|
||||
+ ONBOOT=yes
|
||||
+ STARTMODE=auto
|
||||
+ TYPE=Ethernet
|
||||
+ USERCTL=no
|
||||
+ NM_CONTROLLED=no
|
||||
+ """), util.load_file(fname))
|
||||
+
|
||||
+ @mock.patch(MPATH + '.refresh_rmc')
|
||||
+ @mock.patch(MPATH + '.restart_network_manager')
|
||||
+ @mock.patch(MPATH + '.disable_ipv6')
|
||||
+ @mock.patch(MPATH + '.refresh_ipv6')
|
||||
+ @mock.patch(MPATH + '.netinfo.netdev_info')
|
||||
+ @mock.patch(MPATH + '.util.which')
|
||||
+ def test_handle(self, m_refresh_rmc,
|
||||
+ m_netdev_info, m_refresh_ipv6, m_disable_ipv6,
|
||||
+ m_restart_nm, m_which):
|
||||
+ """Basic test of handle."""
|
||||
+ m_netdev_info.return_value = NET_INFO
|
||||
+ m_which.return_value = '/opt/rsct/bin/rmcctrl'
|
||||
+ ccrmci.handle(
|
||||
+ "refresh_rmc_and_interface", None, None, None, None)
|
||||
+ self.assertEqual(1, m_netdev_info.call_count)
|
||||
+ m_refresh_ipv6.assert_called_with('env5')
|
||||
+ m_disable_ipv6.assert_called_with(
|
||||
+ '/etc/sysconfig/network-scripts/ifcfg-env5')
|
||||
+ self.assertEqual(1, m_restart_nm.call_count)
|
||||
+ self.assertEqual(1, m_refresh_rmc.call_count)
|
||||
+
|
||||
+ @mock.patch(MPATH + '.netinfo.netdev_info')
|
||||
+ def test_find_ipv6(self, m_netdev_info):
|
||||
+ """find_ipv6_ifaces parses netdev_info returning those with ipv6"""
|
||||
+ m_netdev_info.return_value = NET_INFO
|
||||
+ found = ccrmci.find_ipv6_ifaces()
|
||||
+ self.assertEqual(['env5'], found)
|
||||
+
|
||||
+ @mock.patch(MPATH + '.util.subp')
|
||||
+ def test_refresh_ipv6(self, m_subp):
|
||||
+ """refresh_ipv6 should ip down and up the interface."""
|
||||
+ iface = "myeth0"
|
||||
+ ccrmci.refresh_ipv6(iface)
|
||||
+ m_subp.assert_has_calls([
|
||||
+ mock.call(['ip', 'link', 'set', iface, 'down']),
|
||||
+ mock.call(['ip', 'link', 'set', iface, 'up'])])
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,46 @@
|
||||
From 65b26a20b550ae301ca33eafe062a873f53969de Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Wed, 24 Jun 2020 07:34:32 +0200
|
||||
Subject: [PATCH 3/4] Change from redhat to rhel in systemd generator tmpl
|
||||
(#450)
|
||||
|
||||
RH-Author: Eduardo Otubo <otubo@redhat.com>
|
||||
Message-id: <20200623154034.28563-3-otubo@redhat.com>
|
||||
Patchwork-id: 97783
|
||||
O-Subject: [RHEL-8.3.0/RHEL-8.2.1 cloud-init PATCH 2/3] Change from redhat to rhel in systemd generator tmpl (#450)
|
||||
Bugzilla: 1834173
|
||||
RH-Acked-by: Cathy Avery <cavery@redhat.com>
|
||||
RH-Acked-by: Mohammed Gamal <mgamal@redhat.com>
|
||||
|
||||
commit 650d53d656b612442773453813d8417b234d3752
|
||||
Author: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Tue Jun 23 14:41:15 2020 +0200
|
||||
|
||||
Change from redhat to rhel in systemd generator tmpl (#450)
|
||||
|
||||
The name `redhat' is not used but rather `rhel' to identify the distro.
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
systemd/cloud-init-generator.tmpl | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/systemd/cloud-init-generator.tmpl b/systemd/cloud-init-generator.tmpl
|
||||
index 45efa24..0773356 100755
|
||||
--- a/systemd/cloud-init-generator.tmpl
|
||||
+++ b/systemd/cloud-init-generator.tmpl
|
||||
@@ -83,7 +83,7 @@ default() {
|
||||
|
||||
check_for_datasource() {
|
||||
local ds_rc=""
|
||||
-{% if variant in ["redhat", "fedora", "centos"] %}
|
||||
+{% if variant in ["rhel", "fedora", "centos"] %}
|
||||
local dsidentify="/usr/libexec/cloud-init/ds-identify"
|
||||
{% else %}
|
||||
local dsidentify="/usr/lib/cloud-init/ds-identify"
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,47 @@
|
||||
From d210f4b6c23d2739f76f9ab348090bcf350c5177 Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Mon, 31 Aug 2020 09:44:05 +0200
|
||||
Subject: [PATCH] Changing notation of subp call
|
||||
|
||||
RH-Author: Eduardo Otubo <otubo@redhat.com>
|
||||
Message-id: <20200824142252.16298-1-otubo@redhat.com>
|
||||
Patchwork-id: 98215
|
||||
O-Subject: [RHEL-7.9.z/RHEL-8.2.1/RHEL-8.3.0 cloud-init PATCH] Changing notation of subp call
|
||||
Bugzilla: 1839662
|
||||
RH-Acked-by: Cathy Avery <cavery@redhat.com>
|
||||
RH-Acked-by: Mohammed Gamal <mgamal@redhat.com>
|
||||
|
||||
The previous patch was applied upstream on top of a refactoring that moves subp
|
||||
to its own module (3c551f6e, Move subp into its own module. (#416), release
|
||||
20.2).
|
||||
|
||||
Downstream we're not there yet, in order to avoid applying the above
|
||||
commit and add a huge refactoring, I'll just change this call and we can
|
||||
benefit of this changes in a future rebase.
|
||||
|
||||
x-downstream-only: yes
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
cloudinit/sources/helpers/vmware/imc/guestcust_util.py | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cloudinit/sources/helpers/vmware/imc/guestcust_util.py b/cloudinit/sources/helpers/vmware/imc/guestcust_util.py
|
||||
index a270d9f..816f52e 100644
|
||||
--- a/cloudinit/sources/helpers/vmware/imc/guestcust_util.py
|
||||
+++ b/cloudinit/sources/helpers/vmware/imc/guestcust_util.py
|
||||
@@ -136,8 +136,8 @@ def get_tools_config(section, key, defaultVal):
|
||||
cmd = ['vmware-toolbox-cmd', 'config', 'get', section, key]
|
||||
|
||||
try:
|
||||
- (outText, _) = subp.subp(cmd)
|
||||
- except subp.ProcessExecutionError as e:
|
||||
+ (outText, _) = util.subp(cmd)
|
||||
+ except util.ProcessExecutionError as e:
|
||||
if e.exit_code == 69:
|
||||
logger.debug(
|
||||
"vmware-toolbox-cmd returned 69 (unavailable) for cmd: %s."
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,115 @@
|
||||
From 94753da021d0849f4858e2c2cb98b3276842b665 Mon Sep 17 00:00:00 2001
|
||||
From: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Mon, 24 Aug 2020 15:34:24 +0200
|
||||
Subject: [PATCH 1/5] DHCP sandboxing failing on noexec mounted /var/tmp (#521)
|
||||
|
||||
RH-Author: Eduardo Terrell Ferrari Otubo (eterrell)
|
||||
RH-MergeRequest: 1: DHCP sandboxing failing on noexec mounted /var/tmp (#521)
|
||||
RH-Commit: [1/1] 4971d742aa1de27dff61b07ef9d6d478c0889ded (eterrell/cloud-init)
|
||||
RH-Bugzilla: 1879989
|
||||
|
||||
commit db86753f81af73826158c9522f2521f210300e2b
|
||||
Author: Eduardo Otubo <otubo@redhat.com>
|
||||
Date: Mon Aug 24 15:34:24 2020 +0200
|
||||
|
||||
DHCP sandboxing failing on noexec mounted /var/tmp (#521)
|
||||
|
||||
* DHCP sandboxing failing on noexec mounted /var/tmp
|
||||
|
||||
If /var/tmp is mounted with noexec option the DHCP sandboxing will fail
|
||||
with Permission Denied. This patch simply avoids this error by checking
|
||||
the exec permission updating the dhcp path in negative case.
|
||||
|
||||
rhbz: https://bugzilla.redhat.com/show_bug.cgi?id=1879989
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
|
||||
* Replacing with os.* calls
|
||||
|
||||
* Adding test and removing isfile() useless call.
|
||||
|
||||
Co-authored-by: Rick Harding <rharding@mitechie.com>
|
||||
|
||||
Signed-off-by: Eduardo Otubo <otubo@redhat.com>
|
||||
---
|
||||
cloudinit/net/dhcp.py | 6 ++++++
|
||||
cloudinit/net/tests/test_dhcp.py | 46 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 52 insertions(+)
|
||||
|
||||
diff --git a/cloudinit/net/dhcp.py b/cloudinit/net/dhcp.py
|
||||
index c033cc8..841e72e 100644
|
||||
--- a/cloudinit/net/dhcp.py
|
||||
+++ b/cloudinit/net/dhcp.py
|
||||
@@ -215,6 +215,12 @@ def dhcp_discovery(dhclient_cmd_path, interface, cleandir):
|
||||
pid_file = os.path.join(cleandir, 'dhclient.pid')
|
||||
lease_file = os.path.join(cleandir, 'dhcp.leases')
|
||||
|
||||
+ # In some cases files in /var/tmp may not be executable, launching dhclient
|
||||
+ # from there will certainly raise 'Permission denied' error. Try launching
|
||||
+ # the original dhclient instead.
|
||||
+ if not os.access(sandbox_dhclient_cmd, os.X_OK):
|
||||
+ sandbox_dhclient_cmd = dhclient_cmd_path
|
||||
+
|
||||
# ISC dhclient needs the interface up to send initial discovery packets.
|
||||
# Generally dhclient relies on dhclient-script PREINIT action to bring the
|
||||
# link up before attempting discovery. Since we are using -sf /bin/true,
|
||||
diff --git a/cloudinit/net/tests/test_dhcp.py b/cloudinit/net/tests/test_dhcp.py
|
||||
index c3fa1e0..08e2cfb 100644
|
||||
--- a/cloudinit/net/tests/test_dhcp.py
|
||||
+++ b/cloudinit/net/tests/test_dhcp.py
|
||||
@@ -406,6 +406,52 @@ class TestDHCPDiscoveryClean(CiTestCase):
|
||||
'eth9', '-sf', '/bin/true'], capture=True)])
|
||||
m_kill.assert_has_calls([mock.call(my_pid, signal.SIGKILL)])
|
||||
|
||||
+ @mock.patch('cloudinit.net.dhcp.util.get_proc_ppid')
|
||||
+ @mock.patch('cloudinit.net.dhcp.os.kill')
|
||||
+ @mock.patch('cloudinit.net.dhcp.subp.subp')
|
||||
+ def test_dhcp_discovery_outside_sandbox(self, m_subp, m_kill, m_getppid):
|
||||
+ """dhcp_discovery brings up the interface and runs dhclient.
|
||||
+
|
||||
+ It also returns the parsed dhcp.leases file generated in the sandbox.
|
||||
+ """
|
||||
+ m_subp.return_value = ('', '')
|
||||
+ tmpdir = self.tmp_dir()
|
||||
+ dhclient_script = os.path.join(tmpdir, 'dhclient.orig')
|
||||
+ script_content = '#!/bin/bash\necho fake-dhclient'
|
||||
+ write_file(dhclient_script, script_content, mode=0o755)
|
||||
+ lease_content = dedent("""
|
||||
+ lease {
|
||||
+ interface "eth9";
|
||||
+ fixed-address 192.168.2.74;
|
||||
+ option subnet-mask 255.255.255.0;
|
||||
+ option routers 192.168.2.1;
|
||||
+ }
|
||||
+ """)
|
||||
+ lease_file = os.path.join(tmpdir, 'dhcp.leases')
|
||||
+ write_file(lease_file, lease_content)
|
||||
+ pid_file = os.path.join(tmpdir, 'dhclient.pid')
|
||||
+ my_pid = 1
|
||||
+ write_file(pid_file, "%d\n" % my_pid)
|
||||
+ m_getppid.return_value = 1 # Indicate that dhclient has daemonized
|
||||
+
|
||||
+ with mock.patch('os.access', return_value=False):
|
||||
+ self.assertCountEqual(
|
||||
+ [{'interface': 'eth9', 'fixed-address': '192.168.2.74',
|
||||
+ 'subnet-mask': '255.255.255.0', 'routers': '192.168.2.1'}],
|
||||
+ dhcp_discovery(dhclient_script, 'eth9', tmpdir))
|
||||
+ # dhclient script got copied
|
||||
+ with open(os.path.join(tmpdir, 'dhclient.orig')) as stream:
|
||||
+ self.assertEqual(script_content, stream.read())
|
||||
+ # Interface was brought up before dhclient called from sandbox
|
||||
+ m_subp.assert_has_calls([
|
||||
+ mock.call(
|
||||
+ ['ip', 'link', 'set', 'dev', 'eth9', 'up'], capture=True),
|
||||