diff options
author | Harald Musum <musum@yahooinc.com> | 2024-04-11 09:34:57 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2024-04-11 09:34:57 +0200 |
commit | 73e63a0489263a1c7671e6f3cb29d31dcdd09c37 (patch) | |
tree | a2e589b79be05b5558cdd9d03ff089f1690ea5b4 /config-model | |
parent | ed76cd45f86c8af9431860a9ac7c40fc59fb9e3c (diff) |
Validate url for models
Diffstat (limited to 'config-model')
-rw-r--r-- | config-model/src/main/java/com/yahoo/vespa/model/container/component/Model.java | 14 | ||||
-rw-r--r-- | config-model/src/test/java/com/yahoo/vespa/model/container/component/ModelTest.java | 36 |
2 files changed, 49 insertions, 1 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Model.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Model.java index 7d6285d00c1..3a8e52c92a8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Model.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Model.java @@ -13,6 +13,7 @@ import com.yahoo.vespa.model.container.xml.ModelIdResolver; import org.w3c.dom.Element; import java.net.URI; +import java.net.URISyntaxException; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -51,11 +52,22 @@ class Model { static Model fromXml(DeployState ds, Element model, Set<String> requiredTags) { var modelId = XmlHelper.getOptionalAttribute(model, "model-id").orElse(null); - var url = XmlHelper.getOptionalAttribute(model, "url").map(URI::create).orElse(null); + var url = XmlHelper.getOptionalAttribute(model, "url").map(Model::parseUrl).orElse(null); var path = XmlHelper.getOptionalAttribute(model, "path").map(Path::fromString).orElse(null); return new Model(ds, model.getTagName(), modelId, url, path, requiredTags); } + private static URI parseUrl(String url) { + try { + var uri = new URI(url); + if ( ! uri.isAbsolute()) + throw new IllegalArgumentException("Invalid url '" + url + "': url has no 'scheme' component"); + return uri; + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Invalid url '" + url + "':" + e.getMessage()); + } + } + /** Return tokenizer model from XML if specified, alternatively use model id for ONNX model with suffix '-vocab' appended */ static Model fromXmlOrImplicitlyFromOnnxModel( DeployState ds, Element parent, Model onnxModel, String paramName, Set<String> requiredTags) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/component/ModelTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/component/ModelTest.java new file mode 100644 index 00000000000..cb2594ae49c --- /dev/null +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/component/ModelTest.java @@ -0,0 +1,36 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.container.component; + +import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.text.XML; +import org.junit.jupiter.api.Test; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * @author hmusum + */ +public class ModelTest { + + @Test + void invalid_url(){ + var xml = """ + <component id="bert-embedder" type="bert-embedder"> + <transformer-model url="models/e5-base-v2.onnx" /> + <tokenizer-vocab path="models/vocab.txt"/> + </component> + """; + + try { + var state = new DeployState.Builder().build(); + Model.fromXml(state, XML.getDocument(xml).getDocumentElement(), "transformer-model", Set.of()); + fail("should fail"); + } catch (IllegalArgumentException e) { + assertEquals("Invalid url 'models/e5-base-v2.onnx': url has no 'scheme' component", e.getMessage()); + } + } + +} |