'Return a heat-api signal URL for this resource.
This URL is not pre-signed, valid user credentials are required.
If a project_id is provided, it is used in place of the original
project_id. This is useful to generate a signal URL that uses
the heat stack user project instead of the user\'s.'

def _get_heat_signal_url(self, project_id=None):

    stored = self.data().get('heat_signal_url')
    if (stored is not None):
        return stored
    if (self.id is None):
        return
    url = self.client_plugin('heat').get_heat_url()
    path = self.identifier().url_path()
    if (project_id is not None):
        path = (project_id + path[path.find('/'):])
    url = urlparse.urljoin(url, ('%s/signal' % path))
    self.data_set('heat_signal_url', url)
    return url
