Commit 4337b2fa authored by Gabriel Monnerat's avatar Gabriel Monnerat

merge 'master' into slave_instance

parents dc812047 1eddcede
...@@ -74,7 +74,13 @@ graph = {}\n ...@@ -74,7 +74,13 @@ graph = {}\n
# Get root software instance and create initial graph\n # Get root software instance and create initial graph\n
predecessor_software_instance = software_instance\n predecessor_software_instance = software_instance\n
while (predecessor_software_instance is not None):\n while (predecessor_software_instance is not None):\n
graph[predecessor_software_instance.getUid()] = predecessor_software_instance.getPredecessorUidList()\n predecessor_software_instance_pred_uid_list = predecessor_software_instance.getPredecessorUidList()\n
graph[predecessor_software_instance.getUid()] = predecessor_software_instance_pred_uid_list\n
# as this walking is not fetching all instances fill predecessors into graph, in order to have\n
# "nearly" complete representation\n
for uid in predecessor_software_instance_pred_uid_list:\n
if uid not in graph:\n
graph[uid] = []\n
root_software_instance = predecessor_software_instance\n root_software_instance = predecessor_software_instance\n
predecessor_software_instance = predecessor_software_instance.getPredecessorRelatedValue(\n predecessor_software_instance = predecessor_software_instance.getPredecessorRelatedValue(\n
portal_type="Software Instance")\n portal_type="Software Instance")\n
...@@ -160,9 +166,9 @@ if not request_software_instance.getUid() in graph:\n ...@@ -160,9 +166,9 @@ if not request_software_instance.getUid() in graph:\n
# update graph to reflect requested operation\n # update graph to reflect requested operation\n
graph[software_instance.getUid()] = software_instance.getPredecessorUidList() + [request_software_instance.getUid()]\n graph[software_instance.getUid()] = software_instance.getPredecessorUidList() + [request_software_instance.getUid()]\n
\n \n
# check if all elements are still connected\n # check if all elements are still connected and if there is no cycle\n
software_instance.checkNotCyclic(graph)\n
software_instance.checkConnected(graph, root_software_instance.getUid())\n software_instance.checkConnected(graph, root_software_instance.getUid())\n
software_instance.checkNotCyclic(graph)\n
\n \n
software_instance.edit(\n software_instance.edit(\n
predecessor_list=predecessor_list,\n predecessor_list=predecessor_list,\n
......
...@@ -3149,6 +3149,9 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -3149,6 +3149,9 @@ class TestVifibSlapWebService(testVifibMixin):
def stepCheckSoftwareInstanceAndRelatedComputerPartition(self, def stepCheckSoftwareInstanceAndRelatedComputerPartition(self,
sequence, **kw): sequence, **kw):
self.stepCheckSoftwareInstanceAndRelatedComputerPartitionNoPackingListCheck(sequence, **kw) self.stepCheckSoftwareInstanceAndRelatedComputerPartitionNoPackingListCheck(sequence, **kw)
software_instance_uid = sequence['software_instance_uid']
software_instance = self.portal.portal_catalog.getResultValue(
uid=software_instance_uid)
self._checkSoftwareInstanceAndRelatedPartition(software_instance) self._checkSoftwareInstanceAndRelatedPartition(software_instance)
def stepCheckSoftwareInstanceAndRelatedComputerPartitionNoPackingListCheck(self, def stepCheckSoftwareInstanceAndRelatedComputerPartitionNoPackingListCheck(self,
...@@ -9220,7 +9223,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -9220,7 +9223,6 @@ class TestVifibSlapWebService(testVifibMixin):
sequence, **kw): sequence, **kw):
software_instance = self.portal.portal_catalog.getResultValue( software_instance = self.portal.portal_catalog.getResultValue(
uid = sequence['software_instance_uid']) uid = sequence['software_instance_uid'])
requested_reference = sequence['requested_reference']
from erp5.document.SoftwareInstance import DisconnectedSoftwareTree from erp5.document.SoftwareInstance import DisconnectedSoftwareTree
self.assertRaises(DisconnectedSoftwareTree, self.assertRaises(DisconnectedSoftwareTree,
software_instance.requestSoftwareInstance, software_instance.requestSoftwareInstance,
...@@ -9370,7 +9372,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -9370,7 +9372,6 @@ class TestVifibSlapWebService(testVifibMixin):
sequence, **kw): sequence, **kw):
software_instance = self.portal.portal_catalog.getResultValue( software_instance = self.portal.portal_catalog.getResultValue(
uid = sequence['software_instance_uid']) uid = sequence['software_instance_uid'])
requested_reference = sequence['requested_reference']
from erp5.document.SoftwareInstance import CyclicSoftwareTree from erp5.document.SoftwareInstance import CyclicSoftwareTree
self.assertRaises(CyclicSoftwareTree, self.assertRaises(CyclicSoftwareTree,
software_instance.requestSoftwareInstance, software_instance.requestSoftwareInstance,
...@@ -9520,7 +9521,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -9520,7 +9521,6 @@ class TestVifibSlapWebService(testVifibMixin):
sequence, **kw): sequence, **kw):
software_instance = self.portal.portal_catalog.getResultValue( software_instance = self.portal.portal_catalog.getResultValue(
uid = sequence['software_instance_uid']) uid = sequence['software_instance_uid'])
requested_reference = sequence['requested_reference']
self.assertRaises(ValueError, self.assertRaises(ValueError,
software_instance.requestSoftwareInstance, software_instance.requestSoftwareInstance,
software_release=sequence['software_release_uri'], software_release=sequence['software_release_uri'],
...@@ -9764,7 +9764,7 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -9764,7 +9764,7 @@ class TestVifibSlapWebService(testVifibMixin):
from erp5.document.SoftwareInstance import CyclicSoftwareTree from erp5.document.SoftwareInstance import CyclicSoftwareTree
self.assertRaises(CyclicSoftwareTree, self.checkNotCyclic, graph) self.assertRaises(CyclicSoftwareTree, self.checkNotCyclic, graph)
def test_si_tree_simple_list_cyclic(self): def test_si_tree_simple_list_cyclic_non_root(self):
"""Graph of cyclic list is cyclic """Graph of cyclic list is cyclic
B->C->D->A-\ B->C->D->A-\
...@@ -9862,7 +9862,7 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -9862,7 +9862,7 @@ class TestVifibSlapWebService(testVifibMixin):
def stepRequestCredentialFromWebSite(self, sequence, **kw): def stepRequestCredentialFromWebSite(self, sequence, **kw):
sequence['web_user'] = '%s.%s' % (self.id(), random()) sequence['web_user'] = '%s.%s' % (self.id(), random())
result = self.portal.ERP5Site_newCredentialRequest(\ self.portal.ERP5Site_newCredentialRequest(\
first_name='Homer', first_name='Homer',
last_name='Simpson', last_name='Simpson',
reference=sequence['web_user'], reference=sequence['web_user'],
......
...@@ -35,6 +35,7 @@ if sys.version_info < (2, 6): ...@@ -35,6 +35,7 @@ if sys.version_info < (2, 6):
import socket import socket
import subprocess import subprocess
import traceback import traceback
import time
#from time import strftime #from time import strftime
from SlapObject import Software, Partition, WrongPermissionError, \ from SlapObject import Software, Partition, WrongPermissionError, \
...@@ -105,6 +106,9 @@ def parseArgumentTupleAndReturnSlapgridObject(*argument_tuple): ...@@ -105,6 +106,9 @@ def parseArgumentTupleAndReturnSlapgridObject(*argument_tuple):
help="Enables console output and live output from subcommands.") help="Enables console output and live output from subcommands.")
parser.add_argument("-v", "--verbose", action="store_true", default=False, parser.add_argument("-v", "--verbose", action="store_true", default=False,
help="Be verbose.") help="Be verbose.")
parser.add_argument("--promise-timeout",
type=int, default=3,
help="Promise timeout in seconds.")
parser.add_argument("configuration_file", nargs=1, type=argparse.FileType(), parser.add_argument("configuration_file", nargs=1, type=argparse.FileType(),
help="SlapOS configuration file.") help="SlapOS configuration file.")
...@@ -198,7 +202,8 @@ def parseArgumentTupleAndReturnSlapgridObject(*argument_tuple): ...@@ -198,7 +202,8 @@ def parseArgumentTupleAndReturnSlapgridObject(*argument_tuple):
master_ca_file=master_ca_file, master_ca_file=master_ca_file,
certificate_repository_path=certificate_repository_path, certificate_repository_path=certificate_repository_path,
console=option_dict['console'], console=option_dict['console'],
buildout=option_dict.get('buildout')), buildout=option_dict.get('buildout'),
promise_timeout=option_dict['promise_timeout']),
option_dict]) option_dict])
...@@ -267,7 +272,8 @@ class Slapgrid(object): ...@@ -267,7 +272,8 @@ class Slapgrid(object):
cert_file=None, cert_file=None,
master_ca_file=None, master_ca_file=None,
certificate_repository_path=None, certificate_repository_path=None,
console=False): console=False,
promise_timeout=3):
"""Makes easy initialisation of class parameters""" """Makes easy initialisation of class parameters"""
# Parses arguments # Parses arguments
self.software_root = os.path.abspath(software_root) self.software_root = os.path.abspath(software_root)
...@@ -294,6 +300,7 @@ class Slapgrid(object): ...@@ -294,6 +300,7 @@ class Slapgrid(object):
os.path.join(self.instance_etc_directory, 'supervisord.conf.d') os.path.join(self.instance_etc_directory, 'supervisord.conf.d')
self.console = console self.console = console
self.buildout = buildout self.buildout = buildout
self.promise_timeout = promise_timeout
def checkEnvironmentAndCreateStructure(self): def checkEnvironmentAndCreateStructure(self):
"""Checks for software_root and instance_root existence, then creates """Checks for software_root and instance_root existence, then creates
...@@ -452,6 +459,53 @@ class Slapgrid(object): ...@@ -452,6 +459,53 @@ class Slapgrid(object):
exception = traceback.format_exc() exception = traceback.format_exc()
logger.error(exception) logger.error(exception)
computer_partition.error(exception) computer_partition.error(exception)
# Promises
instance_path = os.path.join(self.instance_root,
computer_partition.getId())
uid, gid = None, None
stat_info = os.stat(instance_path)
#stat sys call to get statistics informations
uid = stat_info.st_uid
gid = stat_info.st_gid
# Get the list of promises
promise_dir = os.path.join(instance_path, 'etc', 'promise')
if os.path.exists(promise_dir) and os.path.isdir(promise_dir):
cwd = instance_path
promises_list = os.listdir(promise_dir)
# Check whether every promise is kept
for promise in promises_list:
command = os.path.join(promise_dir, promise)
kw = dict()
if not self.console:
kw.update(stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process_handler = SlapPopen(command,
preexec_fn=lambda: dropPrivileges(uid, gid),
cwd=cwd,
env=None, **kw)
time.sleep(self.promise_timeout)
promise = os.path.basename(command)
if process_handler.poll() is None:
process_handler.kill()
computer_partition.error("The promise %r timed out" % promise)
elif process_handler.poll() != 0:
stderr = process_handler.communicate()[1]
if stderr is None:
stderr = 'No error output from %r.' % promise
computer_partition.error(stderr)
logger.info("Finished computer partitions...") logger.info("Finished computer partitions...")
return clean_run return clean_run
......
...@@ -3,8 +3,6 @@ ...@@ -3,8 +3,6 @@
"""Mocked httplib """Mocked httplib
""" """
from urlparse import urlparse
__all__ = [] __all__ = []
def log(message): def log(message):
...@@ -21,13 +19,13 @@ class HTTPConnection(object): ...@@ -21,13 +19,13 @@ class HTTPConnection(object):
HTTPConnection._callback. This method received the instance, the path, HTTPConnection._callback. This method received the instance, the path,
method and request body as parameter, and it has to return a tuple with method and request body as parameter, and it has to return a tuple with
headers dictionary and body response string. headers dictionary and body response string.
@param self object instance reference @param self object instance reference
@param URL the parsed URL @param URL the parsed URL
@param method the http method @param method the http method
@param body the request body @param body the request body
@param headers the request headers @param headers the request headers
@return tuple containing status integer, headers dictionary and body @return tuple containing status integer, headers dictionary and body
response""" response"""
return (0, {}, '', ) return (0, {}, '', )
...@@ -83,7 +81,6 @@ class HTTPSConnection(HTTPConnection): ...@@ -83,7 +81,6 @@ class HTTPSConnection(HTTPConnection):
source_address=None): source_address=None):
super().__init__(self, host, port, strict, timeout, super().__init__(self, host, port, strict, timeout,
source_address) source_address)
pass
class HTTPResponse(object): class HTTPResponse(object):
......
This diff is collapsed.
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