def test_uses_already_cached_artifact(self, es, path_exists): # assume that the artifact is already cached path_exists.return_value = True renderer = supplier.TemplateRenderer(version="abc123", os_name="linux", arch="x86_64") dist_cfg = { "runtime.jdk.bundled": "true", "jdk.bundled.release_url": "https://elstc.co/elasticsearch-{{VERSION}}-{{OSNAME}}-{{ARCH}}.tar.gz" } file_resolver = supplier.ElasticsearchFileNameResolver( distribution_config=dist_cfg, template_renderer=renderer) cached_supplier = supplier.CachedSourceSupplier( distributions_root="/tmp", source_supplier=es, file_resolver=file_resolver) cached_supplier.fetch() cached_supplier.prepare() binaries = {} cached_supplier.add(binaries) self.assertEqual(0, es.fetch.call_count) self.assertEqual(0, es.prepare.call_count) self.assertEqual(0, es.add.call_count) self.assertTrue(cached_supplier.cached) self.assertIn("elasticsearch", binaries) self.assertEqual("/tmp/elasticsearch-abc123-linux-x86_64.tar.gz", binaries["elasticsearch"])
def test_does_not_cache_when_no_revision(self, es, copy, ensure_dir): def add_es_artifact(binaries): binaries["elasticsearch"] = "/path/to/artifact.tar.gz" es.fetch.return_value = None es.add.side_effect = add_es_artifact # no version / revision provided renderer = supplier.TemplateRenderer(version=None, os_name="linux", arch="x86_64") dist_cfg = { "runtime.jdk.bundled": "true", "jdk.bundled.release_url": "https://elstc.co/elasticsearch-{{VERSION}}-{{OSNAME}}-{{ARCH}}.tar.gz", } file_resolver = supplier.ElasticsearchFileNameResolver( distribution_config=dist_cfg, template_renderer=renderer) cached_supplier = supplier.CachedSourceSupplier( distributions_root="/tmp", source_supplier=es, file_resolver=file_resolver) cached_supplier.fetch() cached_supplier.prepare() binaries = {} cached_supplier.add(binaries) assert copy.call_count == 0 assert not cached_supplier.cached assert binaries["elasticsearch"] == "/path/to/artifact.tar.gz"
def test_does_not_cache_when_no_revision(self, es, copy, ensure_dir): def add_es_artifact(binaries): binaries["elasticsearch"] = "/path/to/artifact.tar.gz" es.fetch.return_value = None es.add.side_effect = add_es_artifact renderer = supplier.TemplateRenderer(version=None, os_name="linux", arch="x86_64") cached_supplier = supplier.CachedSourceSupplier( distributions_root="/tmp", source_supplier=es, file_resolver=supplier.ElasticsearchFileNameResolver( distribution_config={}, template_renderer=renderer)) cached_supplier.fetch() cached_supplier.prepare() binaries = {} cached_supplier.add(binaries) self.assertEqual(0, copy.call_count) self.assertFalse(cached_supplier.cached) self.assertIn("elasticsearch", binaries)
def test_caches_artifact(self, es, copy, path_exists, ensure_dir): def add_es_artifact(binaries): binaries["elasticsearch"] = "/path/to/artifact.tar.gz" path_exists.return_value = False es.fetch.return_value = "abc123" es.add.side_effect = add_es_artifact renderer = supplier.TemplateRenderer(version="abc123", os_name="linux", arch="x86_64") dist_cfg = { "runtime.jdk.bundled": "true", "jdk.bundled.release_url": "https://elstc.co/elasticsearch-{{VERSION}}-{{OSNAME}}-{{ARCH}}.tar.gz" } cached_supplier = supplier.CachedSourceSupplier( distributions_root="/tmp", source_supplier=es, file_resolver=supplier.ElasticsearchFileNameResolver( distribution_config=dist_cfg, template_renderer=renderer)) cached_supplier.fetch() cached_supplier.prepare() binaries = {} cached_supplier.add(binaries) # path is cached now path_exists.return_value = True self.assertEqual(1, copy.call_count, "artifact has been copied") self.assertEqual(1, es.add.call_count, "artifact has been added by internal supplier") self.assertTrue(cached_supplier.cached) self.assertIn("elasticsearch", binaries) # simulate a second attempt cached_supplier.fetch() cached_supplier.prepare() binaries = {} cached_supplier.add(binaries) self.assertEqual(1, copy.call_count, "artifact has not been copied twice") # the internal supplier did not get called again as we reuse the cached artifact self.assertEqual(1, es.add.call_count, "internal supplier is not called again") self.assertTrue(cached_supplier.cached)
def setUp(self): super().setUp() renderer = supplier.TemplateRenderer(version="8.0.0-SNAPSHOT", os_name="linux", arch="x86_64") dist_cfg = { "runtime.jdk.bundled": "true", "jdk.bundled.release_url": "https://elstc.co/elasticsearch-{{VERSION}}-{{OSNAME}}-{{ARCH}}.tar.gz" } self.resolver = supplier.ElasticsearchFileNameResolver( distribution_config=dist_cfg, template_renderer=renderer )
def test_does_not_cache_on_copy_error(self, es, copy, path_exists, ensure_dir): def add_es_artifact(binaries): binaries["elasticsearch"] = "/path/to/artifact.tar.gz" path_exists.return_value = False es.fetch.return_value = "abc123" es.add.side_effect = add_es_artifact copy.side_effect = OSError("no space left on device") renderer = supplier.TemplateRenderer(version="abc123", os_name="linux", arch="x86_64") dist_cfg = { "runtime.jdk.bundled": "true", "jdk.bundled.release_url": "https://elstc.co/elasticsearch-{{VERSION}}-{{OSNAME}}-{{ARCH}}.tar.gz" } cached_supplier = supplier.CachedSourceSupplier( distributions_root="/tmp", source_supplier=es, file_resolver=supplier.ElasticsearchFileNameResolver( distribution_config=dist_cfg, template_renderer=renderer)) cached_supplier.fetch() cached_supplier.prepare() binaries = {} cached_supplier.add(binaries) self.assertEqual(1, copy.call_count, "artifact has been copied") self.assertEqual(1, es.add.call_count, "artifact has been added by internal supplier") self.assertFalse(cached_supplier.cached) self.assertIn("elasticsearch", binaries) # still the uncached artifact self.assertEqual("/path/to/artifact.tar.gz", binaries["elasticsearch"])