Exemplo n.º 1
0
    def testValidation(self):
        configRoot = os.path.join(TESTDIR, "config", "templates")
        config1 = FileTemplatesConfig(os.path.join(configRoot, "templates-nodefault.yaml"))
        templates = FileTemplates(config1, universe=self.universe)

        entities = {}
        entities["calexp"] = self.makeDatasetRef("calexp", storageClassName="StorageClassX",
                                                 dataId={"instrument": "dummy", "physical_filter": "i",
                                                         "visit": 52})

        with self.assertLogs(level="WARNING") as cm:
            templates.validateTemplates(entities.values(), logFailures=True)
        self.assertIn("Unchecked keys", cm.output[0])
        self.assertIn("StorageClassX", cm.output[0])

        entities["pvi"] = self.makeDatasetRef("pvi", storageClassName="StorageClassX",
                                              dataId={"instrument": "dummy", "physical_filter": "i"})
        entities["StorageClassX"] = self.makeDatasetRef("storageClass",
                                                        storageClassName="StorageClassX",
                                                        dataId={"instrument": "dummy", "visit": 2})
        entities["calexp.wcs"] = self.makeDatasetRef("calexp.wcs",
                                                     storageClassName="StorageClassX",
                                                     dataId={"instrument": "dummy",
                                                             "physical_filter": "i", "visit": 23},
                                                     conform=False)

        entities["instrument+physical_filter"] = self.makeDatasetRef("filter_inst",
                                                                     storageClassName="StorageClassX",
                                                                     dataId={"physical_filter": "i",
                                                                             "instrument": "SCUBA"})
        entities["hsc+pvi"] = self.makeDatasetRef("pvi", storageClassName="StorageClassX",
                                                  dataId={"physical_filter": "i", "instrument": "HSC"})

        entities["hsc+instrument+physical_filter"] = self.makeDatasetRef("filter_inst",
                                                                         storageClassName="StorageClassX",
                                                                         dataId={"physical_filter": "i",
                                                                                 "instrument": "HSC"})

        templates.validateTemplates(entities.values(), logFailures=True)

        # Rerun but with a failure
        entities["pvi"] = self.makeDatasetRef("pvi", storageClassName="StorageClassX",
                                              dataId={"band": "i"})
        with self.assertRaises(FileTemplateValidationError):
            with self.assertLogs(level="FATAL"):
                templates.validateTemplates(entities.values(), logFailures=True)
Exemplo n.º 2
0
    def testSimpleConfig(self):
        """Test reading from config file"""
        configRoot = os.path.join(TESTDIR, "config", "templates")
        config1 = FileTemplatesConfig(
            os.path.join(configRoot, "templates-nodefault.yaml"))
        templates = FileTemplates(config1, universe=self.universe)
        ref = self.makeDatasetRef("calexp")
        tmpl = templates.getTemplate(ref)
        self.assertIsInstance(tmpl, FileTemplate)

        # This config file should not allow defaulting
        ref2 = self.makeDatasetRef("unknown")
        with self.assertRaises(KeyError):
            templates.getTemplate(ref2)

        # This should fall through the datasetTypeName check and use
        # StorageClass instead
        ref3 = self.makeDatasetRef("unknown2",
                                   storageClassName="StorageClassX")
        tmplSc = templates.getTemplate(ref3)
        self.assertIsInstance(tmplSc, FileTemplate)

        # Try with a component: one with defined formatter and one without
        refWcs = self.makeDatasetRef("calexp.wcs")
        refImage = self.makeDatasetRef("calexp.image")
        tmplCalexp = templates.getTemplate(ref)
        tmplWcs = templates.getTemplate(refWcs)  # Should be special
        tmpl_image = templates.getTemplate(refImage)
        self.assertIsInstance(tmplCalexp, FileTemplate)
        self.assertIsInstance(tmpl_image, FileTemplate)
        self.assertIsInstance(tmplWcs, FileTemplate)
        self.assertEqual(tmplCalexp, tmpl_image)
        self.assertNotEqual(tmplCalexp, tmplWcs)

        # Check dimensions lookup order.
        # The order should be: dataset type name, dimension, storage class
        # This one will not match name but might match storage class.
        # It should match dimensions
        refDims = self.makeDatasetRef("nomatch",
                                      dataId={
                                          "instrument": "LSST",
                                          "physical_filter": "z"
                                      },
                                      storageClassName="StorageClassX")
        tmplDims = templates.getTemplate(refDims)
        self.assertIsInstance(tmplDims, FileTemplate)
        self.assertNotEqual(tmplDims, tmplSc)

        # Test that instrument overrides retrieve specialist templates
        refPvi = self.makeDatasetRef("pvi")
        refPviHsc = self.makeDatasetRef("pvi",
                                        dataId={
                                            "instrument": "HSC",
                                            "physical_filter": "z"
                                        })
        refPviLsst = self.makeDatasetRef("pvi",
                                         dataId={
                                             "instrument": "LSST",
                                             "physical_filter": "z"
                                         })

        tmplPvi = templates.getTemplate(refPvi)
        tmplPviHsc = templates.getTemplate(refPviHsc)
        tmplPviLsst = templates.getTemplate(refPviLsst)
        self.assertEqual(tmplPvi, tmplPviLsst)
        self.assertNotEqual(tmplPvi, tmplPviHsc)

        # Have instrument match and dimensions look up with no name match
        refNoPviHsc = self.makeDatasetRef("pvix",
                                          dataId={
                                              "instrument": "HSC",
                                              "physical_filter": "z"
                                          },
                                          storageClassName="StorageClassX")
        tmplNoPviHsc = templates.getTemplate(refNoPviHsc)
        self.assertNotEqual(tmplNoPviHsc, tmplDims)
        self.assertNotEqual(tmplNoPviHsc, tmplPviHsc)

        # Format config file with defaulting
        config2 = FileTemplatesConfig(
            os.path.join(configRoot, "templates-withdefault.yaml"))
        templates = FileTemplates(config2, universe=self.universe)
        tmpl = templates.getTemplate(ref2)
        self.assertIsInstance(tmpl, FileTemplate)

        # Format config file with bad format string
        with self.assertRaises(FileTemplateValidationError):
            FileTemplates(os.path.join(configRoot, "templates-bad.yaml"),
                          universe=self.universe)

        # Config file with no defaulting mentioned
        config3 = os.path.join(configRoot, "templates-nodefault2.yaml")
        templates = FileTemplates(config3, universe=self.universe)
        with self.assertRaises(KeyError):
            templates.getTemplate(ref2)

        # Try again but specify a default in the constructor
        default = "{run}/{datasetType}/{physical_filter}"
        templates = FileTemplates(config3,
                                  default=default,
                                  universe=self.universe)
        tmpl = templates.getTemplate(ref2)
        self.assertEqual(tmpl.template, default)