Commit 0eacc210 authored by Yingjie Xu's avatar Yingjie Xu

SlapOS Test Agent, modified to adapt with buildout and vifib.

parent a3984fd8
...@@ -42,6 +42,7 @@ setup(name=name, ...@@ -42,6 +42,7 @@ setup(name=name,
# accessing templates # accessing templates
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [
'agent = slapos.agent.agent:main',
'clouddestroy = slapos.cloudmgr.destroy:main', 'clouddestroy = slapos.cloudmgr.destroy:main',
'cloudgetprivatekey = slapos.cloudmgr.getprivatekey:main', 'cloudgetprivatekey = slapos.cloudmgr.getprivatekey:main',
'cloudgetpubliciplist = slapos.cloudmgr.getpubliciplist:main', 'cloudgetpubliciplist = slapos.cloudmgr.getpubliciplist:main',
......
import ConfigParser import ConfigParser
import argparse
import json import json
from random import random, choice from random import random, choice
import os import os
...@@ -12,11 +13,12 @@ from slapos.slap import slap, Supply ...@@ -12,11 +13,12 @@ from slapos.slap import slap, Supply
from slapos.grid.utils import setRunning, setFinished from slapos.grid.utils import setRunning, setFinished
def safeRpcCall(proxy, function_id, *args): def safeRpcCall(proxy, function_id, *args):
while True:
try: try:
function = getattr(proxy, function_id) function = getattr(proxy, function_id)
return function(*args) return function(*args)
except (socket.error, xmlrpclib.ProtocolError, xmlrpclib.Fault), e: except (socket.error, xmlrpclib.ProtocolError, xmlrpclib.Fault), e:
pass time.sleep(64)
def _encode_software_dict(software_dict): def _encode_software_dict(software_dict):
result = dict() result = dict()
...@@ -31,10 +33,9 @@ def _decode_software_dict(software_dict): ...@@ -31,10 +33,9 @@ def _decode_software_dict(software_dict):
return result return result
class Agent: class Agent:
def __init__(self): def __init__(self, configuration_file):
dirname = os.path.dirname(__file__)
configuration = ConfigParser.SafeConfigParser() configuration = ConfigParser.SafeConfigParser()
configuration.readfp(open(os.path.join(dirname, "agent.cfg"))) configuration.readfp(configuration_file)
self.portal_url = configuration.get("agent", "portal_url") self.portal_url = configuration.get("agent", "portal_url")
self.master_url = configuration.get("agent", "master_url") self.master_url = configuration.get("agent", "master_url")
self.key_file = configuration.get("agent", "key_file") self.key_file = configuration.get("agent", "key_file")
...@@ -48,9 +49,11 @@ class Agent: ...@@ -48,9 +49,11 @@ class Agent:
self.software_uri = dict() self.software_uri = dict()
for (software, uri) in configuration.items("software_uri"): for (software, uri) in configuration.items("software_uri"):
self.software_uri[software] = uri self.software_uri[software] = uri
self.log_directory = configuration.get("agent", "log_directory")
self.state_file = configuration.get("agent", "state_file")
filename = "agent-%s.log" % datetime.strftime(datetime.now(), "%Y-%m-%d") filename = os.path.join(self.log_directory, "agent-%s.log" % datetime.strftime(datetime.now(), "%Y-%m-%d"))
basicConfig(filename=os.path.join(dirname, filename), format="%(asctime)-15s %(message)s", level="INFO") basicConfig(filename=filename, format="%(asctime)-15s %(message)s", level="INFO")
self.logger = getLogger() self.logger = getLogger()
self.slap = slap() self.slap = slap()
...@@ -58,7 +61,7 @@ class Agent: ...@@ -58,7 +61,7 @@ class Agent:
self.supply = Supply() self.supply = Supply()
state = ConfigParser.SafeConfigParser() state = ConfigParser.SafeConfigParser()
state.readfp(open(os.path.join(dirname, "state.cfg"))) state.readfp(open(self.state_file))
self.installing_software_dict = dict() self.installing_software_dict = dict()
self.installed_software_dict = dict() self.installed_software_dict = dict()
for computer in self.computer_list: for computer in self.computer_list:
...@@ -114,14 +117,28 @@ class Agent: ...@@ -114,14 +117,28 @@ class Agent:
state.set(computer, "installed_software", \ state.set(computer, "installed_software", \
json.dumps(_encode_software_dict(self.installed_software_dict[computer]))) json.dumps(_encode_software_dict(self.installed_software_dict[computer])))
dirname = os.path.dirname(__file__) dirname = os.path.dirname(__file__)
state.write(open(os.path.join(dirname, "state.cfg"), "w")) state.write(open(self.state_file, "w"))
if __name__ == "__main__": def main(*args):
dirname = os.path.dirname(__file__) parser = argparse.ArgumentParser()
pidfile = os.path.join(dirname, "agent.pid") parser.add_argument("--pidfile", help="The location where pidfile will be created.")
parser.add_argument("configuration_file", nargs=1, type=argparse.FileType(),
help="Slap Test Agent configuration file.")
if args == ():
argument_option_instance = parser.parse_args()
else:
argument_option_instance = \
parser.parse_args(list(args))
option_dict = {}
configuration_file = argument_option_instance.configuration_file[0]
for argument_key, argument_value in vars(argument_option_instance
).iteritems():
option_dict.update({argument_key:argument_value})
pidfile = option_dict.get("pidfile", None)
if pidfile:
setRunning(pidfile) setRunning(pidfile)
agent = Agent() agent = Agent(configuration_file)
now = datetime.now() now = datetime.now()
for computer in agent.computer_list: for computer in agent.computer_list:
installing_software_list = agent.getInstallingSoftwareReleaseListOnComputer(computer) installing_software_list = agent.getInstallingSoftwareReleaseListOnComputer(computer)
...@@ -155,4 +172,8 @@ if __name__ == "__main__": ...@@ -155,4 +172,8 @@ if __name__ == "__main__":
del agent.installed_software_dict[computer][installed_software] del agent.installed_software_dict[computer][installed_software]
agent.writeState() agent.writeState()
if pidfile:
setFinished(pidfile) setFinished(pidfile)
if __name__ == "__main__":
main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment