package-update-upgrade-install does not update when run with --frequency=always

Bug #1785225 reported by Sirio Balmelli on 2018-08-03
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
cloud-init
Medium
Unassigned

Bug Description

1. The following stanzas in /etc/cloud/cloud.cfg:

```
cloud_final_modules:
  # always update+upgrade on boot
  - [package-update-upgrade-install, always]

packages: # will run apt-update
  - git
package_update: true
package_upgrade: true
package_reboot_if_required: true
```

2. Result in the following log entry at boot-time:

```
helpers.py[DEBUG]: update-sources already ran (freq=once-per-instance)
```

3. Running the module manually with:

```
sudo cloud-init single --name package-update-upgrade-install --frequency always
```

... also fails to call `apt-get update`

4. Google gives no results.
- No similar bugs visible here.
- No additional configuration keys shown in <https://cloudinit.readthedocs.io/en/latest/topics/modules.html#package-update-upgrade-install>.
- No relevant keys given in <https://cloudinit.readthedocs.io/en/latest/topics/modules.html#apt-configure>.
- Nowhere is "update-sources" mentioned.

5. Attempted guess at "update-sources" fails:

```
sudo cloud-init single --name update-sources --frequency always
```

6. Expected behavior is that `apt-get update` is executed before `apt-get install` every time the machine is booted.
On my system the install looks like:

```
['eatmydata', 'apt-get', '--option=Dpkg::Options::=--force-confold', '--option=Dpkg::options::=--force-unsafe-io', '--assume-yes', '--quiet', 'install', 'git']
```

7. Alternate behavior would be a way to explicitly request that an update be performed.
This was attempted/guessed-at with:

```
cloud_config_modules:
  - [apt-configure, always]
```

But did not obtain an update.
There seem to be no other applicable modules listed in <https://cloudinit.readthedocs.io/en/latest/topics/modules.html#>

8. Environment:
- Ubuntu 16.04.5 LTS
- /usr/bin/cloud-init 18.2

9. /etc/cloud/cloud.cfg
---
cloud_init_modules:
  - seed_random
  - bootcmd
  - set_hostname
  - update_hostname
  - update_etc_hosts
  - ca-certs
  - rsyslog
  - users-groups
  - ssh

cloud_config_modules:
  - emit_upstart
  - ssh-import-id
  - locale
  - set-passwords
  - grub-dpkg
  - timezone
  - [apt-configure, always]
  - [runcmd, always] # doesn't actually EXECUTE the modules - that's left for scripts-user :P

cloud_final_modules:
  - landscape
  - lxd
  - ssh-authkey-fingerprints
  - final-message
  - power-state-change
  - [package-update-upgrade-install, always]
  - [scripts-user, always]

system_info:
  distro: ubuntu
  paths:
    cloud_dir: /var/lib/cloud/
    templates_dir: /etc/cloud/templates/
    upstart_dir: /etc/init/
  ssh_svcname: ssh

disable_root: true

datasource_list: [NoCloud, None]

preserve_hostname: false
hostname: {hostname}
manage_etc_hosts: true

apt:
  preserve_sources_list: false
  primary:
    - arches:
        - amd64
        - i386
        - default
      uri: "http://archive.ubuntu.com/ubuntu/"
      search:
        - "http://ch.archive.ubuntu.com/ubuntu"
        - "http://us.archive.ubuntu.com/ubuntu"
      search_dns: true
  security:
    - arches:
        - amd64
        - i386
        - default
      uri: "http://security.ubuntu.com/ubuntu/"
      search_dns: true
  # (custom PPAs elided)
  sources_list: |
    deb http://archive.ubuntu.com/ubuntu/ xenial main restricted
    deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted
    deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted
    deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted
    deb http://archive.ubuntu.com/ubuntu/ xenial universe
    deb-src http://archive.ubuntu.com/ubuntu/ xenial universe
    deb http://archive.ubuntu.com/ubuntu/ xenial-updates universe
    deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates universe
    deb http://archive.ubuntu.com/ubuntu/ xenial multiverse
    deb-src http://archive.ubuntu.com/ubuntu/ xenial multiverse
    deb http://archive.ubuntu.com/ubuntu/ xenial-updates multiverse
    deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates multiverse
    deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://security.ubuntu.com/ubuntu/ xenial-security main restricted
    deb-src http://security.ubuntu.com/ubuntu/ xenial-security main restricted
    deb http://security.ubuntu.com/ubuntu/ xenial-security universe
    deb-src http://security.ubuntu.com/ubuntu/ xenial-security universe
    deb http://security.ubuntu.com/ubuntu/ xenial-security multiverse
    deb-src http://security.ubuntu.com/ubuntu/ xenial-security multiverse
runcmd:
  - [echo, startup run $(date)]

packages: # SHOULD run apt-update; does not
  - git
package_update: true
package_upgrade: true
package_reboot_if_required: true

description: updated
summary: - package-update-upgrade-install does not *actually* update
+ package-update-upgrade-install does not update when run with frequency
+ always
summary: - package-update-upgrade-install does not update when run with frequency
- always
+ package-update-upgrade-install does not update when run with
+ --frequency=always
Ryan Harper (raharper) wrote :

Hi,

Thanks for filing the bug.

It appears that the distro.update_package_sources() runs with hardcoded frequency=PER_INSTANCE.

    def update_package_sources(self):
        self._runner.run("update-sources", self.package_command,
                         ["update"], freq=PER_INSTANCE)

Cloud-init could supply the package-update-upgrade frequency when calling this distro method if configured.

Changed in cloud-init:
importance: Undecided → Medium
status: New → Triaged
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers