First cut at providing functionality from the client to change host state
git-svn-id: https://svn.apache.org/repos/asf/incubator/tashi/trunk@1349511 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/tashi/client/tashi-client.py b/src/tashi/client/tashi-client.py
index b529f4c..49fef12 100755
--- a/src/tashi/client/tashi-client.py
+++ b/src/tashi/client/tashi-client.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python
+#!/usr/bin/python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@@ -50,6 +50,22 @@
return users[user].id
raise ValueError("Unknown user %s" % (userStr))
+def checkHid(host):
+ userId = getUser()
+ hosts = client.getHosts()
+ hostId = None
+ try:
+ hostId = int(host)
+ except:
+ for h in hosts
+ if (h.name == host):
+ hostId = h.id
+ if (hostId is None):
+ raise ValueError("Unknown host %s" % (str(instance)))
+
+ # XXXstroucki permissions for host related stuff?
+ return hostId
+
def checkIid(instance):
userId = getUser()
instances = client.getInstances()
@@ -258,6 +274,7 @@
'getImages': [],
'copyImage': [('src', str, lambda: requiredArg('src'),True), ('dst', str, lambda: requiredArg('dst'), True)],
'getHosts': [],
+'setHostState': [('host', checkHid, lambda: requiredArg('host'), True), ('state', str, lambda: requiredArg('state'), True)],
'getUsers': [],
'getNetworks': [],
'getInstances': [],
@@ -301,6 +318,7 @@
'unpauseVm': 'Unpauses a paused VM',
'getSlots': 'Get a count of how many VMs could be started in the cluster',
'getHosts': 'Gets a list of hosts running Node Managers',
+'setHostState': 'Set the state of a host, eg. Normal or Drained',
'getUsers': 'Gets a list of users',
'getNetworks': 'Gets a list of available networks for VMs to be placed on',
'getInstances': 'Gets a list of all VMs in the cluster',
@@ -327,6 +345,7 @@
'unpauseVm': ['--instance 12345', '--instance foobar'],
'getSlots': ['--cores 1 --memory 128'],
'getHosts': [''],
+'setHostState': ['--host fnord --state Drained'],
'getUsers': [''],
'getNetworks': [''],
'getInstances': [''],
diff --git a/src/tashi/clustermanager/clustermanagerservice.py b/src/tashi/clustermanager/clustermanagerservice.py
index 0494c69..cc719b5 100644
--- a/src/tashi/clustermanager/clustermanagerservice.py
+++ b/src/tashi/clustermanager/clustermanagerservice.py
@@ -21,7 +21,7 @@
from tashi.rpycservices import rpycservices
from tashi.rpycservices.rpyctypes import Errors, InstanceState, Instance, HostState, TashiException
-from tashi import boolean, ConnectionManager, vmStates, version, scrubString
+from tashi import boolean, ConnectionManager, vmStates, hostStates, version, scrubString
class ClusterManagerService(object):
"""RPC service for the ClusterManager"""
@@ -565,6 +565,30 @@
return self.data.getHosts().values()
# extern
+ def setHostState(self, hostId, state):
+ state = state.lower()
+ hostState = None
+ if state == "normal":
+ hostState = HostState.Normal
+ if state == "drained":
+ hostState = HostState.Drained
+
+ if hostState is None:
+ return "%s is not a valid host state" % state
+ else:
+ hostList = [h for h in self.data.getHosts().itervalues() if h.id == hostId]
+ if (len(hostList) != 1):
+ raise TashiException(d={'errno':Errors.NoSuchHost, 'msg':'A host with name %s is not identifiable' % (host.name)})
+ host.id = hostList[0].id
+ host = self.data.acquireHost(host.id)
+ try:
+ host.state = hostState
+ finally:
+ self.data.releaseHost(host)
+
+ return "Host state set to %s." % hostStates[hostState]
+
+ # extern
def getNetworks(self):
networks = self.data.getNetworks()
for network in networks:
@@ -573,7 +597,6 @@
return networks.values()
-
# extern
def getUsers(self):
return self.data.getUsers().values()
diff --git a/src/tashi/rpycservices/rpycservices.py b/src/tashi/rpycservices/rpycservices.py
index 4aadcfb..65460e3 100644
--- a/src/tashi/rpycservices/rpycservices.py
+++ b/src/tashi/rpycservices/rpycservices.py
@@ -19,7 +19,7 @@
from tashi.rpycservices.rpyctypes import Instance, Host, User
import cPickle
-clusterManagerRPCs = ['createVm', 'shutdownVm', 'destroyVm', 'suspendVm', 'resumeVm', 'migrateVm', 'pauseVm', 'unpauseVm', 'getHosts', 'getNetworks', 'getUsers', 'getInstances', 'vmmSpecificCall', 'registerNodeManager', 'vmUpdate', 'activateVm', 'registerHost', 'getImages', 'copyImage']
+clusterManagerRPCs = ['createVm', 'shutdownVm', 'destroyVm', 'suspendVm', 'resumeVm', 'migrateVm', 'pauseVm', 'unpauseVm', 'getHosts', 'getNetworks', 'getUsers', 'getInstances', 'vmmSpecificCall', 'registerNodeManager', 'vmUpdate', 'activateVm', 'registerHost', 'getImages', 'copyImage', 'setHostState']
nodeManagerRPCs = ['instantiateVm', 'shutdownVm', 'destroyVm', 'suspendVm', 'resumeVm', 'prepReceiveVm', 'prepSourceVm', 'migrateVm', 'receiveVm', 'pauseVm', 'unpauseVm', 'getVmInfo', 'listVms', 'vmmSpecificCall', 'getHostInfo', 'liveCheck']
accountingRPCs = ['record']