Comment 0 for bug 1736454

Colin Watson (cjwatson) wrote :

The LXD 2.0.11 SRU in xenial broke pylxd and hence broke Launchpad builds, as visible here:

  https://launchpadlibrarian.net/348160479/buildlog_snap_ubuntu_xenial_arm64_core_BUILDING.txt.gz

  /usr/lib/python2.7/dist-packages/pylxd/model.py:113: UserWarning: Attempted to set unknown attribute "used_by" on instance of "Profile"
    key, self.__class__.__name__
  /usr/lib/python2.7/dist-packages/pylxd/model.py:113: UserWarning: Attempted to set unknown attribute "description" on instance of "Container"
    key, self.__class__.__name__
  Traceback (most recent call last):
    File "/usr/share/launchpad-buildd/slavebin/in-target", line 27, in <module>
      sys.exit(main())
    File "/usr/share/launchpad-buildd/slavebin/in-target", line 23, in main
      return args.operation.run()
    File "/usr/lib/python2.7/dist-packages/lpbuildd/target/lifecycle.py", line 40, in run
      self.backend.start()
    File "/usr/lib/python2.7/dist-packages/lpbuildd/target/lxd.py", line 380, in start
      container.start(wait=True)
    File "/usr/lib/python2.7/dist-packages/pylxd/container.py", line 163, in start
      wait=wait)
    File "/usr/lib/python2.7/dist-packages/pylxd/container.py", line 151, in _set_state
      self.sync()
    File "/usr/lib/python2.7/dist-packages/pylxd/model.py", line 154, in sync
      setattr(self, key, val)
    File "/usr/lib/python2.7/dist-packages/pylxd/model.py", line 135, in __setattr__
      return super(Model, self).__setattr__(name, value)
  AttributeError: 'Container' object has no attribute 'description'

I initially thought this would require reverting LXD, but on inspection it's just adding some new attributes and it's really not its fault that pylxd is unnecessarily strict. This was fixed in pylxd upstream a while ago (https://github.com/lxc/pylxd/pull/234), and the fix is in 2.2.4 so >=artful is already fixed. zesty in principle requires the fix but I can't actually reproduce the bug there, so it's probably best to leave it alone for the time being. However, xenial's pylxd is currently broken.

[Test Case]

  >>> from pylxd import Client
  >>> client = Client()
  >>> client.profiles.get('default') # should produce no warnings
  >>> container = client.containers.create({"name": "test", "architecture": "x86_64", "profiles": ["default"], "source": {"type": "image", "mode": "pull", "server": "https://cloud-images.ubuntu.com/releases", "protocol": "simplestreams", "alias": "xenial"}}, wait=True)
  >>> container.start(wait=True) # should produce no warnings or exceptions

[Regression Potential]

The fix is to the code that marshals objects between the LXD server and the Python client code, so anything around there could in principle go wrong. I think running launchpad-buildd against it ought to exercise it fairly well.