diff options
7 files changed, 114 insertions, 7 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java index ef89c1d7525..692c941877b 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java @@ -48,7 +48,7 @@ public final class ApplicationId implements Comparable<ApplicationId> { } public static ApplicationId fromFullString(String idString) { - String[] parts = idString.split("."); + String[] parts = idString.split("\\."); if (parts.length < 3) throw new IllegalArgumentException("Application ids must be on the form tenant.application.instance, but was " + idString); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java index 1a73d1b77e7..6799b68daae 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java @@ -119,7 +119,7 @@ public class NodesApiHandler extends LoggingRequestHandler { if (pathS.startsWith("/nodes/v2/capacity")) return new HostCapacityResponse(nodeRepository, request); if (path.matches("/nodes/v2/application")) return applicationList(request.getUri()); if (path.matches("/nodes/v2/application/{applicationId}")) return application(path.get("applicationId"), request.getUri()); - throw new NotFoundException("Nothing at path '" + path + "'"); + throw new NotFoundException("Nothing at " + path); } private HttpResponse handlePUT(HttpRequest request) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 8ff17a8e5a3..0cafe35ee52 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -16,11 +16,14 @@ import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; +import com.yahoo.transaction.Mutex; import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.flags.InMemoryFlagSource; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; +import com.yahoo.vespa.hosted.provision.applications.Application; +import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.IP; import com.yahoo.vespa.hosted.provision.node.Status; @@ -142,9 +145,22 @@ public class MockNodeRepository extends NodeRepository { ClusterSpec zoneCluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); activate(provisioner.prepare(zoneApp, zoneCluster, Capacity.fromRequiredNodeType(NodeType.host), null), zoneApp, provisioner); - ApplicationId app1 = ApplicationId.from(TenantName.from("tenant1"), ApplicationName.from("application1"), InstanceName.from("instance1")); - ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1")).vespaVersion("6.42").build(); - provisioner.prepare(app1, cluster1, Capacity.from(new ClusterResources(2, 1, new NodeResources(2, 8, 50, 1))), null); + ApplicationId app1Id = ApplicationId.from(TenantName.from("tenant1"), ApplicationName.from("application1"), InstanceName.from("instance1")); + ClusterSpec cluster1Id = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1")).vespaVersion("6.42").build(); + provisioner.prepare(app1Id, + cluster1Id, + Capacity.from(new ClusterResources(2, 1, new NodeResources(2, 8, 50, 1)), + new ClusterResources(8, 2, new NodeResources(4, 16, 1000, 1)), false, true), + null); + Application app1 = applications().get(app1Id).get(); + Cluster cluster1 = app1.cluster(cluster1Id.id()).get(); + cluster1 = cluster1.withSuggested(new ClusterResources(6, 2, + new NodeResources(3, 20, 100, 1))); + cluster1 = cluster1.withTarget(new ClusterResources(4, 1, + new NodeResources(3, 16, 100, 1))); + try (Mutex lock = lock(app1Id)) { + applications().put(app1.with(cluster1), lock); + } ApplicationId app2 = ApplicationId.from(TenantName.from("tenant2"), ApplicationName.from("application2"), InstanceName.from("instance2")); ClusterSpec cluster2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id2")).vespaVersion("6.42").build(); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/README.md b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/README.md index bbb2ec7080b..f7421bf07c9 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/README.md +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/README.md @@ -1,5 +1,5 @@ <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -The test resources are used by both NoadAdmin and NodeRepository +The test resources are used by both NodeAdmin and NodeRepository tests to verify APIs. So when modifying this test data remember to check tests for both NodeAdmin and NodeRepository. diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index 01719450e2b..838a39ba01e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -233,8 +233,11 @@ public class RestApiTest { @Test public void test_application_requests() throws Exception { - assertFile(new Request("http://localhost:8080/nodes/v2/application/"), "applications.json"); + assertFile(new Request("http://localhost:8080/nodes/v2/application/tenant1.application1.instance1"), + "application1.json"); + assertFile(new Request("http://localhost:8080/nodes/v2/application/tenant2.application2.instance2"), + "application2.json"); } @Test diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/application1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/application1.json new file mode 100644 index 00000000000..ce2309e4d6c --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/application1.json @@ -0,0 +1,56 @@ +{ + "url" : "http://localhost:8080/nodes/v2/applications/tenant1.application1.instance1", + "id" : "tenant1.application1.instance1", + "clusters" : { + "id1" : { + "min" : { + "nodes" : 2, + "groups" : 1, + "resources" : { + "vcpu" : 2.0, + "memoryGb" : 8.0, + "diskGb" : 50.0, + "bandwidthGbps" : 1.0, + "diskSpeed" : "fast", + "storageType" : "any" + } + }, + "max" : { + "nodes" : 8, + "groups" : 2, + "resources" : { + "vcpu" : 4.0, + "memoryGb" : 16.0, + "diskGb" : 1000.0, + "bandwidthGbps" : 1.0, + "diskSpeed" : "fast", + "storageType" : "any" + } + }, + "suggested" : { + "nodes" : 6, + "groups" : 2, + "resources" : { + "vcpu" : 3.0, + "memoryGb" : 20.0, + "diskGb" : 100.0, + "bandwidthGbps" : 1.0, + "diskSpeed" : "fast", + "storageType" : "any" + } + }, + "target" : { + "nodes" : 4, + "groups" : 1, + "resources" : { + "vcpu" : 3.0, + "memoryGb" : 16.0, + "diskGb" : 100.0, + "bandwidthGbps" : 1.0, + "diskSpeed" : "fast", + "storageType" : "any" + } + } + } + } +} diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/application2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/application2.json new file mode 100644 index 00000000000..75af5d4a328 --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/application2.json @@ -0,0 +1,32 @@ +{ + "url": "http://localhost:8080/nodes/v2/applications/tenant2.application2.instance2", + "id": "tenant2.application2.instance2", + "clusters": { + "id2": { + "min": { + "nodes": 2, + "groups": 1, + "resources": { + "vcpu": 2.0, + "memoryGb": 8.0, + "diskGb": 50.0, + "bandwidthGbps": 1.0, + "diskSpeed": "fast", + "storageType": "any" + } + }, + "max": { + "nodes": 2, + "groups": 1, + "resources": { + "vcpu": 2.0, + "memoryGb": 8.0, + "diskGb": 50.0, + "bandwidthGbps": 1.0, + "diskSpeed": "fast", + "storageType": "any" + } + } + } + } +} |