'Push an image to a remote registry.'

@conductor_only
def push(self, image_id, service_name, tag=None, namespace=None, url=None, username=None, password=None, repository_prefix=None, **kwargs):

    auth_config = {'username': username, 'password': password}
    build_stamp = self.get_build_stamp_for_image(image_id)
    tag = (tag or build_stamp)
    if repository_prefix:
        image_name = '{}-{}'.format(repository_prefix, service_name)
    elif (repository_prefix is None):
        image_name = '{}-{}'.format(self.project_name, service_name)
    elif (repository_prefix == ''):
        image_name = service_name
    repository = '{}/{}'.format(namespace, image_name)
    if (url != self.default_registry_url):
        url = REMOVE_HTTP.sub('', url)
        repository = ('%s/%s' % (url.rstrip('/'), repository))
    logger.info(('Tagging    %s' % repository))
    self.client.api.tag(image_id, repository, tag=tag)
    logger.info(('Pushing    %s:%s...' % (repository, tag)))
    stream = self.client.api.push(repository, tag=tag, stream=True, auth_config=auth_config)
    last_status = None
    for data in stream:
        data = data.splitlines()
        for line in data:
            line = json.loads(line)
            if ((type(line) is dict) and ('error' in line)):
                plainLogger.error(line['error'])
            if ((type(line) is dict) and ('status' in line)):
                if (line['status'] != last_status):
                    plainLogger.info(line['status'])
                last_status = line['status']
            else:
                plainLogger.debug(line)
