diff options
Diffstat (limited to 'node-repository/src')
41 files changed, 124 insertions, 160 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index 020236138f8..491e8fc91ab 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -18,6 +18,8 @@ import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerList; +import com.yahoo.vespa.hosted.provision.maintenance.InfrastructureVersions; +import com.yahoo.vespa.hosted.provision.maintenance.JobControl; import com.yahoo.vespa.hosted.provision.maintenance.PeriodicApplicationMaintainer; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.NodeAcl; @@ -84,8 +86,10 @@ public class NodeRepository extends AbstractComponent { private final NodeFlavors flavors; private final NameResolver nameResolver; private final OsVersions osVersions; + private final InfrastructureVersions infrastructureVersions; private final FirmwareChecks firmwareChecks; private final DockerImages dockerImages; + private final JobControl jobControl; /** * Creates a node repository from a zookeeper provider. @@ -107,9 +111,11 @@ public class NodeRepository extends AbstractComponent { this.clock = clock; this.flavors = flavors; this.nameResolver = nameResolver; - this.osVersions = new OsVersions(this.db); + this.osVersions = new OsVersions(db); + this.infrastructureVersions = new InfrastructureVersions(db); this.firmwareChecks = new FirmwareChecks(db, clock); this.dockerImages = new DockerImages(db, dockerImage); + this.jobControl = new JobControl(db); // read and write all nodes to make sure they are stored in the latest version of the serialized format for (Node.State state : Node.State.values()) @@ -128,12 +134,18 @@ public class NodeRepository extends AbstractComponent { /** Returns the OS versions to use for nodes in this */ public OsVersions osVersions() { return osVersions; } + /** Returns the infrastructure versions to use for nodes in this */ + public InfrastructureVersions infrastructureVersions() { return infrastructureVersions; } + /** Returns the status of firmware checks for hosts managed by this. */ public FirmwareChecks firmwareChecks() { return firmwareChecks; } /** Returns the docker images to use for nodes in this. */ public DockerImages dockerImages() { return dockerImages; } + /** Returns the status of maintenance jobs managed by this. */ + public JobControl jobControl() { return jobControl; } + // ---------------- Query API ---------------------------------------------------------------- /** diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java index 5e5b3546ced..96c8fe21959 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java @@ -36,8 +36,8 @@ public abstract class ApplicationMaintainer extends Maintainer { new LinkedBlockingQueue<>(), new DaemonThreadFactory("node repo application maintainer")); - protected ApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval, JobControl jobControl) { - super(nodeRepository, interval, jobControl); + protected ApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval) { + super(nodeRepository, interval); this.deployer = deployer; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/DirtyExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/DirtyExpirer.java index 93968eef37b..ae2f68a3143 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/DirtyExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/DirtyExpirer.java @@ -25,8 +25,8 @@ public class DirtyExpirer extends Expirer { private final NodeRepository nodeRepository; - public DirtyExpirer(NodeRepository nodeRepository, Clock clock, Duration dirtyTimeout, JobControl jobControl) { - super(Node.State.dirty, History.Event.Type.deallocated, nodeRepository, clock, dirtyTimeout, jobControl); + DirtyExpirer(NodeRepository nodeRepository, Clock clock, Duration dirtyTimeout) { + super(Node.State.dirty, History.Event.Type.deallocated, nodeRepository, clock, dirtyTimeout); this.nodeRepository = nodeRepository; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java index 19d32cfb05c..e2664cb14cd 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java @@ -31,9 +31,9 @@ public abstract class Expirer extends Maintainer { private final Duration expiryTime; - public Expirer(Node.State fromState, History.Event.Type eventType, NodeRepository nodeRepository, - Clock clock, Duration expiryTime, JobControl jobControl) { - super(nodeRepository, min(Duration.ofMinutes(25), expiryTime), jobControl); + Expirer(Node.State fromState, History.Event.Type eventType, NodeRepository nodeRepository, + Clock clock, Duration expiryTime) { + super(nodeRepository, min(Duration.ofMinutes(25), expiryTime)); this.fromState = fromState; this.eventType = eventType; this.clock = clock; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java index 1b18dfc46c1..2f1cadf5964 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java @@ -56,9 +56,8 @@ public class FailedExpirer extends Maintainer { private final Duration defaultExpiry; // Grace period to allow recovery of data private final Duration containerExpiry; // Stateless nodes, no data to recover - public FailedExpirer(NodeRepository nodeRepository, Zone zone, Clock clock, Duration interval, - JobControl jobControl) { - super(nodeRepository, interval, jobControl); + FailedExpirer(NodeRepository nodeRepository, Zone zone, Clock clock, Duration interval) { + super(nodeRepository, interval); this.nodeRepository = nodeRepository; this.zone = zone; this.clock = clock; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainer.java index 7e22245316a..86aafe83c46 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainer.java @@ -29,9 +29,9 @@ public class HostDeprovisionMaintainer extends Maintainer { private final HostProvisioner hostProvisioner; private final BooleanFlag dynamicProvisioningEnabled; - public HostDeprovisionMaintainer(NodeRepository nodeRepository, Duration interval, JobControl jobControl, - HostProvisioner hostProvisioner, FlagSource flagSource) { - super(nodeRepository, interval, jobControl); + HostDeprovisionMaintainer(NodeRepository nodeRepository, Duration interval, + HostProvisioner hostProvisioner, FlagSource flagSource) { + super(nodeRepository, interval); this.hostProvisioner = hostProvisioner; this.dynamicProvisioningEnabled = Flags.ENABLE_DYNAMIC_PROVISIONING.bindTo(flagSource); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainer.java index 5490216fdf3..a21d753b4cd 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainer.java @@ -33,9 +33,9 @@ public class HostProvisionMaintainer extends Maintainer { private final HostProvisioner hostProvisioner; private final BooleanFlag dynamicProvisioningEnabled; - public HostProvisionMaintainer(NodeRepository nodeRepository, Duration interval, JobControl jobControl, - HostProvisioner hostProvisioner, FlagSource flagSource) { - super(nodeRepository, interval, jobControl); + HostProvisionMaintainer(NodeRepository nodeRepository, Duration interval, + HostProvisioner hostProvisioner, FlagSource flagSource) { + super(nodeRepository, interval); this.hostProvisioner = hostProvisioner; this.dynamicProvisioningEnabled = Flags.ENABLE_DYNAMIC_PROVISIONING.bindTo(flagSource); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java index 0146238f1db..5eec083b9d7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java @@ -33,8 +33,8 @@ public class InactiveExpirer extends Expirer { private final NodeRepository nodeRepository; - public InactiveExpirer(NodeRepository nodeRepository, Clock clock, Duration inactiveTimeout, JobControl jobControl) { - super(Node.State.inactive, History.Event.Type.deactivated, nodeRepository, clock, inactiveTimeout, jobControl); + InactiveExpirer(NodeRepository nodeRepository, Clock clock, Duration inactiveTimeout) { + super(Node.State.inactive, History.Event.Type.deactivated, nodeRepository, clock, inactiveTimeout); this.nodeRepository = nodeRepository; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisioner.java index 7d4d41bfc44..32a971b0d46 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisioner.java @@ -34,15 +34,12 @@ public class InfrastructureProvisioner extends Maintainer { private static final Logger logger = Logger.getLogger(InfrastructureProvisioner.class.getName()); private final Provisioner provisioner; - private final InfrastructureVersions infrastructureVersions; private final DuperModelInfraApi duperModel; - public InfrastructureProvisioner(Provisioner provisioner, NodeRepository nodeRepository, - InfrastructureVersions infrastructureVersions, Duration interval, JobControl jobControl, - DuperModelInfraApi duperModel) { - super(nodeRepository, interval, jobControl); + InfrastructureProvisioner(Provisioner provisioner, NodeRepository nodeRepository, + Duration interval, DuperModelInfraApi duperModel) { + super(nodeRepository, interval); this.provisioner = provisioner; - this.infrastructureVersions = infrastructureVersions; this.duperModel = duperModel; } @@ -52,7 +49,7 @@ public class InfrastructureProvisioner extends Maintainer { try (Mutex lock = nodeRepository().lock(application.getApplicationId())) { NodeType nodeType = application.getCapacity().type(); - Optional<Version> targetVersion = infrastructureVersions.getTargetVersionFor(nodeType); + Optional<Version> targetVersion = nodeRepository().infrastructureVersions().getTargetVersionFor(nodeType); if (!targetVersion.isPresent()) { logger.log(LogLevel.DEBUG, "No target version set for " + nodeType + ", removing application"); removeApplication(application.getApplicationId()); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java index f5fd8f61474..d6b392c4d64 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java @@ -29,9 +29,8 @@ public class LoadBalancerExpirer extends Maintainer { private final LoadBalancerService service; private final CuratorDatabaseClient db; - public LoadBalancerExpirer(NodeRepository nodeRepository, Duration interval, JobControl jobControl, - LoadBalancerService service) { - super(nodeRepository, interval, jobControl); + LoadBalancerExpirer(NodeRepository nodeRepository, Duration interval, LoadBalancerService service) { + super(nodeRepository, interval); this.service = Objects.requireNonNull(service, "service must be non-null"); this.db = nodeRepository.database(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Maintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Maintainer.java index 49ede9962eb..0d5a8587902 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Maintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Maintainer.java @@ -29,10 +29,10 @@ public abstract class Maintainer extends AbstractComponent implements Runnable { private final ScheduledExecutorService service; - public Maintainer(NodeRepository nodeRepository, Duration interval, JobControl jobControl) { + public Maintainer(NodeRepository nodeRepository, Duration interval) { this.nodeRepository = nodeRepository; this.interval = interval; - this.jobControl = jobControl; + this.jobControl = nodeRepository.jobControl(); HostName hostname = HostName.from(com.yahoo.net.HostName.getLocalhost()); long delay = staggeredDelay(nodeRepository.database().cluster(), hostname, nodeRepository.clock().instant(), interval); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java index 187fb639ac8..69e5ae32817 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java @@ -39,14 +39,13 @@ public class MetricsReporter extends Maintainer { private final Map<Map<String, String>, Metric.Context> contextMap = new HashMap<>(); private final Supplier<Integer> pendingRedeploymentsSupplier; - public MetricsReporter(NodeRepository nodeRepository, - Metric metric, - Orchestrator orchestrator, - ServiceMonitor serviceMonitor, - Supplier<Integer> pendingRedeploymentsSupplier, - Duration interval, - JobControl jobControl) { - super(nodeRepository, interval, jobControl); + MetricsReporter(NodeRepository nodeRepository, + Metric metric, + Orchestrator orchestrator, + ServiceMonitor serviceMonitor, + Supplier<Integer> pendingRedeploymentsSupplier, + Duration interval) { + super(nodeRepository, interval); this.metric = metric; this.orchestrator = orchestrator.getNodeStatuses(); this.serviceMonitor = serviceMonitor; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java index c5e727b23da..c15b1ea4abc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java @@ -76,10 +76,9 @@ public class NodeFailer extends Maintainer { ServiceMonitor serviceMonitor, NodeRepository nodeRepository, Duration downTimeLimit, Clock clock, Orchestrator orchestrator, ThrottlePolicy throttlePolicy, Metric metric, - JobControl jobControl, ConfigserverConfig configserverConfig) { // check ping status every five minutes, but at least twice as often as the down time limit - super(nodeRepository, min(downTimeLimit.dividedBy(2), Duration.ofMinutes(5)), jobControl); + super(nodeRepository, min(downTimeLimit.dividedBy(2), Duration.ofMinutes(5))); this.deployer = deployer; this.hostLivenessTracker = hostLivenessTracker; this.serviceMonitor = serviceMonitor; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java index 8f30394a239..67e76db05a7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java @@ -27,8 +27,8 @@ public class NodeRebooter extends Maintainer { private final Clock clock; private final Random random; - public NodeRebooter(NodeRepository nodeRepository, Clock clock, Duration rebootInterval, JobControl jobControl) { - super(nodeRepository, min(Duration.ofMinutes(25), rebootInterval), jobControl); + NodeRebooter(NodeRepository nodeRepository, Clock clock, Duration rebootInterval) { + super(nodeRepository, min(Duration.ofMinutes(25), rebootInterval)); this.rebootInterval = rebootInterval; this.clock = clock; this.random = new Random(clock.millis()); // seed with clock for test determinism diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java index 3b5f9d91725..4cfecb6c6aa 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java @@ -56,9 +56,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent { private final Optional<HostProvisionMaintainer> hostProvisionMaintainer; private final Optional<HostDeprovisionMaintainer> hostDeprovisionMaintainer; - private final JobControl jobControl; - private final InfrastructureVersions infrastructureVersions; - @Inject public NodeRepositoryMaintenance(NodeRepository nodeRepository, Deployer deployer, Provisioner provisioner, HostLivenessTracker hostLivenessTracker, ServiceMonitor serviceMonitor, @@ -77,27 +74,25 @@ public class NodeRepositoryMaintenance extends AbstractComponent { ConfigserverConfig configserverConfig, DuperModelInfraApi duperModelInfraApi, ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) { DefaultTimes defaults = new DefaultTimes(zone); - jobControl = new JobControl(nodeRepository.database()); - infrastructureVersions = new InfrastructureVersions(nodeRepository.database()); - - nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, durationFromEnv("fail_grace").orElse(defaults.failGrace), clock, orchestrator, throttlePolicyFromEnv().orElse(defaults.throttlePolicy), metric, jobControl, configserverConfig); - periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, nodeRepository, defaults.redeployMaintainerInterval, durationFromEnv("periodic_redeploy_interval").orElse(defaults.periodicRedeployInterval), jobControl); - operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, nodeRepository, clock, durationFromEnv("operator_change_redeploy_interval").orElse(defaults.operatorChangeRedeployInterval), jobControl); - reservationExpirer = new ReservationExpirer(nodeRepository, clock, durationFromEnv("reservation_expiry").orElse(defaults.reservationExpiry), jobControl); - retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, durationFromEnv("retired_interval").orElse(defaults.retiredInterval), durationFromEnv("retired_expiry").orElse(defaults.retiredExpiry), jobControl); - inactiveExpirer = new InactiveExpirer(nodeRepository, clock, durationFromEnv("inactive_expiry").orElse(defaults.inactiveExpiry), jobControl); - failedExpirer = new FailedExpirer(nodeRepository, zone, clock, durationFromEnv("failed_expirer_interval").orElse(defaults.failedExpirerInterval), jobControl); - dirtyExpirer = new DirtyExpirer(nodeRepository, clock, durationFromEnv("dirty_expiry").orElse(defaults.dirtyExpiry), jobControl); - provisionedExpirer = new ProvisionedExpirer(nodeRepository, clock, durationFromEnv("provisioned_expiry").orElse(defaults.provisionedExpiry), jobControl); - nodeRebooter = new NodeRebooter(nodeRepository, clock, durationFromEnv("reboot_interval").orElse(defaults.rebootInterval), jobControl); - metricsReporter = new MetricsReporter(nodeRepository, metric, orchestrator, serviceMonitor, periodicApplicationMaintainer::pendingDeployments, durationFromEnv("metrics_interval").orElse(defaults.metricsInterval), jobControl); - infrastructureProvisioner = new InfrastructureProvisioner(provisioner, nodeRepository, infrastructureVersions, durationFromEnv("infrastructure_provision_interval").orElse(defaults.infrastructureProvisionInterval), jobControl, duperModelInfraApi); + + nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, durationFromEnv("fail_grace").orElse(defaults.failGrace), clock, orchestrator, throttlePolicyFromEnv().orElse(defaults.throttlePolicy), metric, configserverConfig); + periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, nodeRepository, defaults.redeployMaintainerInterval, durationFromEnv("periodic_redeploy_interval").orElse(defaults.periodicRedeployInterval)); + operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, nodeRepository, clock, durationFromEnv("operator_change_redeploy_interval").orElse(defaults.operatorChangeRedeployInterval)); + reservationExpirer = new ReservationExpirer(nodeRepository, clock, durationFromEnv("reservation_expiry").orElse(defaults.reservationExpiry)); + retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, durationFromEnv("retired_interval").orElse(defaults.retiredInterval), durationFromEnv("retired_expiry").orElse(defaults.retiredExpiry)); + inactiveExpirer = new InactiveExpirer(nodeRepository, clock, durationFromEnv("inactive_expiry").orElse(defaults.inactiveExpiry)); + failedExpirer = new FailedExpirer(nodeRepository, zone, clock, durationFromEnv("failed_expirer_interval").orElse(defaults.failedExpirerInterval)); + dirtyExpirer = new DirtyExpirer(nodeRepository, clock, durationFromEnv("dirty_expiry").orElse(defaults.dirtyExpiry)); + provisionedExpirer = new ProvisionedExpirer(nodeRepository, clock, durationFromEnv("provisioned_expiry").orElse(defaults.provisionedExpiry)); + nodeRebooter = new NodeRebooter(nodeRepository, clock, durationFromEnv("reboot_interval").orElse(defaults.rebootInterval)); + metricsReporter = new MetricsReporter(nodeRepository, metric, orchestrator, serviceMonitor, periodicApplicationMaintainer::pendingDeployments, durationFromEnv("metrics_interval").orElse(defaults.metricsInterval)); + infrastructureProvisioner = new InfrastructureProvisioner(provisioner, nodeRepository, durationFromEnv("infrastructure_provision_interval").orElse(defaults.infrastructureProvisionInterval), duperModelInfraApi); loadBalancerExpirer = provisionServiceProvider.getLoadBalancerService().map(lbService -> - new LoadBalancerExpirer(nodeRepository, durationFromEnv("load_balancer_expiry").orElse(defaults.loadBalancerExpiry), jobControl, lbService)); + new LoadBalancerExpirer(nodeRepository, durationFromEnv("load_balancer_expiry").orElse(defaults.loadBalancerExpiry), lbService)); hostProvisionMaintainer = provisionServiceProvider.getHostProvisioner().map(hostProvisioner -> - new HostProvisionMaintainer(nodeRepository, durationFromEnv("host_provisioner_interval").orElse(defaults.hostProvisionerInterval), jobControl, hostProvisioner, flagSource)); + new HostProvisionMaintainer(nodeRepository, durationFromEnv("host_provisioner_interval").orElse(defaults.hostProvisionerInterval), hostProvisioner, flagSource)); hostDeprovisionMaintainer = provisionServiceProvider.getHostProvisioner().map(hostProvisioner -> - new HostDeprovisionMaintainer(nodeRepository, durationFromEnv("host_deprovisioner_interval").orElse(defaults.hostDeprovisionerInterval), jobControl, hostProvisioner, flagSource)); + new HostDeprovisionMaintainer(nodeRepository, durationFromEnv("host_deprovisioner_interval").orElse(defaults.hostDeprovisionerInterval), hostProvisioner, flagSource)); // The DuperModel is filled with infrastructure applications by the infrastructure provisioner, so explicitly run that now infrastructureProvisioner.maintain(); @@ -105,7 +100,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent { RetirementPolicy policy = new RetirementPolicyList(new RetireIPv4OnlyNodes(zone)); FlavorSpareChecker flavorSpareChecker = new FlavorSpareChecker( NodeRetirer.SPARE_NODES_POLICY, FlavorSpareCount.constructFlavorSpareCountGraph(zone.nodeFlavors().get().getFlavors())); - nodeRetirer = new NodeRetirer(nodeRepository, flavorSpareChecker, durationFromEnv("retire_interval").orElse(defaults.nodeRetirerInterval), deployer, jobControl, policy); + nodeRetirer = new NodeRetirer(nodeRepository, flavorSpareChecker, durationFromEnv("retire_interval").orElse(defaults.nodeRetirerInterval), deployer, policy); } @Override @@ -128,12 +123,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent { hostDeprovisionMaintainer.ifPresent(Maintainer::deconstruct); } - public JobControl jobControl() { return jobControl; } - - public InfrastructureVersions infrastructureVersions() { - return infrastructureVersions; - } - private static Optional<Duration> durationFromEnv(String envVariable) { return Optional.ofNullable(System.getenv(envPrefix + envVariable)).map(Long::parseLong).map(Duration::ofSeconds); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java index 3113aaf45cc..89b180744f1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java @@ -45,9 +45,9 @@ public class NodeRetirer extends Maintainer { private final FlavorSpareChecker flavorSpareChecker; private final RetirementPolicy retirementPolicy; - public NodeRetirer(NodeRepository nodeRepository, FlavorSpareChecker flavorSpareChecker, Duration interval, - Deployer deployer, JobControl jobControl, RetirementPolicy retirementPolicy) { - super(nodeRepository, interval, jobControl); + NodeRetirer(NodeRepository nodeRepository, FlavorSpareChecker flavorSpareChecker, Duration interval, + Deployer deployer, RetirementPolicy retirementPolicy) { + super(nodeRepository, interval); this.deployer = deployer; this.retirementPolicy = retirementPolicy; this.flavorSpareChecker = flavorSpareChecker; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java index b9e27e5d4ae..872725e32b1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java @@ -36,9 +36,8 @@ public class OperatorChangeApplicationMaintainer extends ApplicationMaintainer { private Instant previousRun; - public OperatorChangeApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Clock clock, - Duration interval, JobControl jobControl) { - super(deployer, nodeRepository, interval, jobControl); + OperatorChangeApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Clock clock, Duration interval) { + super(deployer, nodeRepository, interval); this.clock = clock; previousRun = clock.instant(); // Changes before this will be caught by the first PeriodicApplicationMaintainer run } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java index 2525dbecca2..174591b0836 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java @@ -30,9 +30,9 @@ public class PeriodicApplicationMaintainer extends ApplicationMaintainer { private final Clock clock; private final Instant start; - public PeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, - Duration interval, Duration minTimeBetweenRedeployments, JobControl jobControl) { - super(deployer, nodeRepository, interval, jobControl); + PeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, + Duration interval, Duration minTimeBetweenRedeployments) { + super(deployer, nodeRepository, interval); this.minTimeBetweenRedeployments = minTimeBetweenRedeployments; this.clock = nodeRepository.clock(); this.start = clock.instant(); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ProvisionedExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ProvisionedExpirer.java index b41eedd4694..3109e55df5c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ProvisionedExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ProvisionedExpirer.java @@ -19,8 +19,8 @@ public class ProvisionedExpirer extends Expirer { private final NodeRepository nodeRepository; - public ProvisionedExpirer(NodeRepository nodeRepository, Clock clock, Duration dirtyTimeout, JobControl jobControl) { - super(Node.State.provisioned, History.Event.Type.provisioned, nodeRepository, clock, dirtyTimeout, jobControl); + ProvisionedExpirer(NodeRepository nodeRepository, Clock clock, Duration dirtyTimeout) { + super(Node.State.provisioned, History.Event.Type.provisioned, nodeRepository, clock, dirtyTimeout); this.nodeRepository = nodeRepository; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirer.java index 7cf8adc2319..b0aa389fe7d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirer.java @@ -6,8 +6,8 @@ import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.History; -import java.time.Duration; import java.time.Clock; +import java.time.Duration; import java.util.List; /** @@ -22,9 +22,8 @@ public class ReservationExpirer extends Expirer { private final NodeRepository nodeRepository; - public ReservationExpirer(NodeRepository nodeRepository, Clock clock, Duration reservationPeriod, - JobControl jobControl) { - super(Node.State.reserved, History.Event.Type.reserved, nodeRepository, clock, reservationPeriod, jobControl); + public ReservationExpirer(NodeRepository nodeRepository, Clock clock, Duration reservationPeriod) { + super(Node.State.reserved, History.Event.Type.reserved, nodeRepository, clock, reservationPeriod); this.nodeRepository = nodeRepository; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java index dcd623a3212..c27989cb852 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java @@ -37,9 +37,8 @@ public class RetiredExpirer extends Maintainer { Deployer deployer, Clock clock, Duration maintenanceInterval, - Duration retiredExpiry, - JobControl jobControl) { - super(nodeRepository, maintenanceInterval, jobControl); + Duration retiredExpiry) { + super(nodeRepository, maintenanceInterval); this.deployer = deployer; this.orchestrator = orchestrator; this.retiredExpiry = retiredExpiry; 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 a18b7ab72ad..c4d666cd71c 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 @@ -18,7 +18,6 @@ import com.yahoo.vespa.config.SlimeUtils; import com.yahoo.vespa.hosted.provision.NoSuchNodeException; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import com.yahoo.vespa.hosted.provision.maintenance.NodeRepositoryMaintenance; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.filter.ApplicationFilter; import com.yahoo.vespa.hosted.provision.node.filter.NodeFilter; @@ -55,18 +54,15 @@ public class NodesApiHandler extends LoggingRequestHandler { private final Orchestrator orchestrator; private final NodeRepository nodeRepository; - private final NodeRepositoryMaintenance maintenance; private final NodeFlavors nodeFlavors; private final NodeSerializer serializer = new NodeSerializer(); @Inject public NodesApiHandler(LoggingRequestHandler.Context parentCtx, Orchestrator orchestrator, - NodeRepository nodeRepository, - NodeRepositoryMaintenance maintenance, NodeFlavors flavors) { + NodeRepository nodeRepository, NodeFlavors flavors) { super(parentCtx); this.orchestrator = orchestrator; this.nodeRepository = nodeRepository; - this.maintenance = maintenance; this.nodeFlavors = flavors; } @@ -103,8 +99,8 @@ public class NodesApiHandler extends LoggingRequestHandler { if (path.startsWith("/nodes/v2/state/")) return new NodesResponse(ResponseType.nodesInStateList, request, orchestrator, nodeRepository); if (path.startsWith("/nodes/v2/acl/")) return new NodeAclResponse(request, nodeRepository); if (path.equals( "/nodes/v2/command/")) return ResourcesResponse.fromStrings(request.getUri(), "restart", "reboot"); - if (path.equals( "/nodes/v2/maintenance/")) return new JobsResponse(maintenance.jobControl()); - if (path.equals( "/nodes/v2/upgrade/")) return new UpgradeResponse(maintenance.infrastructureVersions(), nodeRepository.osVersions(), nodeRepository.dockerImages()); + if (path.equals( "/nodes/v2/maintenance/")) return new JobsResponse(nodeRepository.jobControl()); + if (path.equals( "/nodes/v2/upgrade/")) return new UpgradeResponse(nodeRepository.infrastructureVersions(), nodeRepository.osVersions(), nodeRepository.dockerImages()); throw new NotFoundException("Nothing at path '" + path + "'"); } @@ -269,9 +265,9 @@ public class NodesApiHandler extends LoggingRequestHandler { } private MessageResponse setJobActive(String jobName, boolean active) { - if ( ! maintenance.jobControl().jobs().contains(jobName)) + if ( ! nodeRepository.jobControl().jobs().contains(jobName)) throw new NotFoundException("No job named '" + jobName + "'"); - maintenance.jobControl().setActive(jobName, active); + nodeRepository.jobControl().setActive(jobName, active); return new MessageResponse((active ? "Re-activated" : "Deactivated" ) + " job '" + jobName + "'"); } @@ -287,7 +283,7 @@ public class NodesApiHandler extends LoggingRequestHandler { if (versionField.valid()) { Version version = Version.fromString(versionField.asString()); - maintenance.infrastructureVersions().setTargetVersion(nodeType, version, force); + nodeRepository.infrastructureVersions().setTargetVersion(nodeType, version, force); messageParts.add("version to " + version.toFullString()); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index a1a959b6438..c5c1e9dae16 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -252,8 +252,7 @@ public class FailedExpirerTest { DockerImage.fromString("docker-image"), true); this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource()); - this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30), - new JobControl(nodeRepository.database())); + this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30)); } public ManualClock clock() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainerTest.java index aa057d794d1..e8fbe76fbd4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostDeprovisionMaintainerTest.java @@ -37,7 +37,7 @@ public class HostDeprovisionMaintainerTest { private final HostProvisioner hostProvisioner = mock(HostProvisioner.class); private final FlagSource flagSource = new InMemoryFlagSource().withBooleanFlag(Flags.ENABLE_DYNAMIC_PROVISIONING.id(), true); private final HostDeprovisionMaintainer maintainer = new HostDeprovisionMaintainer( - tester.nodeRepository(), Duration.ofDays(1), tester.jobControl(), hostProvisioner, flagSource); + tester.nodeRepository(), Duration.ofDays(1), hostProvisioner, flagSource); @Test public void removes_nodes_if_successful() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java index 54f4ddd6924..a943637bade 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java @@ -57,7 +57,7 @@ public class HostProvisionMaintainerTest { private final HostProvisioner hostProvisioner = mock(HostProvisioner.class); private final FlagSource flagSource = new InMemoryFlagSource().withBooleanFlag(Flags.ENABLE_DYNAMIC_PROVISIONING.id(), true); private final HostProvisionMaintainer maintainer = new HostProvisionMaintainer( - tester.nodeRepository(), Duration.ofDays(1), tester.jobControl(), hostProvisioner, flagSource); + tester.nodeRepository(), Duration.ofDays(1), hostProvisioner, flagSource); @Test public void delegates_to_host_provisioner_and_writes_back_result() { @@ -154,9 +154,5 @@ public class HostProvisionMaintainerTest { NodeRepository nodeRepository() { return nodeRepository; } - - JobControl jobControl() { - return new JobControl(nodeRepository.database()); - } } }
\ No newline at end of file diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java index 35225f8abac..6710363d4de 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java @@ -61,7 +61,7 @@ public class InactiveAndFailedExpirerTest { // Inactive times out tester.advanceTime(Duration.ofMinutes(14)); - new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run(); + new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10)).run(); assertEquals(0, tester.nodeRepository().getNodes(Node.State.inactive).size()); List<Node> dirty = tester.nodeRepository().getNodes(Node.State.dirty); assertEquals(2, dirty.size()); @@ -76,7 +76,7 @@ public class InactiveAndFailedExpirerTest { // Dirty times out for the other one tester.advanceTime(Duration.ofMinutes(14)); - new DirtyExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run(); + new DirtyExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10)).run(); assertEquals(0, tester.nodeRepository().getNodes(NodeType.tenant, Node.State.dirty).size()); List<Node> failed = tester.nodeRepository().getNodes(NodeType.tenant, Node.State.failed); assertEquals(1, failed.size()); @@ -107,7 +107,7 @@ public class InactiveAndFailedExpirerTest { // Inactive times out and node is moved to dirty tester.advanceTime(Duration.ofMinutes(14)); - new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run(); + new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10)).run(); List<Node> dirty = tester.nodeRepository().getNodes(Node.State.dirty); assertEquals(2, dirty.size()); @@ -155,12 +155,12 @@ public class InactiveAndFailedExpirerTest { Orchestrator orchestrator = mock(Orchestrator.class); doThrow(new RuntimeException()).when(orchestrator).acquirePermissionToRemove(any()); new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), - Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run(); + Duration.ofMinutes(10)).run(); assertEquals(1, tester.nodeRepository().getNodes(Node.State.inactive).size()); // Inactive times out and one node is moved to parked tester.advanceTime(Duration.ofMinutes(11)); // Trigger InactiveExpirer - new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run(); + new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10)).run(); assertEquals(1, tester.nodeRepository().getNodes(Node.State.parked).size()); } @@ -182,7 +182,7 @@ public class InactiveAndFailedExpirerTest { assertEquals(1, inactiveNodes.size()); // See that nodes are moved to dirty immediately. - new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run(); + new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10)).run(); assertEquals(0, tester.nodeRepository().getNodes(Node.State.inactive).size()); List<Node> dirty = tester.nodeRepository().getNodes(Node.State.dirty); assertEquals(1, dirty.size()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisionerTest.java index 8ac6ccac6ad..965a62770c6 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisionerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureProvisionerTest.java @@ -54,11 +54,10 @@ public class InfrastructureProvisionerTest { private final NodeRepositoryTester tester = new NodeRepositoryTester(); private final Provisioner provisioner = mock(Provisioner.class); private final NodeRepository nodeRepository = tester.nodeRepository(); - private final InfrastructureVersions infrastructureVersions = mock(InfrastructureVersions.class); + private final InfrastructureVersions infrastructureVersions = nodeRepository.infrastructureVersions(); private final DuperModelInfraApi duperModelInfraApi = mock(DuperModelInfraApi.class); private final InfrastructureProvisioner infrastructureProvisioner = new InfrastructureProvisioner( - provisioner, nodeRepository, infrastructureVersions, Duration.ofDays(99), new JobControl(nodeRepository.database()), - duperModelInfraApi); + provisioner, nodeRepository, Duration.ofDays(99), duperModelInfraApi); private final HostName node1 = HostName.from("node-1"); private final HostName node2 = HostName.from("node-2"); private final HostName node3 = HostName.from("node-3"); @@ -76,7 +75,6 @@ public class InfrastructureProvisionerTest { @Test public void remove_application_if_without_target_version() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.empty()); addNode(1, Node.State.active, Optional.of(target)); when(duperModelInfraApi.infraApplicationIsActive(eq(application.getApplicationId()))).thenReturn(true); infrastructureProvisioner.maintain(); @@ -95,7 +93,7 @@ public class InfrastructureProvisionerTest { } private void remove_application_without_nodes(boolean applicationIsActive) { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); + infrastructureVersions.setTargetVersion(nodeType, target, false); addNode(1, Node.State.failed, Optional.of(target)); addNode(2, Node.State.parked, Optional.empty()); when(duperModelInfraApi.infraApplicationIsActive(eq(application.getApplicationId()))).thenReturn(applicationIsActive); @@ -110,7 +108,7 @@ public class InfrastructureProvisionerTest { @Test public void activate_when_no_op() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); + infrastructureVersions.setTargetVersion(nodeType, target, false); addNode(1, Node.State.failed, Optional.of(oldVersion)); addNode(2, Node.State.parked, Optional.of(target)); @@ -128,7 +126,7 @@ public class InfrastructureProvisionerTest { @Test public void activates_after_target_has_been_set_the_first_time() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); + infrastructureVersions.setTargetVersion(nodeType, target, false); addNode(1, Node.State.inactive, Optional.empty()); addNode(2, Node.State.parked, Optional.empty()); @@ -150,7 +148,7 @@ public class InfrastructureProvisionerTest { @Test public void always_activates_for_dupermodel() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); + infrastructureVersions.setTargetVersion(nodeType, target, false); addNode(1, Node.State.active, Optional.of(target)); @@ -173,7 +171,7 @@ public class InfrastructureProvisionerTest { @Test public void provision_usable_nodes_on_old_version() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); + infrastructureVersions.setTargetVersion(nodeType, target, false); addNode(1, Node.State.failed, Optional.of(oldVersion)); addNode(2, Node.State.inactive, Optional.of(target)); @@ -193,7 +191,7 @@ public class InfrastructureProvisionerTest { @Test public void provision_with_usable_node_without_version() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); + infrastructureVersions.setTargetVersion(nodeType, target, false); addNode(1, Node.State.failed, Optional.of(oldVersion)); addNode(2, Node.State.ready, Optional.empty()); @@ -213,8 +211,8 @@ public class InfrastructureProvisionerTest { @Test public void avoid_provisioning_if_no_usable_nodes() { - when(infrastructureVersions.getTargetVersionFor(eq(nodeType))).thenReturn(Optional.of(target)); when(duperModelInfraApi.infraApplicationIsActive(eq(application.getApplicationId()))).thenReturn(true); + infrastructureVersions.setTargetVersion(nodeType, target, false); infrastructureProvisioner.maintain(); verifyRemoved(1); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/JobControlTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/JobControlTest.java index 195b2ff269f..729e7f4cd94 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/JobControlTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/JobControlTest.java @@ -55,8 +55,8 @@ public class JobControlTest { @Test public void testJobControlMayDeactivateJobs() { NodeRepositoryTester tester = new NodeRepositoryTester(); - JobControl jobControl = new JobControl(tester.nodeRepository().database()); - MockMaintainer mockMaintainer = new MockMaintainer(tester.nodeRepository(), jobControl); + JobControl jobControl = tester.nodeRepository().jobControl(); + MockMaintainer mockMaintainer = new MockMaintainer(tester.nodeRepository()); assertTrue(jobControl.jobs().contains("MockMaintainer")); @@ -78,8 +78,8 @@ public class JobControlTest { int maintenanceInvocations = 0; - public MockMaintainer(NodeRepository nodeRepository, JobControl jobControl) { - super(nodeRepository, Duration.ofHours(1), jobControl); + private MockMaintainer(NodeRepository nodeRepository) { + super(nodeRepository, Duration.ofHours(1)); } @Override diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java index 52d297232de..9f251eea9bf 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java @@ -33,7 +33,6 @@ public class LoadBalancerExpirerTest { public void test_maintain() { LoadBalancerExpirer expirer = new LoadBalancerExpirer(tester.nodeRepository(), Duration.ofDays(1), - new JobControl(tester.nodeRepository().database()), tester.loadBalancerService()); Supplier<Map<LoadBalancerId, LoadBalancer>> loadBalancers = () -> tester.nodeRepository().database().readLoadBalancers(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java index 1d12d31e814..798df66f6cd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java @@ -66,9 +66,4 @@ public class MaintenanceTester { .map(n -> n.withCurrentRebootGeneration(n.status().reboot().wanted(), Instant.now(clock))) .collect(Collectors.toList()); } - - public JobControl jobControl() { - return new JobControl(nodeRepository.database()); - } - } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index f1543e624dc..d51aabc731a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -99,8 +99,7 @@ public class MetricsReporterTest { orchestrator, serviceMonitor, () -> 42, - Duration.ofMinutes(1), - new JobControl(nodeRepository.database()) + Duration.ofMinutes(1) ); metricsReporter.maintain(); @@ -146,8 +145,7 @@ public class MetricsReporterTest { orchestrator, serviceMonitor, () -> 42, - Duration.ofMinutes(1), - new JobControl(nodeRepository.database()) + Duration.ofMinutes(1) ); metricsReporter.maintain(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index 77f6a801d04..0ead179e0ea 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -26,7 +26,6 @@ import com.yahoo.vespa.curator.transaction.CuratorTransaction; 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.monitoring.MetricsReporterTest; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; @@ -207,7 +206,7 @@ public class NodeFailTester { } public NodeFailer createFailer() { - return new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, downtimeLimitOneHour, clock, orchestrator, NodeFailer.ThrottlePolicy.hosted, metric, new JobControl(nodeRepository.database()), configserverConfig); + return new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, downtimeLimitOneHour, clock, orchestrator, NodeFailer.ThrottlePolicy.hosted, metric, configserverConfig); } public void allNodesMakeAConfigRequestExcept(Node ... deadNodeArray) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java index fe29b3b9fe2..2e0d43070b9 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java @@ -26,7 +26,7 @@ public class NodeRebooterTest { // reboots will be performed. tester.clock.advance(rebootInterval); - NodeRebooter rebooter = new NodeRebooter(tester.nodeRepository, tester.clock, rebootInterval, tester.jobControl()); + NodeRebooter rebooter = new NodeRebooter(tester.nodeRepository, tester.clock, rebootInterval); maintenanceIntervals(rebooter, tester, 1); assertEquals("All tenant nodes have reboot scheduled", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java index aa0d3076b02..0afe279171e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java @@ -61,7 +61,6 @@ public class NodeRetirerTester { public final NodeRepository nodeRepository; private final FlavorSpareChecker flavorSpareChecker = mock(FlavorSpareChecker.class); private final MockDeployer deployer; - private final JobControl jobControl; private final List<Flavor> flavors; // Use LinkedHashMap to keep order in which applications were deployed @@ -76,7 +75,6 @@ public class NodeRetirerTester { Curator curator = new MockCurator(); nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true); - jobControl = new JobControl(nodeRepository.database()); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); deployer = new MockDeployer(provisioner, clock, apps); flavors = nodeFlavors.getFlavors().stream().sorted(Comparator.comparing(Flavor::name)).collect(Collectors.toList()); @@ -89,7 +87,7 @@ public class NodeRetirerTester { } NodeRetirer makeNodeRetirer(RetirementPolicy policy) { - return new NodeRetirer(nodeRepository, flavorSpareChecker, Duration.ofDays(1), deployer, jobControl, policy); + return new NodeRetirer(nodeRepository, flavorSpareChecker, Duration.ofDays(1), deployer, policy); } void createReadyNodesByFlavor(int... nums) { @@ -127,8 +125,8 @@ public class NodeRetirerTester { void iterateMaintainers() { if (retiredExpirer == null) { - retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, Duration.ofDays(30), Duration.ofMinutes(10), jobControl); - inactiveExpirer = new InactiveExpirer(nodeRepository, clock, Duration.ofMinutes(10), jobControl); + retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, Duration.ofDays(30), Duration.ofMinutes(10)); + inactiveExpirer = new InactiveExpirer(nodeRepository, clock, Duration.ofMinutes(10)); } clock.advance(Duration.ofMinutes(11)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index 1a6d613f5b4..a3d651519ea 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java @@ -68,7 +68,7 @@ public class OperatorChangeApplicationMaintainerTest { // Create applications fixture.activate(); - OperatorChangeApplicationMaintainer maintainer = new OperatorChangeApplicationMaintainer(fixture.deployer, nodeRepository, clock, Duration.ofMinutes(1), new JobControl(nodeRepository.database())); + OperatorChangeApplicationMaintainer maintainer = new OperatorChangeApplicationMaintainer(fixture.deployer, nodeRepository, clock, Duration.ofMinutes(1)); clock.advance(Duration.ofMinutes(2)); maintainer.maintain(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java index a61571c574b..1835ca9968c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java @@ -308,7 +308,7 @@ public class PeriodicApplicationMaintainerTest { TestablePeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval, Duration minTimeBetweenRedeployments) { - super(deployer, nodeRepository, interval, minTimeBetweenRedeployments, new JobControl(nodeRepository.database())); + super(deployer, nodeRepository, interval, minTimeBetweenRedeployments); } @Override diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java index cd7fdec4d23..64267557f64 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java @@ -66,7 +66,7 @@ public class ReservationExpirerTest { // Reservation times out clock.advance(Duration.ofMinutes(14)); // Reserved but not used time out - new ReservationExpirer(nodeRepository, clock, Duration.ofMinutes(10), new JobControl(nodeRepository.database())).run(); + new ReservationExpirer(nodeRepository, clock, Duration.ofMinutes(10)).run(); // Assert nothing is reserved assertEquals(0, nodeRepository.getNodes(NodeType.tenant, Node.State.reserved).size()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index 15e567fea85..2f7e61f49c9 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java @@ -226,7 +226,6 @@ public class RetiredExpirerTest { deployer, clock, Duration.ofDays(30), /* Maintenance interval, use large value so it never runs by itself */ - RETIRED_EXPIRATION, - new JobControl(nodeRepository.database())); + RETIRED_EXPIRATION); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java index aca3c884ffc..b266f546b49 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java @@ -10,7 +10,6 @@ import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.hosted.provision.Node; -import com.yahoo.vespa.hosted.provision.maintenance.JobControl; import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import org.junit.Ignore; @@ -25,8 +24,8 @@ import java.util.Optional; import java.util.Set; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; /** * @author bratseth @@ -138,7 +137,7 @@ public class MultigroupProvisioningTest { new MockDeployer.ApplicationContext(application1, cluster(), Capacity.fromNodeCount(8, Optional.of("large"), false, true), 1))); new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), - Duration.ofHours(12), new JobControl(tester.nodeRepository().database())).run(); + Duration.ofHours(12)).run(); assertEquals(8, tester.getNodes(application1, Node.State.inactive).flavor("small").size()); deploy(application1, 8, 8, "large", tester); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java index d043d8b406c..abe28b107f7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java @@ -8,7 +8,6 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; -import com.yahoo.vespa.hosted.provision.maintenance.JobControl; import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; @@ -98,7 +97,7 @@ public class NodeTypeProvisioningTest { Collections.singletonMap( application, new MockDeployer.ApplicationContext(application, clusterSpec, capacity, 1))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, - tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())); + tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10)); { // Deploy List<HostSpec> hosts = deployProxies(application, tester); @@ -163,7 +162,7 @@ public class NodeTypeProvisioningTest { Collections.singletonMap( application, new MockDeployer.ApplicationContext(application, clusterSpec, capacity, 1))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, - tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())); + tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10)); final int numNodesToRetire = 5; { // Deploy diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index 0eca5e25d85..f1caa52a1b5 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -24,7 +24,6 @@ import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; -import com.yahoo.vespa.hosted.provision.maintenance.JobControl; import com.yahoo.vespa.hosted.provision.maintenance.ReservationExpirer; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.History; @@ -760,8 +759,7 @@ public class ProvisioningTest { // Over 10 minutes pass since first reservation. First set of reserved nodes are not expired tester.clock().advance(Duration.ofMinutes(8).plus(Duration.ofSeconds(1))); ReservationExpirer expirer = new ReservationExpirer(tester.nodeRepository(), tester.clock(), - Duration.ofMinutes(10), - new JobControl(tester.nodeRepository().database())); + Duration.ofMinutes(10)); expirer.run(); assertEquals("Nodes remain reserved", 4, tester.getNodes(application, Node.State.reserved).size()); |