| // 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<Integer> 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<Integer> 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<Integer> 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<Boolean, String, Pair<List<HostUpdated>, List<HostSkipped>>> startRollingMaintenance(StartRollingMaintenanceCmd cmd); |
| Pair<ResourceType, List<Long>> getResourceTypeIdPair(StartRollingMaintenanceCmd cmd); |
| } |