// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.resource; import com.cloud.host.Host; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.api.command.admin.resource.StartRollingMaintenanceCmd; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import java.util.Date; import java.util.List; public interface RollingMaintenanceManager extends Configurable { ConfigKey KvmRollingMaintenanceStageTimeout = new ConfigKey<>("Advanced", Integer.class, "kvm.rolling.maintenance.stage.timeout", "1800", "Wait timeout (in seconds) for a rolling maintenance stage update from hosts", true, ConfigKey.Scope.Global); ConfigKey KvmRollingMaintenancePingInterval = new ConfigKey<>("Advanced", Integer.class, "kvm.rolling.maintenance.ping.interval", "10", "Ping interval in seconds between management server and hosts performing stages during rolling maintenance", true, ConfigKey.Scope.Global); ConfigKey KvmRollingMaintenanceWaitForMaintenanceTimeout = new ConfigKey<>("Advanced", Integer.class, "kvm.rolling.maintenance.wait.maintenance.timeout", "1800", "Timeout (in seconds) to wait for a host preparing to enter maintenance mode", true, ConfigKey.Scope.Global); class HostSkipped { private Host host; private String reason; public HostSkipped(Host host, String reason) { this.host = host; this.reason = reason; } public Host getHost() { return host; } public void setHost(Host host) { this.host = host; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } } class HostUpdated { private Host host; private Date start; private Date end; private String outputMsg; public HostUpdated(Host host, Date start, Date end, String outputMsg) { this.host = host; this.start = start; this.end = end; this.outputMsg = outputMsg; } public Host getHost() { return host; } public void setHost(Host host) { this.host = host; } public Date getStart() { return start; } public void setStart(Date start) { this.start = start; } public Date getEnd() { return end; } public void setEnd(Date end) { this.end = end; } public String getOutputMsg() { return outputMsg; } public void setOutputMsg(String outputMsg) { this.outputMsg = outputMsg; } } enum Stage { PreFlight, PreMaintenance, Maintenance, PostMaintenance; public Stage next() { switch (this) { case PreFlight: return PreMaintenance; case PreMaintenance: return Maintenance; case Maintenance: return PostMaintenance; case PostMaintenance: return null; } throw new CloudRuntimeException("Unexpected stage: " + this); } } enum ResourceType { Pod, Cluster, Zone, Host } /** * Starts rolling maintenance as specified in cmd * @param cmd command * @return tuple: (SUCCESS, DETAILS, (HOSTS_UPDATED, HOSTS_SKIPPED)) */ Ternary, List>> startRollingMaintenance(StartRollingMaintenanceCmd cmd); Pair> getResourceTypeIdPair(StartRollingMaintenanceCmd cmd); }