After a significant amount of investigation I've found out several things about this bug: 1) the unitdata.set() that happens at [1] is only actually written to the file at the end of successful hook/action execution. 2) In my deployment, running the action openstack-upgrade with --wait shows that the action actually fails, despite having upgraded the packages successfully. It fails at [2] and does not even get to perform a db migration sync. 3) Diving deeper into [2], at [3] it gets a list of relation interfaces to process and render config files based on. When running 3 manila units, the cluster interface is present with class relations.openstack-ha.peers.OpenstackHAPeers. When running only 1 manila unit, the cluster interface is not present, and the upgrade does not fail (for me, in my deployment) 4) Diving deeper at [3], at [4] it processes the interfaces, notice an interesting "except TypeError" there, more on this later. The constructor invoked through the variable class instantiation eventually reaches [5], where it iterates through the interfaces and at [6] it hits the problem where it tries to set the attribute to the relation adapters class. The attribute being 'cluster', and the value being the class OpenstackHAPeers. When it fails, there are absolutely no errors in the logs. The action run with --wait finishes with the following fields: message: can't set attribute status: failed Those are easily overlooked due to the other stdout printed, such as packages installed during the upgrade. Fortunately this is an action that can be repeated over and over until successful. That message "can't set attribute" is actually an AttributeError (not a TypeError). By adding an extra try/except block I can capture it and confirm it. No traceback information though (if I did things correctly). Also, adding the AttributeError to the outer try/except definition does not solve the problem because it is just invoked again and fails the same way. So I added extra logging such as: hookenv.log("TEST LOG: {} {} {} {} {}".format(relation,adapter_name,adapter,self,self.__dict__)) just above [6] and it printed the following: TEST DATA: cluster {'_charm_instance_weakref': , '_relations': {'options', 'amqp'}, 'options': , '_adapters': {'amqp': , 'shared_db': , 'cluster': , 'coordinator_memcached': }, 'amqp': } I was unsure whether this was correct or not, so I compared to the placement charm which does not fail. It prints the following: TEST DATA: cluster {'_charm_instance_weakref': , '_relations': {'options'}, 'options': , '_adapters': {'amqp': , 'shared_db': , 'cluster': , 'coordinator_memcached': }} Diff'ing those two I noticed specific classes such as charm.openstack.manila.ManilaRelationAdapters and charm.openstack.manila.TransportURLAdapter that may be causing the issue. I edited the manila charm files and removed that customization from [7] and their definitions from that file. The result was: TEST DATA: cluster {'_charm_instance_weakref': , '_relations': {'options', 'amqp'}, 'options': , '_adapters': {'amqp': , 'shared_db': , 'cluster': , 'coordinator_memcached': }, 'amqp': } and it still failed exactly in the same place. While looping through the interfaces, it goes first through the 'amqp' interface (that's why that is an extra field when compared to placement's), and it sets the attribute correctly, but 'cluster' attribute will not. I also noticed that for placement there is an APIConfigurationAdapter class while for manila there is DefaultConfigurationAdapter, however I haven't found where that is declared in the code to make that adjustment. [1] https://github.com/openstack/charms.openstack/blob/10627ee5f991c268f174d6d100e218a0e1867af1/charms_openstack/charm/core.py#L1142 [2] https://github.com/openstack/charms.openstack/blob/10627ee5f991c268f174d6d100e218a0e1867af1/charms_openstack/charm/core.py#L1145 [3] https://github.com/openstack/charms.openstack/blob/10627ee5f991c268f174d6d100e218a0e1867af1/charms_openstack/charm/core.py#L957 [4] https://github.com/openstack/charms.openstack/blob/10627ee5f991c268f174d6d100e218a0e1867af1/charms_openstack/charm/core.py#L961 [5] https://github.com/openstack/charms.openstack/blob/d049eee8f47e3913123762b6cd4f493e8ff0d18d/charms_openstack/adapters.py#L1236 [6] https://github.com/openstack/charms.openstack/blob/d049eee8f47e3913123762b6cd4f493e8ff0d18d/charms_openstack/adapters.py#L1313 [7] https://github.com/openstack/charm-manila/blob/f2ab722fe8f6c8083d6b7a0a1d962bf44ff795cc/src/lib/charm/openstack/manila.py#L198