Skip to content

reload_modules: True does not reload module dependencies #24925

Description

@klyr

Hi,

I would like to use the swiftexecution module to install an application.
For the swift execution module to be enabled, one need to install the python-swiftclient library first.

$ salt --versions-report
           Salt: 2015.5.2-120-g1650233
         Python: 2.7.6 (default, Mar 22 2014, 22:59:56)
         Jinja2: 2.7.2
       M2Crypto: 0.21.1
 msgpack-python: 0.4.6
   msgpack-pure: Not Installed
       pycrypto: 2.6.1
        libnacl: Not Installed
         PyYAML: 3.10
          ioflo: Not Installed
          PyZMQ: 14.0.1
           RAET: Not Installed
            ZMQ: 4.0.4
           Mako: Not Installed
        Tornado: Not Installed

Here is a simple SLS file:

python-swiftclient:
  pip.installed:
    - reload_modules: True

python-keystoneclient:
  pip.installed:
    - reload_modules: True

python-dev:
  pkg.installed

download_application:
  module.run:
    - name: swift.get
    - cont: test_container
    - path: test_app
    - local_file: /tmp/test_app
    - require:
      - pip: python-keystoneclient
      - pip: python-swiftclient

The execution of this SLS file fails at the download_application step because it says that the swift module is not present:

     Changes:
----------
          ID: download_application
    Function: module.run
        Name: swift.get
      Result: False
     Comment: Module function swift.get is not available
     Started: 12:42:28.767301
    Duration: 200.984 ms
     Changes:

In order to make it work, I need to restart the minion to be aware of the new python-swiftclient library being installed, and re-run the SLS file.

By looking at the source code, we can see that the python reload() function is called for the modules/swift.py module, so the module is effectively reloaded.

BUT, its dependencies are not (this is not the behaviour of the reload() function)

We can see at https://github.com/saltstack/salt/blob/develop/salt/modules/swift.py#L46 that swift.py imports salt.utils.openstack.swift that is "evaluated" once, on first import (re-importing a library does not mean the library is re-evaluated)

So at https://github.com/saltstack/salt/blob/develop/salt/utils/openstack/swift.py#L22 the following code is only executed once and the variable HAS_SWIFT is still set to False even after the swift.py module is reloaded because reload() does not reload python dependencies.

# Import Swift client libs
HAS_SWIFT = False
try:
    from swiftclient import client

    HAS_SWIFT = True
except ImportError:
    pass

Other modules like docker.io are not affected by this problem because they directly import third-party libraries and upon reloading, they retry to import these libraries. So installing docker-py with reload_modules: True enables the docker.io execution module without restarting the minion.

Adding a reload(suos) call in the virtual() function fixes the problem but this is not a clean solution.

Questions:

  • Do I install the third party library the right way ?
  • Should I expect that the installation of a third party library is taken into account without restarting the minion ?

Cheers.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Corerelates to code central or existential to SaltLoaderbugbroken, incorrect, or confusing behaviorseverity-medium3rd level, incorrect or bad functionality, confusing and lacks a work around

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions