Exemplo n.º 1
0
def add_to_file_cache(msg):
    """Add files in the message to received file cache."""
    with cache_lock:
        for uid in gen_dict_extract(msg.data, 'uid'):
            if uid not in file_cache:
                LOGGER.debug("Add %s to file cache", str(uid))
                file_cache.append(uid)
Exemplo n.º 2
0
    def ack(self, message):
        """Reply with ack to a publication
        """
        for url in gen_dict_extract(message.data, 'uri'):
            uri = urlparse(url)
            pathname = uri.path

            if 'origin' in self._attrs and not fnmatch.fnmatch(
                    os.path.basename(pathname),
                    os.path.basename(globify(self._attrs["origin"]))):
                LOGGER.warning('Client trying to get invalid file: %s',
                               pathname)
                return Message(message.subject,
                               "err",
                               data="{0:s} not reacheable".format(pathname))

            if (self._attrs.get('compression') or self._attrs.get(
                    'delete', 'False').lower() in ["1", "yes", "true", "on"]):
                self._deleter.add(pathname)
        new_msg = Message(message.subject, "ack", data=message.data.copy())
        try:
            new_msg.data['destination'] = clean_url(
                new_msg.data['destination'])
        except KeyError:
            pass
        return new_msg
Exemplo n.º 3
0
def get_msg_uid(msg):
    """Compute the uid of the message."""
    filenames = sorted(gen_dict_extract(msg.data, 'uid'))
    m = hashlib.md5()
    for filename in filenames:
        m.update(filename.encode('utf-8'))
    return m.hexdigest()
Exemplo n.º 4
0
    def run(self):
        with Subscribe('', topics=self.attrs['listen'],
                       addr_listener=True) as sub:
            for msg in sub.recv(1):
                if msg is None:
                    if not self.loop:
                        break
                    else:
                        continue

                # check that files are local
                for uri in gen_dict_extract(msg.data, 'uri'):
                    urlobj = urlparse(uri)
                    if (urlobj.scheme not in ['', 'file']
                            and not socket.gethostbyname(
                                urlobj.netloc) in get_local_ips()):
                        break
                else:
                    LOGGER.debug('We have a match: %s', str(msg))

                    #pathname = unpack(orig_pathname, **attrs)

                    info = self.attrs.get("info", {})
                    if info:
                        info = dict((elt.strip().split('=')
                                     for elt in info.split(";")))
                        for infokey, infoval in info.items():
                            if "," in infoval:
                                info[infokey] = infoval.split(",")

                    # info.update(parse(attrs["origin"], orig_pathname))
                    # info['uri'] = pathname
                    # info['uid'] = os.path.basename(pathname)
                    info.update(msg.data)
                    info['request_address'] = self.attrs.get(
                        "request_address",
                        get_own_ip()) + ":" + self.attrs["request_port"]
                    old_data = msg.data
                    msg = Message(self.attrs["topic"], msg.type, info)
                    self.publisher.send(str(msg))
                    with file_cache_lock:
                        for filename in gen_dict_extract(old_data, 'uid'):
                            file_cache.appendleft(self.attrs["topic"] + '/' +
                                                  filename)
                    LOGGER.debug("Message sent: " + str(msg))
                    if not self.loop:
                        break
Exemplo n.º 5
0
def already_received(msg):
    """Check if the files from msg already are in the local cache."""
    with cache_lock:
        for filename in gen_dict_extract(msg.data, 'uid'):
            if filename not in file_cache:
                return False
        else:
            return True
Exemplo n.º 6
0
def resend_if_local(msg, publisher):
    """Resend the message provided all uris point to local files."""
    for uri in gen_dict_extract(msg.data, 'uri'):
        urlobj = urlparse(uri)
        if not publisher or not socket.gethostbyname(urlobj.netloc) in get_local_ips():
            return
    else:
        LOGGER.debug('Sending: %s', str(msg))
        publisher.send(str(msg))
Exemplo n.º 7
0
    def test_gen_dict_extract_message(self):
        """Test extracting info from message data dictionary."""
        orig = (
            'pytroll://tm1 file [email protected] 2018-10-25T01:15:54.752065 v1.01 application/json '
            '{"sensor": "viirs", "format": "SDR", "variant": "DR", "uid": "bla.png", "uri": "/home/user/bla.png"}'
        )
        expected_uid = ['bla.png']

        res = list(gen_dict_extract(Message(rawstr=orig).data, 'uid'))

        self.assertListEqual(expected_uid, res)
Exemplo n.º 8
0
    def test_translate_dict_value(self):
        """Test message data dictionary value translation."""
        msg = Message(rawstr=test_msg)
        orig_data = copy.deepcopy(msg.data)

        res = translate_dict_value(msg.data, 'uri',
                                   dummy_callback_translate_dict_values)
        for uri in gen_dict_extract(res, 'uri'):
            self.assertTrue(uri.startswith(DEST_DIR))

        self.assertDictEqual(orig_data, msg.data)
Exemplo n.º 9
0
def request_push(msg,
                 destination,
                 login,
                 publisher=None,
                 unpack=None,
                 delete=False,
                 **kwargs):
    if already_received(msg):
        resend_if_local(msg, publisher)
        mtype = 'ack'
        req = Message(msg.subject, mtype, data=msg.data)
        LOGGER.debug("Sending: %s", str(req))
        timeout = float(kwargs["req_timeout"])
    else:
        mtype = 'push'
        req, fake_req = create_push_req_message(msg, destination, login)
        LOGGER.info("Requesting: %s", str(fake_req))
        timeout = float(kwargs["transfer_req_timeout"])
        local_dir = create_local_dir(destination, kwargs.get('ftp_root', '/'))

    LOGGER.debug("Send and recv timeout is %.2f seconds", timeout)

    hostname, port = msg.data["request_address"].split(":")
    requester = PushRequester(hostname, int(port))
    response = requester.send_and_recv(req, timeout=timeout)

    if response and response.type in ['file', 'collection', 'dataset']:
        LOGGER.debug("Server done sending file")
        with cache_lock:
            for uid in gen_dict_extract(msg.data, 'uid'):
                file_cache.append(uid)
        try:
            lmsg = unpack_and_create_local_message(response, local_dir, unpack,
                                                   delete)
        except IOError:
            LOGGER.exception("Couldn't unpack %s", str(response))
            return
        if publisher:
            lmsg = make_uris(lmsg, destination, login)
            lmsg.data['origin'] = response.data['request_address']
            lmsg.data.pop('request_address', None)
            lmsg = replace_mda(lmsg, kwargs)
            lmsg.data.pop('destination', None)

            LOGGER.debug("publishing %s", str(lmsg))
            publisher.send(str(lmsg))

    elif response and response.type == "ack":
        pass
    else:
        LOGGER.error("Failed to get valid response from server %s: %s",
                     str(hostname), str(response))
Exemplo n.º 10
0
    def ack(self, message):
        """Reply with ack to a publication."""
        new_msg = None
        for url in gen_dict_extract(message.data, 'uri'):
            pathname = urlparse(url).path
            new_msg = self._validate_requested_file(pathname, message)
            if new_msg is not None:
                break
            self._add_to_deleter(pathname)

        if new_msg is None:
            new_msg = _get_cleaned_ack_message(message)

        return new_msg
Exemplo n.º 11
0
    def test_real_translate(self):
        msg = Message(rawstr=test_msg)
        orig_data = copy.deepcopy(msg.data)

        def dummy_cb(k, v):
            dirname, filename = os.path.split(v)
            return os.path.join(dest_dir, filename)

        dest_dir = '/tmp'
        res = translate_dict_value(msg.data, 'uri', dummy_cb)
        for uri in gen_dict_extract(res, 'uri'):
            self.assertTrue(uri.startswith(dest_dir))

        self.assertDictEqual(orig_data, msg.data)
Exemplo n.º 12
0
    def test_gen_dict_extract_dictionary(self):
        """Test extracting info from dictionary."""
        test_dict = {
            'sensor':
            'viirs',
            'format':
            'SDR',
            'variant':
            'DR',
            'start_time':
            datetime.datetime(2018, 10, 25, 1, 1, 46),
            'orbit_number':
            36230,
            'dataset': [{
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/GMTCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011335298494_cspp_dev.h5',
                'uid':
                'GMTCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011335298494_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM01_npp_d20181025_t0101464_e0103106_b36230_c20181025011354163052_cspp_dev.h5',
                'uid':
                'SVM01_npp_d20181025_t0101464_e0103106_b36230_c20181025011354163052_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM02_npp_d20181025_t0101464_e0103106_b36230_c20181025011354178693_cspp_dev.h5',
                'uid':
                'SVM02_npp_d20181025_t0101464_e0103106_b36230_c20181025011354178693_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354194042_cspp_dev.h5',
                'uid':
                'SVM03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354194042_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354209273_cspp_dev.h5',
                'uid':
                'SVM04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354209273_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354224550_cspp_dev.h5',
                'uid':
                'SVM05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354224550_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM06_npp_d20181025_t0101464_e0103106_b36230_c20181025011354240108_cspp_dev.h5',
                'uid':
                'SVM06_npp_d20181025_t0101464_e0103106_b36230_c20181025011354240108_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM07_npp_d20181025_t0101464_e0103106_b36230_c20181025011354256470_cspp_dev.h5',
                'uid':
                'SVM07_npp_d20181025_t0101464_e0103106_b36230_c20181025011354256470_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM08_npp_d20181025_t0101464_e0103106_b36230_c20181025011354291614_cspp_dev.h5',
                'uid':
                'SVM08_npp_d20181025_t0101464_e0103106_b36230_c20181025011354291614_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM09_npp_d20181025_t0101464_e0103106_b36230_c20181025011354320585_cspp_dev.h5',
                'uid':
                'SVM09_npp_d20181025_t0101464_e0103106_b36230_c20181025011354320585_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM10_npp_d20181025_t0101464_e0103106_b36230_c20181025011354337251_cspp_dev.h5',
                'uid':
                'SVM10_npp_d20181025_t0101464_e0103106_b36230_c20181025011354337251_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM11_npp_d20181025_t0101464_e0103106_b36230_c20181025011354366238_cspp_dev.h5',
                'uid':
                'SVM11_npp_d20181025_t0101464_e0103106_b36230_c20181025011354366238_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM12_npp_d20181025_t0101464_e0103106_b36230_c20181025011354382899_cspp_dev.h5',
                'uid':
                'SVM12_npp_d20181025_t0101464_e0103106_b36230_c20181025011354382899_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM13_npp_d20181025_t0101464_e0103106_b36230_c20181025011354407042_cspp_dev.h5',
                'uid':
                'SVM13_npp_d20181025_t0101464_e0103106_b36230_c20181025011354407042_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM14_npp_d20181025_t0101464_e0103106_b36230_c20181025011354448503_cspp_dev.h5',
                'uid':
                'SVM14_npp_d20181025_t0101464_e0103106_b36230_c20181025011354448503_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM15_npp_d20181025_t0101464_e0103106_b36230_c20181025011354478025_cspp_dev.h5',
                'uid':
                'SVM15_npp_d20181025_t0101464_e0103106_b36230_c20181025011354478025_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM16_npp_d20181025_t0101464_e0103106_b36230_c20181025011354506942_cspp_dev.h5',
                'uid':
                'SVM16_npp_d20181025_t0101464_e0103106_b36230_c20181025011354506942_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/GITCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333965280_cspp_dev.h5',
                'uid':
                'GITCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333965280_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI01_npp_d20181025_t0101464_e0103106_b36230_c20181025011353975082_cspp_dev.h5',
                'uid':
                'SVI01_npp_d20181025_t0101464_e0103106_b36230_c20181025011353975082_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI02_npp_d20181025_t0101464_e0103106_b36230_c20181025011353990747_cspp_dev.h5',
                'uid':
                'SVI02_npp_d20181025_t0101464_e0103106_b36230_c20181025011353990747_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354006115_cspp_dev.h5',
                'uid':
                'SVI03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354006115_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354022377_cspp_dev.h5',
                'uid':
                'SVI04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354022377_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354093439_cspp_dev.h5',
                'uid':
                'SVI05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354093439_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/GDNBO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333695023_cspp_dev.h5',
                'uid':
                'GDNBO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333695023_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVDNB_npp_d20181025_t0101464_e0103106_b36230_c20181025011353771298_cspp_dev.h5',
                'uid':
                'SVDNB_npp_d20181025_t0101464_e0103106_b36230_c20181025011353771298_cspp_dev.h5'
            }],
            'platform_name':
            'Suomi-NPP',
            'orig_orbit_number':
            36230,
            'end_time':
            datetime.datetime(2018, 10, 25, 1, 3, 10),
            'type':
            'HDF5',
            'data_processing_level':
            '1B',
            'request_address':
            '10.120.1.40:9099'
        }  # noqa
        expected = [
            'GMTCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011335298494_cspp_dev.h5',
            'SVM01_npp_d20181025_t0101464_e0103106_b36230_c20181025011354163052_cspp_dev.h5',
            'SVM02_npp_d20181025_t0101464_e0103106_b36230_c20181025011354178693_cspp_dev.h5',
            'SVM03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354194042_cspp_dev.h5',
            'SVM04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354209273_cspp_dev.h5',
            'SVM05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354224550_cspp_dev.h5',
            'SVM06_npp_d20181025_t0101464_e0103106_b36230_c20181025011354240108_cspp_dev.h5',
            'SVM07_npp_d20181025_t0101464_e0103106_b36230_c20181025011354256470_cspp_dev.h5',
            'SVM08_npp_d20181025_t0101464_e0103106_b36230_c20181025011354291614_cspp_dev.h5',
            'SVM09_npp_d20181025_t0101464_e0103106_b36230_c20181025011354320585_cspp_dev.h5',
            'SVM10_npp_d20181025_t0101464_e0103106_b36230_c20181025011354337251_cspp_dev.h5',
            'SVM11_npp_d20181025_t0101464_e0103106_b36230_c20181025011354366238_cspp_dev.h5',
            'SVM12_npp_d20181025_t0101464_e0103106_b36230_c20181025011354382899_cspp_dev.h5',
            'SVM13_npp_d20181025_t0101464_e0103106_b36230_c20181025011354407042_cspp_dev.h5',
            'SVM14_npp_d20181025_t0101464_e0103106_b36230_c20181025011354448503_cspp_dev.h5',
            'SVM15_npp_d20181025_t0101464_e0103106_b36230_c20181025011354478025_cspp_dev.h5',
            'SVM16_npp_d20181025_t0101464_e0103106_b36230_c20181025011354506942_cspp_dev.h5',
            'GITCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333965280_cspp_dev.h5',
            'SVI01_npp_d20181025_t0101464_e0103106_b36230_c20181025011353975082_cspp_dev.h5',
            'SVI02_npp_d20181025_t0101464_e0103106_b36230_c20181025011353990747_cspp_dev.h5',
            'SVI03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354006115_cspp_dev.h5',
            'SVI04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354022377_cspp_dev.h5',
            'SVI05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354093439_cspp_dev.h5',
            'GDNBO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333695023_cspp_dev.h5',
            'SVDNB_npp_d20181025_t0101464_e0103106_b36230_c20181025011353771298_cspp_dev.h5'
        ]

        self.assertListEqual(expected, list(gen_dict_extract(test_dict,
                                                             'uid')))
Exemplo n.º 13
0
def _files_in_message_are_local(msg):
    for uri in gen_dict_extract(msg.data, 'uri'):
        urlobj = urlparse(uri)
        if not is_file_local(urlobj):
            return False
    return True
Exemplo n.º 14
0
 def _add_files_to_cache(self, msg):
     with file_cache_lock:
         for filename in gen_dict_extract(msg.data, 'uid'):
             file_cache.appendleft(self.attrs["topic"] + '/' + filename)
Exemplo n.º 15
0
    def test_extractor(self):
        """Test extracting info from dictionary."""
        orig = (
            'pytroll://tm1 file [email protected] 2018-10-25T01:15:54.752065 v1.01 application/json '
            '{"sensor": "viirs", "format": "SDR", "variant": "DR", "uid": "bla.png", "uri": "/home/user/bla.png"}'
        )

        expected_uid = ['bla.png']

        res = list(gen_dict_extract(Message(rawstr=orig).data, 'uid'))
        self.assertListEqual(expected_uid, res)

        test_dict = {
            'sensor':
            'viirs',
            'format':
            'SDR',
            'variant':
            'DR',
            'start_time':
            datetime.datetime(2018, 10, 25, 1, 1, 46),
            'orbit_number':
            36230,
            'dataset': [{
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/GMTCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011335298494_cspp_dev.h5',
                'uid':
                'GMTCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011335298494_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM01_npp_d20181025_t0101464_e0103106_b36230_c20181025011354163052_cspp_dev.h5',
                'uid':
                'SVM01_npp_d20181025_t0101464_e0103106_b36230_c20181025011354163052_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM02_npp_d20181025_t0101464_e0103106_b36230_c20181025011354178693_cspp_dev.h5',
                'uid':
                'SVM02_npp_d20181025_t0101464_e0103106_b36230_c20181025011354178693_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354194042_cspp_dev.h5',
                'uid':
                'SVM03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354194042_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354209273_cspp_dev.h5',
                'uid':
                'SVM04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354209273_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354224550_cspp_dev.h5',
                'uid':
                'SVM05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354224550_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM06_npp_d20181025_t0101464_e0103106_b36230_c20181025011354240108_cspp_dev.h5',
                'uid':
                'SVM06_npp_d20181025_t0101464_e0103106_b36230_c20181025011354240108_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM07_npp_d20181025_t0101464_e0103106_b36230_c20181025011354256470_cspp_dev.h5',
                'uid':
                'SVM07_npp_d20181025_t0101464_e0103106_b36230_c20181025011354256470_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM08_npp_d20181025_t0101464_e0103106_b36230_c20181025011354291614_cspp_dev.h5',
                'uid':
                'SVM08_npp_d20181025_t0101464_e0103106_b36230_c20181025011354291614_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM09_npp_d20181025_t0101464_e0103106_b36230_c20181025011354320585_cspp_dev.h5',
                'uid':
                'SVM09_npp_d20181025_t0101464_e0103106_b36230_c20181025011354320585_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM10_npp_d20181025_t0101464_e0103106_b36230_c20181025011354337251_cspp_dev.h5',
                'uid':
                'SVM10_npp_d20181025_t0101464_e0103106_b36230_c20181025011354337251_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM11_npp_d20181025_t0101464_e0103106_b36230_c20181025011354366238_cspp_dev.h5',
                'uid':
                'SVM11_npp_d20181025_t0101464_e0103106_b36230_c20181025011354366238_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM12_npp_d20181025_t0101464_e0103106_b36230_c20181025011354382899_cspp_dev.h5',
                'uid':
                'SVM12_npp_d20181025_t0101464_e0103106_b36230_c20181025011354382899_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM13_npp_d20181025_t0101464_e0103106_b36230_c20181025011354407042_cspp_dev.h5',
                'uid':
                'SVM13_npp_d20181025_t0101464_e0103106_b36230_c20181025011354407042_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM14_npp_d20181025_t0101464_e0103106_b36230_c20181025011354448503_cspp_dev.h5',
                'uid':
                'SVM14_npp_d20181025_t0101464_e0103106_b36230_c20181025011354448503_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM15_npp_d20181025_t0101464_e0103106_b36230_c20181025011354478025_cspp_dev.h5',
                'uid':
                'SVM15_npp_d20181025_t0101464_e0103106_b36230_c20181025011354478025_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVM16_npp_d20181025_t0101464_e0103106_b36230_c20181025011354506942_cspp_dev.h5',
                'uid':
                'SVM16_npp_d20181025_t0101464_e0103106_b36230_c20181025011354506942_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/GITCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333965280_cspp_dev.h5',
                'uid':
                'GITCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333965280_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI01_npp_d20181025_t0101464_e0103106_b36230_c20181025011353975082_cspp_dev.h5',
                'uid':
                'SVI01_npp_d20181025_t0101464_e0103106_b36230_c20181025011353975082_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI02_npp_d20181025_t0101464_e0103106_b36230_c20181025011353990747_cspp_dev.h5',
                'uid':
                'SVI02_npp_d20181025_t0101464_e0103106_b36230_c20181025011353990747_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354006115_cspp_dev.h5',
                'uid':
                'SVI03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354006115_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354022377_cspp_dev.h5',
                'uid':
                'SVI04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354022377_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVI05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354093439_cspp_dev.h5',
                'uid':
                'SVI05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354093439_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/GDNBO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333695023_cspp_dev.h5',
                'uid':
                'GDNBO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333695023_cspp_dev.h5'
            }, {
                'uri':
                'ssh://lxserv1131.smhi.se/san1/polar_in/direct_readout/npp/lvl1/npp_20181025_0048_36230/SVDNB_npp_d20181025_t0101464_e0103106_b36230_c20181025011353771298_cspp_dev.h5',
                'uid':
                'SVDNB_npp_d20181025_t0101464_e0103106_b36230_c20181025011353771298_cspp_dev.h5'
            }],
            'platform_name':
            'Suomi-NPP',
            'orig_orbit_number':
            36230,
            'end_time':
            datetime.datetime(2018, 10, 25, 1, 3, 10),
            'type':
            'HDF5',
            'data_processing_level':
            '1B',
            'request_address':
            '10.120.1.40:9099'
        }  # noqa

        expected = [
            'GMTCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011335298494_cspp_dev.h5',
            'SVM01_npp_d20181025_t0101464_e0103106_b36230_c20181025011354163052_cspp_dev.h5',
            'SVM02_npp_d20181025_t0101464_e0103106_b36230_c20181025011354178693_cspp_dev.h5',
            'SVM03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354194042_cspp_dev.h5',
            'SVM04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354209273_cspp_dev.h5',
            'SVM05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354224550_cspp_dev.h5',
            'SVM06_npp_d20181025_t0101464_e0103106_b36230_c20181025011354240108_cspp_dev.h5',
            'SVM07_npp_d20181025_t0101464_e0103106_b36230_c20181025011354256470_cspp_dev.h5',
            'SVM08_npp_d20181025_t0101464_e0103106_b36230_c20181025011354291614_cspp_dev.h5',
            'SVM09_npp_d20181025_t0101464_e0103106_b36230_c20181025011354320585_cspp_dev.h5',
            'SVM10_npp_d20181025_t0101464_e0103106_b36230_c20181025011354337251_cspp_dev.h5',
            'SVM11_npp_d20181025_t0101464_e0103106_b36230_c20181025011354366238_cspp_dev.h5',
            'SVM12_npp_d20181025_t0101464_e0103106_b36230_c20181025011354382899_cspp_dev.h5',
            'SVM13_npp_d20181025_t0101464_e0103106_b36230_c20181025011354407042_cspp_dev.h5',
            'SVM14_npp_d20181025_t0101464_e0103106_b36230_c20181025011354448503_cspp_dev.h5',
            'SVM15_npp_d20181025_t0101464_e0103106_b36230_c20181025011354478025_cspp_dev.h5',
            'SVM16_npp_d20181025_t0101464_e0103106_b36230_c20181025011354506942_cspp_dev.h5',
            'GITCO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333965280_cspp_dev.h5',
            'SVI01_npp_d20181025_t0101464_e0103106_b36230_c20181025011353975082_cspp_dev.h5',
            'SVI02_npp_d20181025_t0101464_e0103106_b36230_c20181025011353990747_cspp_dev.h5',
            'SVI03_npp_d20181025_t0101464_e0103106_b36230_c20181025011354006115_cspp_dev.h5',
            'SVI04_npp_d20181025_t0101464_e0103106_b36230_c20181025011354022377_cspp_dev.h5',
            'SVI05_npp_d20181025_t0101464_e0103106_b36230_c20181025011354093439_cspp_dev.h5',
            'GDNBO_npp_d20181025_t0101464_e0103106_b36230_c20181025011333695023_cspp_dev.h5',
            'SVDNB_npp_d20181025_t0101464_e0103106_b36230_c20181025011353771298_cspp_dev.h5'
        ]
        self.assertListEqual(expected, list(gen_dict_extract(test_dict,
                                                             'uid')))