# 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.    

enum Errors {
	ConvertedException = 1,
	NoSuchInstanceId = 2,
	NoSuchVmId = 3,
	IncorrectVmState = 4,
	NoSuchHost = 5,
	NoSuchHostId = 6,
	InstanceIdAlreadyExists = 7,
	HostNameMismatch = 8,
	HostNotUp = 9,
	HostStateError = 10,
	InvalidInstance = 11,
	UnableToResume = 12,
	UnableToSuspend = 13,
}

enum InstanceState {
	Pending = 1,		// Job submitted
	Activating = 2,		// activateVm has been called, but instantiateVm hasn't finished yet
	Running = 3,		// Normal state
	Pausing = 4,		// Beginning pause sequence
	Paused = 5		// Paused
	Unpausing = 6,		// Beginning unpause sequence
	Suspending = 7,		// Beginning suspend sequence
	Resuming = 8,		// Beginning resume sequence
	MigratePrep = 9,	// Migrate state #1
	MigrateTrans = 10,	// Migrate state #2
	ShuttingDown = 11,	// Beginning exit sequence
	Destroying = 12,	// Beginning exit sequence
	Orphaned = 13,		// Host is missing
	Held = 14,		// Activation failed
	Exited = 15,		// VM has exited
	Suspended = 16,		// VM is suspended
}

enum HostState {
	Normal = 1,
	Drained = 2,
	VersionMismatch = 3
}

exception TashiException {
	1: Errors errno
	2: string msg
}

struct Host {
	1:i32 id,
	2:string name,
	3:bool up,
	4:bool decayed,
	5:HostState state,
	6:i32 memory,
	7:i32 cores,
	8:string version
	// Other properties (disk?)
}

struct Network {
	1:i32 id
	2:string name
}

struct User {
	1:i32 id,
	2:string name
}

struct DiskConfiguration {
	1:string uri,
	2:bool persistent
}

struct NetworkConfiguration {
	1:i32 network,
	2:string mac,
	3:string ip
}

struct Instance {
	1:i32 id,
	2:i32 vmId,
	3:i32 hostId,
	4:bool decayed,
	5:InstanceState state,
	6:i32 userId,
	7:string name, // User specified
	8:i32 cores, // User specified
	9:i32 memory, // User specified
	10:list<DiskConfiguration> disks, // User specified
	11:list<NetworkConfiguration> nics // User specified
	12:map<string, string> hints // User specified
}

service clustermanagerservice {
	// Client-facing RPCs
	Instance createVm(1:Instance instance) throws (1:TashiException e)
	
	void shutdownVm(1:i32 instanceId) throws (1:TashiException e)
	void destroyVm(1:i32 instanceId) throws (1:TashiException e)
	
	void suspendVm(1:i32 instanceId) throws (1:TashiException e)
	Instance resumeVm(1:i32 instanceId) throws (1:TashiException e)
	
	void migrateVm(1:i32 instanceId, 2:i32 targetHostId) throws (1:TashiException e)
	
	void pauseVm(1:i32 instanceId) throws (1:TashiException e)
	void unpauseVm(1:i32 instanceId) throws (1:TashiException e)
	
	list<Host> getHosts() throws (1:TashiException e)
	list<Network> getNetworks() throws (1:TashiException e)
	list<User> getUsers() throws (1:TashiException e)

	list<Instance> getInstances() throws (1:TashiException e)
	
	string vmmSpecificCall(1:i32 instanceId, 2:string arg) throws (1:TashiException e)
	
	// NodeManager-facing RPCs
	i32 registerNodeManager(1:Host host, 2:list<Instance> instances) throws (1:TashiException e)
	void vmUpdate(1:i32 instanceId, 2:Instance instance, 3:InstanceState old) throws (1:TashiException e)

	// Agent-facing RPCs
	void activateVm(1:i32 instanceId, 2:Host host) throws (1:TashiException e)
}

service nodemanagerservice {
	// ClusterManager-facing RPCs
	i32 instantiateVm(1:Instance instance) throws (1:TashiException e)
	
	void shutdownVm(1:i32 vmId) throws (1:TashiException e)
	void destroyVm(1:i32 vmId) throws (1:TashiException e)
	
	void suspendVm(1:i32 vmId, 2:string destination) throws (1:TashiException e)
	i32 resumeVm(1:Instance instance, 2:string source) throws (1:TashiException e)
	
	string prepReceiveVm(1:Instance instance, 2:Host source) throws (1:TashiException e)
	void migrateVm(1:i32 vmId, 2:Host target, 3:string transportCookie) throws (1:TashiException e)
	void receiveVm(1:Instance instance, 2:string transportCookie) throws (1:TashiException e)
	
	void pauseVm(1:i32 vmId) throws (1:TashiException e)
	void unpauseVm(1:i32 vmId) throws (1:TashiException e)

	Instance getVmInfo(1:i32 vmId) throws (1:TashiException e)
	list<i32> listVms() throws (1:TashiException e)
	
	string vmmSpecificCall(1:i32 vmId, 2:string arg) throws (1:TashiException e)
	
	// Host getHostInfo() throws (1:TashiException e)
}
