def monitor_download_status(self):
        log.debug('monitor-download', name=self.name)
        try:
            results = yield self._handler.netconf_client.get(self.download_status_xml)

            result_dict = xmltodict.parse(results.data_xml)
            entries = result_dict['data']['maintenance-jobs-state']['maintenance-job']

            name = entries.get('name')
            assert name == self._download_job_name, 'The job status name does not match. {} != {}'.format(name, self.name)
            self._download_state = self.monitor_state_to_download_state(entries['state']['#text'])

            completed = entries['timestamps'].get('completed-timestamp')
            started = entries['timestamps'].get('start-timestamp')

            if self._download_state == ImageDownload.DOWNLOAD_FAILED:
                self._failure_reason = ImageDownload.UNKNOWN_ERROR
                self._additional_info = entries['error'].get('error-message')

            elif self._download_state == ImageDownload.INSUFFICIENT_SPACE:
                self._failure_reason = ImageDownload.INSUFFICIENT_SPACE
                self._additional_info = entries['error'].get('error-message')

            elif self._download_state == ImageDownload.DOWNLOAD_STARTED:
                self._failure_reason = ImageDownload.NO_ERROR
                self._additional_info = 'Download started at {}'.format(started)

            elif self._download_state == ImageDownload.DOWNLOAD_SUCCEEDED:
                self._failure_reason = ImageDownload.NO_ERROR
                self._additional_info = 'Download completed at {}'.format(completed)
            else:
                raise NotImplemented('Unsupported state')

            done = self._download_state in [ImageDownload.DOWNLOAD_FAILED,
                                            ImageDownload.DOWNLOAD_SUCCEEDED,
                                            ImageDownload.INSUFFICIENT_SPACE]

        except Exception as e:
            log.exception('protocols', e=e)
            done = False

        if not done:
            self._deferred = reactor.callLater(1, self.monitor_download_status)

        returnValue('done' if done else 'not-done-yet')