From e4adda540be339c150e12012e069c8dc44bbdb9c Mon Sep 17 00:00:00 2001 From: Ola Aunrønning Date: Mon, 8 Oct 2018 10:22:53 +0200 Subject: Added slime functionality to Contact,tests, and system check for Maintainer --- .../maintenance/ContactInformationMaintainer.java | 4 ++- .../hosted/controller/maintenance/Maintainer.java | 13 +++++++- .../restapi/contactinfo/ContactInfoHandler.java | 33 +++---------------- .../vespa/hosted/controller/tenant/Contact.java | 38 ++++++++++++++++++++++ 4 files changed, 57 insertions(+), 31 deletions(-) (limited to 'controller-server/src/main/java/com') diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ContactInformationMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ContactInformationMaintainer.java index 5a825bf7b85..650d3d6a812 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ContactInformationMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ContactInformationMaintainer.java @@ -1,6 +1,7 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.maintenance; +import com.yahoo.config.provision.SystemName; import com.yahoo.log.LogLevel; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.organization.Organization; @@ -11,6 +12,7 @@ import com.yahoo.vespa.hosted.controller.tenant.Tenant; import com.yahoo.yolean.Exceptions; import java.time.Duration; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -29,7 +31,7 @@ public class ContactInformationMaintainer extends Maintainer { private final Organization organization; public ContactInformationMaintainer(Controller controller, Duration interval, JobControl jobControl, Organization organization) { - super(controller, interval, jobControl); + super(Arrays.asList(SystemName.main, SystemName.cd), controller, interval, jobControl); this.organization = Objects.requireNonNull(organization, "organization must be non-null"); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Maintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Maintainer.java index d76f557fce1..54e9dddd649 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Maintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Maintainer.java @@ -2,10 +2,13 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.component.AbstractComponent; +import com.yahoo.config.provision.SystemName; import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.hosted.controller.Controller; import java.time.Duration; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -27,16 +30,23 @@ public abstract class Maintainer extends AbstractComponent implements Runnable { private final JobControl jobControl; private final ScheduledExecutorService service; private final String name; + private List systemNames; public Maintainer(Controller controller, Duration interval, JobControl jobControl) { this(controller, interval, jobControl, null); } + public Maintainer(List systemNames, Controller controller, Duration interval, JobControl jobControl) { + this(controller, interval, jobControl, null); + this.systemNames = systemNames; + } + public Maintainer(Controller controller, Duration interval, JobControl jobControl, String name) { this.controller = controller; this.maintenanceInterval = interval; this.jobControl = jobControl; this.name = name; + this.systemNames = new ArrayList<>(); service = new ScheduledThreadPoolExecutor(1); service.scheduleAtFixedRate(this, interval.toMillis(), interval.toMillis(), TimeUnit.MILLISECONDS); @@ -48,7 +58,8 @@ public abstract class Maintainer extends AbstractComponent implements Runnable { @Override public void run() { try { - if (jobControl.isActive(name())) { + boolean correctSystem = systemNames.isEmpty() || systemNames.contains(controller.system()); + if (jobControl.isActive(name()) && correctSystem) { try (Lock lock = jobControl.curator().lockMaintenanceJob(name())) { maintain(); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/contactinfo/ContactInfoHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/contactinfo/ContactInfoHandler.java index 93734d2e00c..5ea926afff6 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/contactinfo/ContactInfoHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/contactinfo/ContactInfoHandler.java @@ -72,14 +72,13 @@ public class ContactInfoHandler extends LoggingRequestHandler { private HttpResponse get(HttpRequest request) { Path path = new Path(request.getUri().getPath()); - if (!path.matches("/contactinfo/v1/tenant/{tenant}")) return getContactInfo(path.get("tenant"), request); + if (path.matches("/contactinfo/v1/tenant/{tenant}")) return getContactInfo(path.get("tenant"), request); return ErrorResponse.notFoundError("Nothing at " + path); } private HttpResponse post(HttpRequest request) { Path path = new Path(request.getUri().getPath()); - if (path.matches("/contactinfo/v1/tenant/{tenant}")) - return postContactInfo(path.get("tenant"), request); + if (path.matches("/contactinfo/v1/tenant/{tenant}")) return postContactInfo(path.get("tenant"), request); return ErrorResponse.notFoundError("Nothing at " + path); } @@ -96,18 +95,7 @@ public class ContactInfoHandler extends LoggingRequestHandler { contact = tenant.get().contact(); } if (contact.isPresent()) { - Slime response = new Slime(); - Cursor cursor = response.setObject(); - cursor.setString("issueTrackerUrl", contact.get().issueTrackerUrl().toString()); - cursor.setString("propertyUrl", contact.get().propertyUrl().toString()); - Cursor persons = cursor.setArray("persons"); - for (List personList : contact.get().persons()) { - Cursor sublist = persons.addArray(); - for(String person : personList) { - sublist.addString(person); - } - } - return new SlimeJsonResponse(response); + return new SlimeJsonResponse(contact.get().toSlime()); } return ErrorResponse.notFoundError("Could not find contact info for " + tenantName); } @@ -147,20 +135,7 @@ public class ContactInfoHandler extends LoggingRequestHandler { private Contact getContactFromRequest(HttpRequest request) throws IOException, URISyntaxException { Slime slime = SlimeUtils.jsonToSlime(IOUtils.readBytes(request.getData(), 1000 * 1000)); - Inspector inspector = slime.get(); - URI propertyUrl = new URI(inspector.field("propertyUrl").asString()); - URI url = new URI(inspector.field("url").asString()); - URI issueTrackerUrl = new URI(inspector.field("issueTrackerUrl").asString()); - Inspector personInspector = inspector.field("persons"); - List> personList = new ArrayList<>(); - personInspector.traverse((ArrayTraverser) (index, entry) -> { - List subList = new ArrayList<>(); - entry.traverse((ArrayTraverser) (idx, subEntry) -> { - subList.add(subEntry.asString()); - }); - personList.add(subList); - }); - return new Contact(url, propertyUrl, issueTrackerUrl, personList); + return Contact.fromSlime(slime); } private Optional findContactFromOpsDb(AthenzTenant tenant) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Contact.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Contact.java index e13b0f982da..cd77a42c7c0 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Contact.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Contact.java @@ -2,8 +2,13 @@ package com.yahoo.vespa.hosted.controller.tenant; import com.google.common.collect.ImmutableList; +import com.yahoo.slime.ArrayTraverser; +import com.yahoo.slime.Cursor; +import com.yahoo.slime.Inspector; +import com.yahoo.slime.Slime; import java.net.URI; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -46,6 +51,39 @@ public class Contact { return persons; } + public Slime toSlime() { + Slime slime = new Slime(); + Cursor cursor = slime.setObject(); + cursor.setString("url", url.toString()); + cursor.setString("issueTrackerUrl", issueTrackerUrl.toString()); + cursor.setString("propertyUrl", propertyUrl.toString()); + Cursor personsCursor = cursor.setArray("persons"); + for (List personList : persons) { + Cursor sublist = personsCursor.addArray(); + for(String person : personList) { + sublist.addString(person); + } + } + return slime; + } + + public static Contact fromSlime(Slime slime) { + Inspector inspector = slime.get(); + URI propertyUrl = URI.create(inspector.field("propertyUrl").asString()); + URI url = URI.create(inspector.field("url").asString()); + URI issueTrackerUrl = URI.create(inspector.field("issueTrackerUrl").asString()); + Inspector personInspector = inspector.field("persons"); + List> personList = new ArrayList<>(); + personInspector.traverse((ArrayTraverser) (index, entry) -> { + List subList = new ArrayList<>(); + entry.traverse((ArrayTraverser) (idx, subEntry) -> { + subList.add(subEntry.asString()); + }); + personList.add(subList); + }); + return new Contact(url, propertyUrl, issueTrackerUrl, personList); + } + @Override public boolean equals(Object o) { if (this == o) return true; -- cgit v1.2.3