// 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.exception;

import com.cloud.agent.api.Command;
import com.cloud.utils.SerialVersionUID;

/**
 * wait timeout.
 */
public class OperationTimedoutException extends CloudException {
    private static final long serialVersionUID = SerialVersionUID.OperationTimedoutException;

    long _agentId;
    long _seqId;
    int _time;

    // TODO
    // I did a reference search on usage of getCommands() and found none
    //
    // to prevent serialization problems across boundaries, I'm disabling serialization of _cmds here
    // getCommands() will still be available within the same serialization boundary, but it will be lost
    // when exception is propagated across job boundaries.
    //
    transient Command[] _cmds;
    boolean _isActive;

    public OperationTimedoutException(Command[] cmds, long agentId, long seqId, int time, boolean isActive) {
        super("Commands " + seqId + " to Host " + agentId + " timed out after " + time + " secs");
        _agentId = agentId;
        _seqId = seqId;
        _time = time;
        _cmds = cmds;
        _isActive = isActive;
    }

    public long getAgentId() {
        return _agentId;
    }

    public long getSequenceId() {
        return _seqId;
    }

    public int getWaitTime() {
        return _time;
    }

    public Command[] getCommands() {
        return _cmds;
    }

    public boolean isActive() {
        return _isActive;
    }
}
