Looking at the charm code it looks like in check_for_upgrade() the c.previous('source') in
old_version = ceph.resolve_ceph_version(c.previous('source') or 'distro')
return distro and it doesn't return the previous value of cloud:focal-xena, thus causing distro to be octopus for focal and failing the upgrade.
Looking at the charm code it looks like in check_for_upgrade() the c.previous( 'source' ) in ceph_version( c.previous( 'source' ) or 'distro')
old_version = ceph.resolve_
return distro and it doesn't return the previous value of cloud:focal-xena, thus causing distro to be octopus for focal and failing the upgrade.