/*
 * 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.
 */

#ifndef PREEMPTIONRESOURCEREQUEST_H_
#define PREEMPTIONRESOURCEREQUEST_H_

#include "YARN_yarn_protos.pb.h"

#include "ResourceRequest.h"

using namespace hadoop;
using namespace yarn;
namespace libyarn {

class PreemptionResourceRequest {
public:
	PreemptionResourceRequest();
	PreemptionResourceRequest(const PreemptionResourceRequestProto &proto);
	virtual ~PreemptionResourceRequest();

	PreemptionResourceRequestProto& getProto();
	ResourceRequest getResourceRequest();
	void setResourceRequest(ResourceRequest &rr);
private:
	PreemptionResourceRequestProto requestProto;
};

} /* namespace libyarn */

#endif /* PREEMPTIONRESOURCEREQUEST_H_ */

//message PreemptionResourceRequestProto {
//  optional ResourceRequestProto resource = 1;
//}
