Commit 7c5dee77 authored by Romain Courteaud's avatar Romain Courteaud

slapos_cloud:

* project needed in test
* no requestTransfer anymore
* project needed
* no source_administration
* person need right assignment
* open/personal does not exist anymore
* drop organisation_slap_interface_workflow
  Security is only based on project now.
  Organisation will only be used by accountants
* only project admin can create Computer Network
* drop the idea of project owner
  Project will be products sold on the store
* project needed in test
* assignment needed to touch compute node
* project needed in compute node / instance
* project needed in test
  Allocation Supply is now needed...
* person can not request project anymore
parent 0050d7ca
...@@ -35,10 +35,6 @@ ...@@ -35,10 +35,6 @@
<type>Instance Tree</type> <type>Instance Tree</type>
<workflow>edit_workflow, instance_slap_interface_workflow, instance_tree_workflow</workflow> <workflow>edit_workflow, instance_slap_interface_workflow, instance_tree_workflow</workflow>
</chain> </chain>
<chain>
<type>Organisation</type>
<workflow>organisation_slap_interface_workflow</workflow>
</chain>
<chain> <chain>
<type>Person</type> <type>Person</type>
<workflow>person_slap_interface_workflow</workflow> <workflow>person_slap_interface_workflow</workflow>
......
...@@ -269,7 +269,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin): ...@@ -269,7 +269,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
instance_xml=self.generateSafeXml(), instance_xml=self.generateSafeXml(),
sla_xml=self.generateEmptyXml(), sla_xml=self.generateEmptyXml(),
shared=False, shared=False,
state="started" state="started",
project_reference=project.getReference()
) )
self.person_user = self.makePerson(project, new_id=new_id, index=False) self.person_user = self.makePerson(project, new_id=new_id, index=False)
...@@ -289,7 +290,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin): ...@@ -289,7 +290,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
root_slave=self.request_kw['shared'], root_slave=self.request_kw['shared'],
successor=self.software_instance.getRelativeUrl(), successor=self.software_instance.getRelativeUrl(),
destination_section=self.person_user.getRelativeUrl() destination_section_value=self.person_user,
follow_up_value=project
) )
self.instance_tree.validate() self.instance_tree.validate()
self.portal.portal_workflow._jumpToStateFor(self.instance_tree, 'start_requested') self.portal.portal_workflow._jumpToStateFor(self.instance_tree, 'start_requested')
...@@ -304,7 +306,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin): ...@@ -304,7 +306,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
text_content=self.request_kw['instance_xml'], text_content=self.request_kw['instance_xml'],
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
specialise=self.instance_tree.getRelativeUrl(), specialise=self.instance_tree.getRelativeUrl(),
successor=self.requested_software_instance.getRelativeUrl() successor=self.requested_software_instance.getRelativeUrl(),
follow_up_value=project
) )
self.portal.portal_workflow._jumpToStateFor(self.software_instance, 'start_requested') self.portal.portal_workflow._jumpToStateFor(self.software_instance, 'start_requested')
self.software_instance.validate() self.software_instance.validate()
...@@ -318,6 +321,7 @@ class SlapOSTestCaseMixin(testSlapOSMixin): ...@@ -318,6 +321,7 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
text_content=self.request_kw['instance_xml'], text_content=self.request_kw['instance_xml'],
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
specialise=self.instance_tree.getRelativeUrl(), specialise=self.instance_tree.getRelativeUrl(),
follow_up_value=project
) )
self.portal.portal_workflow._jumpToStateFor(self.requested_software_instance, 'start_requested') self.portal.portal_workflow._jumpToStateFor(self.requested_software_instance, 'start_requested')
self.requested_software_instance.validate() self.requested_software_instance.validate()
......
...@@ -47,8 +47,9 @@ class TestSlapOSCloudSlapOSCacheMixin( ...@@ -47,8 +47,9 @@ class TestSlapOSCloudSlapOSCacheMixin(
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self.pinDateTime(DateTime()) self.pinDateTime(DateTime())
self._makeComputeNode() project = self.addProject()
self._makeComplexComputeNode(with_slave=True) self._makeComputeNode(project)
self._makeComplexComputeNode(project, with_slave=True)
self.tic() self.tic()
def beforeTearDown(self): def beforeTearDown(self):
...@@ -368,7 +369,8 @@ class TestSlapOSCloudSoftwareInstance( ...@@ -368,7 +369,8 @@ class TestSlapOSCloudSoftwareInstance(
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self._makeTree() self.project = self.addProject()
self._makeTree(self.project)
def test_getXmlAsDict(self): def test_getXmlAsDict(self):
simple_parameter_sample_xml = """<?xml version='1.0' encoding='utf-8'?> simple_parameter_sample_xml = """<?xml version='1.0' encoding='utf-8'?>
...@@ -431,8 +433,8 @@ class TestSlapOSCloudSoftwareInstance( ...@@ -431,8 +433,8 @@ class TestSlapOSCloudSoftwareInstance(
self.software_instance._asParameterDict) self.software_instance._asParameterDict)
def test_asParameterDict(self): def test_asParameterDict(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self._makeComplexComputeNode(with_slave=True) self._makeComplexComputeNode(self.project, with_slave=True)
as_parameter_dict = self.start_requested_software_instance._asParameterDict() as_parameter_dict = self.start_requested_software_instance._asParameterDict()
...@@ -477,8 +479,8 @@ class TestSlapOSCloudSoftwareInstance( ...@@ -477,8 +479,8 @@ class TestSlapOSCloudSoftwareInstance(
self.assertEqual(as_parameter_dict["full_ip_list"], []) self.assertEqual(as_parameter_dict["full_ip_list"], [])
def test_getInstanceTreeIpList(self): def test_getInstanceTreeIpList(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self._makeComplexComputeNode(with_slave=True) self._makeComplexComputeNode(self.project, with_slave=True)
self.tic() self.tic()
self.assertEqual([(u'', u'ip_address_1')], self.assertEqual([(u'', u'ip_address_1')],
...@@ -489,18 +491,16 @@ class TestSlapOSCloudSlapOSComputeNodeMixin_getCacheComputeNodeInformation( ...@@ -489,18 +491,16 @@ class TestSlapOSCloudSlapOSComputeNodeMixin_getCacheComputeNodeInformation(
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
# Prepare compute_node # Prepare compute_node
self.compute_node = self.portal.compute_node_module.template_compute_node\ self.compute_node = self.portal.compute_node_module.template_compute_node\
.Base_createCloneDocument(batch_mode=1) .Base_createCloneDocument(batch_mode=1)
self.compute_node.edit( self.compute_node.edit(
title="Compute Node %s" % self.new_id, title="Compute Node %s" % self.new_id,
reference="TESTCOMP-%s" % self.new_id reference="TESTCOMP-%s" % self.new_id,
follow_up_value=self.project
) )
if getattr(self, "person", None) is not None:
self.compute_node.edit(
source_administration_value=getattr(self, "person", None),
)
self.compute_node.validate() self.compute_node.validate()
self._addCertificateLogin(self.compute_node) self._addCertificateLogin(self.compute_node)
...@@ -521,7 +521,7 @@ class TestSlapOSCloudSlapOSComputeNodeMixin_getCacheComputeNodeInformation( ...@@ -521,7 +521,7 @@ class TestSlapOSCloudSlapOSComputeNodeMixin_getCacheComputeNodeInformation(
# TestSlapOSSlapToolgetFullComputerInformation.test_activate_getFullComputerInformation_first_access # TestSlapOSSlapToolgetFullComputerInformation.test_activate_getFullComputerInformation_first_access
# #
self._makeComplexComputeNode(with_slave=True) self._makeComplexComputeNode(self.project, with_slave=True)
self.portal.REQUEST['disable_isTestRun'] = True self.portal.REQUEST['disable_isTestRun'] = True
self.login(self.compute_node_user_id) self.login(self.compute_node_user_id)
......
...@@ -10,7 +10,8 @@ class TestSlapOSCoreSlapOSAssertInstanceTreeSuccessorAlarm( ...@@ -10,7 +10,8 @@ class TestSlapOSCoreSlapOSAssertInstanceTreeSuccessorAlarm(
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self._makeTree() self.project = self.addProject()
self._makeTree(self.project)
def test_InstanceTree_assertSuccessor(self): def test_InstanceTree_assertSuccessor(self):
self.software_instance.rename(new_name=self.generateNewSoftwareTitle()) self.software_instance.rename(new_name=self.generateNewSoftwareTitle())
...@@ -85,10 +86,11 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -85,10 +86,11 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self._makeTree() self.project = self.addProject()
self._makeTree(self.project)
def test_SoftwareInstance_tryToUnallocatePartition(self): def test_SoftwareInstance_tryToUnallocatePartition(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
self.portal.portal_workflow._jumpToStateFor(self.software_instance, self.portal.portal_workflow._jumpToStateFor(self.software_instance,
...@@ -101,7 +103,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -101,7 +103,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
self.assertEqual('free', self.partition.getSlapState()) self.assertEqual('free', self.partition.getSlapState())
def test_SoftwareInstance_tryToUnallocatePartition_concurrency(self): def test_SoftwareInstance_tryToUnallocatePartition_concurrency(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
self.portal.portal_workflow._jumpToStateFor(self.software_instance, self.portal.portal_workflow._jumpToStateFor(self.software_instance,
...@@ -121,7 +123,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -121,7 +123,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
software_instance = self.portal.software_instance_module\ software_instance = self.portal.software_instance_module\
.template_software_instance.Base_createCloneDocument(batch_mode=1) .template_software_instance.Base_createCloneDocument(batch_mode=1)
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
software_instance.setAggregate(self.partition.getRelativeUrl()) software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
...@@ -136,7 +138,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -136,7 +138,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
self.assertEqual(self.partition.getRelativeUrl(), software_instance.getAggregate()) self.assertEqual(self.partition.getRelativeUrl(), software_instance.getAggregate())
def test_alarm_allocated(self): def test_alarm_allocated(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
self.portal.portal_workflow._jumpToStateFor(self.software_instance, self.portal.portal_workflow._jumpToStateFor(self.software_instance,
...@@ -150,7 +152,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -150,7 +152,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
) )
def test_alarm_unallocated(self): def test_alarm_unallocated(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.partition.markBusy() self.partition.markBusy()
self.portal.portal_workflow._jumpToStateFor(self.software_instance, self.portal.portal_workflow._jumpToStateFor(self.software_instance,
'destroy_requested') 'destroy_requested')
...@@ -163,7 +165,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -163,7 +165,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
) )
def test_alarm_validated(self): def test_alarm_validated(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
self.portal.portal_workflow._jumpToStateFor(self.software_instance, self.portal.portal_workflow._jumpToStateFor(self.software_instance,
...@@ -176,7 +178,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -176,7 +178,7 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
) )
def test_alarm_start_requested(self): def test_alarm_start_requested(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
...@@ -189,10 +191,12 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin): ...@@ -189,10 +191,12 @@ class TestSlapOSFreeComputePartitionAlarm(SlapOSTestCaseMixin):
class TestSlapOSFreeComputePartitionAlarmWithSlave(SlapOSTestCaseMixin): class TestSlapOSFreeComputePartitionAlarmWithSlave(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self._makeTree(requested_template_id='template_slave_instance') self.project = self.addProject()
self._makeTree(self.project,
requested_template_id='template_slave_instance')
def test_SoftwareInstance_tryToUnallocatePartition(self): def test_SoftwareInstance_tryToUnallocatePartition(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
self.portal.portal_workflow._jumpToStateFor(self.software_instance, self.portal.portal_workflow._jumpToStateFor(self.software_instance,
...@@ -205,7 +209,7 @@ class TestSlapOSFreeComputePartitionAlarmWithSlave(SlapOSTestCaseMixin): ...@@ -205,7 +209,7 @@ class TestSlapOSFreeComputePartitionAlarmWithSlave(SlapOSTestCaseMixin):
self.assertEqual('free', self.partition.getSlapState()) self.assertEqual('free', self.partition.getSlapState())
def test_SoftwareInstance_tryToUnallocatePartition_nonDestroyed(self): def test_SoftwareInstance_tryToUnallocatePartition_nonDestroyed(self):
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.partition.markBusy() self.partition.markBusy()
self.tic() self.tic()
...@@ -221,7 +225,8 @@ class TestSlapOSGarbageCollectDestroyedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -221,7 +225,8 @@ class TestSlapOSGarbageCollectDestroyedRootTreeAlarm(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self._makeTree() self.project = self.addProject()
self._makeTree(self.project)
def test_SoftwareInstance_tryToGarbageCollect(self): def test_SoftwareInstance_tryToGarbageCollect(self):
self.instance_tree.archive() self.instance_tree.archive()
...@@ -354,15 +359,17 @@ class TestSlapOSGarbageCollectDestroyedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -354,15 +359,17 @@ class TestSlapOSGarbageCollectDestroyedRootTreeAlarm(SlapOSTestCaseMixin):
class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin): class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin):
allocation_scope_to_test = 'open/public' allocation_scope_to_test = 'open'
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
self.compute_node = self.portal.compute_node_module.template_compute_node\ self.compute_node = self.portal.compute_node_module.template_compute_node\
.Base_createCloneDocument(batch_mode=1) .Base_createCloneDocument(batch_mode=1)
self.compute_node.edit( self.compute_node.edit(
allocation_scope=self.allocation_scope_to_test, allocation_scope=self.allocation_scope_to_test,
reference='TESTC-%s' % self.generateNewId(), reference='TESTC-%s' % self.generateNewId(),
follow_up_value=self.project
) )
self.compute_node.edit(capacity_scope='open') self.compute_node.edit(capacity_scope='open')
self.compute_node.validate() self.compute_node.validate()
...@@ -403,7 +410,7 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin): ...@@ -403,7 +410,7 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin):
self.compute_node.getCapacityQuantity()) self.compute_node.getCapacityQuantity())
def test_ComputeNode_checkAndUpdateCapacityScope_model_no_capacity(self): def test_ComputeNode_checkAndUpdateCapacityScope_model_no_capacity(self):
self._makeTree() self._makeTree(self.project)
computer_model = self._newComputerModel(1) computer_model = self._newComputerModel(1)
self.compute_node.edit(specialise_value=computer_model, self.compute_node.edit(specialise_value=computer_model,
...@@ -420,7 +427,7 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin): ...@@ -420,7 +427,7 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin):
def test_ComputeNode_checkAndUpdateCapacityScope_model_has_capacity(self): def test_ComputeNode_checkAndUpdateCapacityScope_model_has_capacity(self):
# If capacity is set on compute_node, model value is ignored. # If capacity is set on compute_node, model value is ignored.
self._makeTree() self._makeTree(self.project)
computer_model = self._newComputerModel(1) computer_model = self._newComputerModel(1)
self.compute_node.edit(specialise_value=computer_model, self.compute_node.edit(specialise_value=computer_model,
...@@ -446,7 +453,7 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin): ...@@ -446,7 +453,7 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin):
self.compute_node.workflow_history['edit_workflow'][-1]['comment']) self.compute_node.workflow_history['edit_workflow'][-1]['comment'])
def test_ComputeNode_checkAndUpdateCapacityScope_no_capacity_quantity(self): def test_ComputeNode_checkAndUpdateCapacityScope_no_capacity_quantity(self):
self._makeTree() self._makeTree(self.project)
self.compute_node.edit(capacity_quantity=1) self.compute_node.edit(capacity_quantity=1)
self._addPartitionToComputeNode() self._addPartitionToComputeNode()
self.compute_node.ComputeNode_checkAndUpdateCapacityScope() self.compute_node.ComputeNode_checkAndUpdateCapacityScope()
...@@ -473,14 +480,6 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin): ...@@ -473,14 +480,6 @@ class TestSlapOSComputeNode_checkAndUpdateCapacityScope(SlapOSTestCaseMixin):
self.assertEqual("Compute Node reported an error", self.assertEqual("Compute Node reported an error",
self.compute_node.workflow_history['edit_workflow'][-1]['comment']) self.compute_node.workflow_history['edit_workflow'][-1]['comment'])
class TestSlapOSComputeNode_checkAndUpdateCapacityScopeSubscription(TestSlapOSComputeNode_checkAndUpdateCapacityScope):
allocation_scope_to_test = 'open/subscription'
class TestSlapOSComputeNode_checkAndUpdateCapacityScopePersonal(TestSlapOSComputeNode_checkAndUpdateCapacityScope):
allocation_scope_to_test = 'open/personal'
class TestSlapOSUpdateComputeNodeCapacityScopeAlarm(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self.compute_node = self.portal.compute_node_module.template_compute_node\ self.compute_node = self.portal.compute_node_module.template_compute_node\
...@@ -501,12 +500,8 @@ class TestSlapOSUpdateComputeNodeCapacityScopeAlarm(SlapOSTestCaseMixin): ...@@ -501,12 +500,8 @@ class TestSlapOSUpdateComputeNodeCapacityScopeAlarm(SlapOSTestCaseMixin):
'ComputeNode_checkAndUpdateCapacityScope' 'ComputeNode_checkAndUpdateCapacityScope'
) )
def test_alarm_subscription(self): def test_alarm_open(self):
self.compute_node.edit(allocation_scope='open/subscription') self.compute_node.edit(allocation_scope='open')
self.test_alarm()
def test_alarm_personal(self):
self.compute_node.edit(allocation_scope='open/personal')
self.test_alarm() self.test_alarm()
def test_alarm_non_public(self): def test_alarm_non_public(self):
...@@ -527,10 +522,15 @@ class TestSlapOSUpdateComputeNodeCapacityScopeAlarm(SlapOSTestCaseMixin): ...@@ -527,10 +522,15 @@ class TestSlapOSUpdateComputeNodeCapacityScopeAlarm(SlapOSTestCaseMixin):
class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
def createInstance(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
def createInstance(self, project):
instance_tree = self.portal.instance_tree_module\ instance_tree = self.portal.instance_tree_module\
.template_instance_tree.Base_createCloneDocument(batch_mode=1) .template_instance_tree.Base_createCloneDocument(batch_mode=1)
instance_tree.edit( instance_tree.edit(
follow_up_value=project
) )
instance_tree.validate() instance_tree.validate()
instance_tree.edit( instance_tree.edit(
...@@ -545,7 +545,8 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -545,7 +545,8 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
sla_xml=self.generateSafeXml(), sla_xml=self.generateSafeXml(),
shared=False, shared=False,
software_title=instance_tree.getTitle(), software_title=instance_tree.getTitle(),
state='started' state='started',
project_reference=project.getReference()
) )
instance_tree.requestStart(**request_kw) instance_tree.requestStart(**request_kw)
instance_tree.requestInstance(**request_kw) instance_tree.requestInstance(**request_kw)
...@@ -561,7 +562,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -561,7 +562,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
REQUEST={}) REQUEST={})
def test_SoftwareInstance_tryToStopCollect_started_instance(self): def test_SoftwareInstance_tryToStopCollect_started_instance(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
self.portal.portal_workflow._jumpToStateFor(instance_tree, self.portal.portal_workflow._jumpToStateFor(instance_tree,
...@@ -572,7 +573,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -572,7 +573,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('stop_requested', instance.getSlapState()) self.assertEqual('stop_requested', instance.getSlapState())
def test_SoftwareInstance_tryToStopCollect_destroyed_instance(self): def test_SoftwareInstance_tryToStopCollect_destroyed_instance(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
self.portal.portal_workflow._jumpToStateFor(instance_tree, self.portal.portal_workflow._jumpToStateFor(instance_tree,
...@@ -584,7 +585,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -584,7 +585,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('destroy_requested', instance.getSlapState()) self.assertEqual('destroy_requested', instance.getSlapState())
def test_SoftwareInstance_tryToStopCollect_started_subscription(self): def test_SoftwareInstance_tryToStopCollect_started_subscription(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
...@@ -602,7 +603,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -602,7 +603,7 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
) )
def test_alarm_invalidated(self): def test_alarm_invalidated(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance.invalidate() instance.invalidate()
self._test_alarm_not_visited( self._test_alarm_not_visited(
self.portal.portal_alarms.slapos_stop_collect_instance, self.portal.portal_alarms.slapos_stop_collect_instance,
...@@ -612,9 +613,16 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -612,9 +613,16 @@ class TestSlapOSGarbageCollectStoppedRootTreeAlarm(SlapOSTestCaseMixin):
class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
def createInstance(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
def createInstance(self, project):
instance_tree = self.portal.instance_tree_module\ instance_tree = self.portal.instance_tree_module\
.template_instance_tree.Base_createCloneDocument(batch_mode=1) .template_instance_tree.Base_createCloneDocument(batch_mode=1)
instance_tree.edit(
follow_up_value=project
)
instance_tree.validate() instance_tree.validate()
instance_tree.edit( instance_tree.edit(
title=self.generateNewSoftwareTitle(), title=self.generateNewSoftwareTitle(),
...@@ -628,7 +636,8 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -628,7 +636,8 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
sla_xml=self.generateSafeXml(), sla_xml=self.generateSafeXml(),
shared=False, shared=False,
software_title=instance_tree.getTitle(), software_title=instance_tree.getTitle(),
state='started' state='started',
project_reference=project
) )
instance_tree.requestStart(**request_kw) instance_tree.requestStart(**request_kw)
instance_tree.requestInstance(**request_kw) instance_tree.requestInstance(**request_kw)
...@@ -654,7 +663,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -654,7 +663,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
REQUEST={}) REQUEST={})
def test_tryToGarbageCollect_invalidated_instance(self): def test_tryToGarbageCollect_invalidated_instance(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance.invalidate() instance.invalidate()
self.tic() self.tic()
...@@ -664,7 +673,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -664,7 +673,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_destroyed_instance(self): def test_tryToGarbageCollect_destroyed_instance(self):
instance = self.createInstance() instance = self.createInstance(self.project)
self.portal.portal_workflow._jumpToStateFor(instance, 'destroy_requested') self.portal.portal_workflow._jumpToStateFor(instance, 'destroy_requested')
self.tic() self.tic()
...@@ -674,7 +683,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -674,7 +683,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_allocated_instance(self): def test_tryToGarbageCollect_allocated_instance(self):
instance = self.createInstance() instance = self.createInstance(self.project)
partition = self.createComputePartition() partition = self.createComputePartition()
instance.edit(aggregate_value=partition) instance.edit(aggregate_value=partition)
self.tic() self.tic()
...@@ -685,7 +694,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -685,7 +694,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_no_allocation_try_found(self): def test_tryToGarbageCollect_no_allocation_try_found(self):
instance = self.createInstance() instance = self.createInstance(self.project)
self.tic() self.tic()
instance.SoftwareInstance_tryToGarbageCollectNonAllocatedRootTree() instance.SoftwareInstance_tryToGarbageCollectNonAllocatedRootTree()
...@@ -694,7 +703,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -694,7 +703,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_recent_allocation_try_found(self): def test_tryToGarbageCollect_recent_allocation_try_found(self):
instance = self.createInstance() instance = self.createInstance(self.project)
self.tic() self.tic()
instance.workflow_history['edit_workflow'].append({ instance.workflow_history['edit_workflow'].append({
'comment':'Allocation failed: no free Compute Partition', 'comment':'Allocation failed: no free Compute Partition',
...@@ -712,7 +721,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -712,7 +721,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
def test_tryToGarbageCollect_recent_allocation_try_found_allocation_disallowed(self): def test_tryToGarbageCollect_recent_allocation_try_found_allocation_disallowed(self):
instance = self.createInstance() instance = self.createInstance(self.project)
self.tic() self.tic()
instance.workflow_history['edit_workflow'].append({ instance.workflow_history['edit_workflow'].append({
'comment':'Allocation failed: Allocation disallowed', 'comment':'Allocation failed: Allocation disallowed',
...@@ -729,7 +738,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -729,7 +738,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_complex_tree(self): def test_tryToGarbageCollect_complex_tree(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
request_kw = dict( request_kw = dict(
software_release=\ software_release=\
...@@ -757,7 +766,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -757,7 +766,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_complex_tree_allocation_disallowed(self): def test_tryToGarbageCollect_complex_tree_allocation_disallowed(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
request_kw = dict( request_kw = dict(
software_release=\ software_release=\
...@@ -785,7 +794,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -785,7 +794,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
self.assertEqual('start_requested', instance_tree.getSlapState()) self.assertEqual('start_requested', instance_tree.getSlapState())
def test_tryToGarbageCollect_old_allocation_try_found(self): def test_tryToGarbageCollect_old_allocation_try_found(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
self.tic() self.tic()
instance.workflow_history['edit_workflow'].append({ instance.workflow_history['edit_workflow'].append({
...@@ -803,7 +812,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -803,7 +812,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
def test_tryToGarbageCollect_old_allocation_try_found_allocation_disallowed(self): def test_tryToGarbageCollect_old_allocation_try_found_allocation_disallowed(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance_tree = instance.getSpecialiseValue() instance_tree = instance.getSpecialiseValue()
self.tic() self.tic()
instance.workflow_history['edit_workflow'].append({ instance.workflow_history['edit_workflow'].append({
...@@ -828,7 +837,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -828,7 +837,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
) )
def test_alarm_invalidated(self): def test_alarm_invalidated(self):
instance = self.createInstance() instance = self.createInstance(self.project)
instance.invalidate() instance.invalidate()
self._test_alarm_not_visited( self._test_alarm_not_visited(
self.portal.portal_alarms.slapos_garbage_collect_non_allocated_root_tree, self.portal.portal_alarms.slapos_garbage_collect_non_allocated_root_tree,
...@@ -837,7 +846,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -837,7 +846,7 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
) )
def test_alarm_allocated(self): def test_alarm_allocated(self):
instance = self.createInstance() instance = self.createInstance(self.project)
partition = self.createComputePartition() partition = self.createComputePartition()
instance.edit(aggregate_value=partition) instance.edit(aggregate_value=partition)
self._test_alarm_not_visited( self._test_alarm_not_visited(
...@@ -849,6 +858,10 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin): ...@@ -849,6 +858,10 @@ class TestSlapOSGarbageCollectNonAllocatedRootTreeAlarm(SlapOSTestCaseMixin):
class TestSlapOSInvalidateDestroyedInstance(SlapOSTestCaseMixin): class TestSlapOSInvalidateDestroyedInstance(SlapOSTestCaseMixin):
def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
def createSoftwareInstance(self): def createSoftwareInstance(self):
new_id = self.generateNewId() new_id = self.generateNewId()
return self.portal.software_instance_module.newContent( return self.portal.software_instance_module.newContent(
......
...@@ -7,8 +7,13 @@ from unittest import skip ...@@ -7,8 +7,13 @@ from unittest import skip
class TestSlapOSAllocation(SlapOSTestCaseMixin): class TestSlapOSAllocation(SlapOSTestCaseMixin):
def _makeSlaveTree(self, requested_template_id='template_slave_instance'): def afterSetUp(self):
SlapOSTestCaseMixin._makeTree(self, requested_template_id=requested_template_id) SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
def _makeSlaveTree(self, project, requested_template_id='template_slave_instance'):
SlapOSTestCaseMixin._makeTree(self, project,
requested_template_id=requested_template_id)
def _simulatePerson_isAllowedToAllocate(self): def _simulatePerson_isAllowedToAllocate(self):
script_name = 'Person_isAllowedToAllocate' script_name = 'Person_isAllowedToAllocate'
...@@ -41,7 +46,7 @@ return True""" ) ...@@ -41,7 +46,7 @@ return True""" )
transaction.commit() transaction.commit()
def test_person_allocation_checked(self): def test_person_allocation_checked(self):
self._makeTree() self._makeTree(self.project)
self._simulatePerson_isAllowedToAllocate() self._simulatePerson_isAllowedToAllocate()
try: try:
self.software_instance.SoftwareInstance_tryToAllocatePartition() self.software_instance.SoftwareInstance_tryToAllocatePartition()
...@@ -52,9 +57,9 @@ return True""" ) ...@@ -52,9 +57,9 @@ return True""" )
self.person_user.workflow_history['edit_workflow'][-1]['comment']) self.person_user.workflow_history['edit_workflow'][-1]['comment'])
def test_no_allocation_if_person_is_not_allowed(self): def test_no_allocation_if_person_is_not_allowed(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
self.software_instance.getUrlString()) self.software_instance.getUrlString())
...@@ -73,7 +78,7 @@ return True""" ) ...@@ -73,7 +78,7 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_no_free_partition(self): def test_allocation_no_free_partition(self):
self._makeTree() self._makeTree(self.project)
self.assertEqual(None, self.software_instance.getAggregateValue( self.assertEqual(None, self.software_instance.getAggregateValue(
portal_type='Compute Partition')) portal_type='Compute Partition'))
...@@ -83,7 +88,7 @@ return True""" ) ...@@ -83,7 +88,7 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_no_host_instance(self): def test_allocation_no_host_instance(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self.assertEqual(None, self.software_instance.getAggregateValue( self.assertEqual(None, self.software_instance.getAggregateValue(
portal_type='Compute Partition')) portal_type='Compute Partition'))
...@@ -103,9 +108,9 @@ return True""" ) ...@@ -103,9 +108,9 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_free_partition(self): def test_allocation_free_partition(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
self.software_instance.getUrlString()) self.software_instance.getUrlString())
...@@ -124,9 +129,9 @@ return True""" ) ...@@ -124,9 +129,9 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_host_instance(self): def test_allocation_host_instance(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._allocateHost(self.requested_software_instance, self._allocateHost(self.requested_software_instance,
self.partition) self.partition)
...@@ -138,9 +143,9 @@ return True""" ) ...@@ -138,9 +143,9 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_capacity_scope_close(self): def test_allocation_capacity_scope_close(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
self.software_instance.getUrlString()) self.software_instance.getUrlString())
self.compute_node.edit(capacity_scope='close') self.compute_node.edit(capacity_scope='close')
...@@ -154,9 +159,9 @@ return True""" ) ...@@ -154,9 +159,9 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_host_capacity_scope_close(self): def test_allocation_host_capacity_scope_close(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._allocateHost(self.requested_software_instance, self._allocateHost(self.requested_software_instance,
self.partition) self.partition)
self.compute_node.edit(capacity_scope='close') self.compute_node.edit(capacity_scope='close')
...@@ -170,9 +175,9 @@ return True""" ) ...@@ -170,9 +175,9 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_allocation_scope_close(self): def test_allocation_allocation_scope_close(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
self.software_instance.getUrlString()) self.software_instance.getUrlString())
self.compute_node.edit(allocation_scope='close') self.compute_node.edit(allocation_scope='close')
...@@ -186,9 +191,9 @@ return True""" ) ...@@ -186,9 +191,9 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_host_allocation_scope_close(self): def test_allocation_host_allocation_scope_close(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._allocateHost(self.requested_software_instance, self._allocateHost(self.requested_software_instance,
self.partition) self.partition)
self.compute_node.edit(allocation_scope='close') self.compute_node.edit(allocation_scope='close')
...@@ -200,51 +205,9 @@ return True""" ) ...@@ -200,51 +205,9 @@ return True""" )
self.assertEqual(None, self.assertEqual(None,
self.software_instance.getAggregate(portal_type='Compute Partition')) self.software_instance.getAggregate(portal_type='Compute Partition'))
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_allocation_scope_open_personal(self):
self._makeTree()
self._makeComputeNode()
self._installSoftware(self.compute_node,
self.software_instance.getUrlString())
self.compute_node.edit(allocation_scope='open/personal',
source_administration=self.person_user.getRelativeUrl())
self.compute_node.setAccessStatus("#access ok")
self.tic()
self.compute_node.ComputeNode_checkAndUpdateCapacityScope()
self.assertEqual(self.compute_node.getCapacityScope(), 'open')
self.tic()
self.assertEqual(None, self.software_instance.getAggregateValue(
portal_type='Compute Partition'))
self.software_instance.SoftwareInstance_tryToAllocatePartition()
self.assertEqual(self.partition.getRelativeUrl(),
self.software_instance.getAggregate(portal_type='Compute Partition'))
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_host_allocation_scope_open_personal(self):
self._makeSlaveTree()
self._makeComputeNode()
self._allocateHost(self.requested_software_instance,
self.partition)
self.compute_node.edit(allocation_scope='open/personal',
source_administration=self.person_user.getRelativeUrl())
self.compute_node.setAccessStatus("#access ok")
self.tic()
self.compute_node.ComputeNode_checkAndUpdateCapacityScope()
self.assertEqual(self.compute_node.getCapacityScope(), 'open')
self.tic()
self.assertEqual(None, self.software_instance.getAggregateValue(
portal_type='Compute Partition'))
self.software_instance.SoftwareInstance_tryToAllocatePartition()
self.assertEqual(self.partition.getRelativeUrl(),
self.software_instance.getAggregate(portal_type='Compute Partition'))
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_does_not_fail_on_instance_with_damaged_sla_xml(self): def test_allocation_does_not_fail_on_instance_with_damaged_sla_xml(self):
self._makeTree() self._makeTree(self.project)
self.software_instance.setSlaXml('this is not xml') self.software_instance.setSlaXml('this is not xml')
self.assertEqual(None, self.software_instance.getAggregateValue( self.assertEqual(None, self.software_instance.getAggregateValue(
...@@ -256,7 +219,7 @@ return True""" ) ...@@ -256,7 +219,7 @@ return True""" )
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_does_not_fail_on_slave_with_damaged_sla_xml(self): def test_allocation_does_not_fail_on_slave_with_damaged_sla_xml(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self.software_instance.setSlaXml('this is not xml') self.software_instance.setSlaXml('this is not xml')
self.assertEqual(None, self.software_instance.getAggregateValue( self.assertEqual(None, self.software_instance.getAggregateValue(
...@@ -286,7 +249,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -286,7 +249,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_alarm_software_instance_unallocated(self): def test_alarm_software_instance_unallocated(self):
self._makeTree() self._makeTree(self.project)
self._simulateSoftwareInstance_tryToAllocatePartition() self._simulateSoftwareInstance_tryToAllocatePartition()
try: try:
...@@ -300,7 +263,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -300,7 +263,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_alarm_slave_instance_unallocated(self): def test_alarm_slave_instance_unallocated(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self._simulateSoftwareInstance_tryToAllocatePartition() self._simulateSoftwareInstance_tryToAllocatePartition()
try: try:
...@@ -314,9 +277,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -314,9 +277,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_alarm_software_instance_allocated(self): def test_alarm_software_instance_allocated(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.tic() self.tic()
self._simulateSoftwareInstance_tryToAllocatePartition() self._simulateSoftwareInstance_tryToAllocatePartition()
...@@ -331,9 +294,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -331,9 +294,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_alarm_slave_instance_allocated(self): def test_alarm_slave_instance_allocated(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self.software_instance.setAggregate(self.partition.getRelativeUrl()) self.software_instance.setAggregate(self.partition.getRelativeUrl())
self.tic() self.tic()
self._simulateSoftwareInstance_tryToAllocatePartition() self._simulateSoftwareInstance_tryToAllocatePartition()
...@@ -348,10 +311,10 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -348,10 +311,10 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_computer_guid(self): def test_allocation_computer_guid(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self.assertEqual(self.compute_node.getAllocationScope(), "open/public") self.assertEqual(self.compute_node.getAllocationScope(), "open")
self.assertEqual(self.compute_node.getCapacityScope(), "open") self.assertEqual(self.compute_node.getCapacityScope(), "open")
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
...@@ -378,9 +341,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -378,9 +341,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_instance_guid(self): def test_allocation_instance_guid(self):
self._makeSlaveTree() self._makeSlaveTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._allocateHost(self.requested_software_instance, self._allocateHost(self.requested_software_instance,
self.partition) self.partition)
...@@ -407,9 +370,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -407,9 +370,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_network_guid(self): def test_allocation_network_guid(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
new_id = self.generateNewId() new_id = self.generateNewId()
computer_network = self.portal.computer_network_module.newContent( computer_network = self.portal.computer_network_module.newContent(
portal_type='Computer Network', portal_type='Computer Network',
...@@ -456,9 +419,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -456,9 +419,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
<instance> <instance>
<parameter id='mode'>unique_by_network</parameter> <parameter id='mode'>unique_by_network</parameter>
</instance>""" </instance>"""
self._makeTree() self._makeTree(self.project)
compute_node1 = self._makeComputeNode()[0] compute_node1 = self._makeComputeNode(self.project)[0]
compute_node2 = self._makeComputeNode()[0] compute_node2 = self._makeComputeNode(self.project)[0]
self._installSoftware(compute_node1, self.software_instance.getUrlString()) self._installSoftware(compute_node1, self.software_instance.getUrlString())
self._installSoftware(compute_node2, self.software_instance.getUrlString()) self._installSoftware(compute_node2, self.software_instance.getUrlString())
...@@ -484,6 +447,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -484,6 +447,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
text_content=self.generateSafeXml(), text_content=self.generateSafeXml(),
sla_xml=sla_xml, sla_xml=sla_xml,
specialise=self.instance_tree.getRelativeUrl(), specialise=self.instance_tree.getRelativeUrl(),
follow_up_value=self.project
) )
self.portal.portal_workflow._jumpToStateFor(software_instance2, 'start_requested') self.portal.portal_workflow._jumpToStateFor(software_instance2, 'start_requested')
self.portal.portal_workflow._jumpToStateFor(software_instance2, 'validated') self.portal.portal_workflow._jumpToStateFor(software_instance2, 'validated')
...@@ -535,10 +499,10 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -535,10 +499,10 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
<instance> <instance>
<parameter id='mode'>unique_by_network</parameter> <parameter id='mode'>unique_by_network</parameter>
</instance>""" </instance>"""
self._makeTree() self._makeTree(self.project)
compute_node1, partition1 = self._makeComputeNode() compute_node1, partition1 = self._makeComputeNode(self.project)
compute_node2 = self._makeComputeNode()[0] compute_node2 = self._makeComputeNode(self.project)[0]
compute_node3, partition3 = self._makeComputeNode() compute_node3, partition3 = self._makeComputeNode(self.project)
computer_network1 = self._makeComputerNetwork() computer_network1 = self._makeComputerNetwork()
computer_network2 = self._makeComputerNetwork() computer_network2 = self._makeComputerNetwork()
...@@ -578,6 +542,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -578,6 +542,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
text_content=self.generateSafeXml(), text_content=self.generateSafeXml(),
sla_xml=sla_xml, sla_xml=sla_xml,
specialise=self.instance_tree.getRelativeUrl(), specialise=self.instance_tree.getRelativeUrl(),
follow_up_value=self.project
) )
self.portal.portal_workflow._jumpToStateFor(software_instance2, 'start_requested') self.portal.portal_workflow._jumpToStateFor(software_instance2, 'start_requested')
software_instance2.validate() software_instance2.validate()
...@@ -598,6 +563,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -598,6 +563,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
text_content=self.generateSafeXml(), text_content=self.generateSafeXml(),
sla_xml=sla_xml, sla_xml=sla_xml,
specialise=self.instance_tree.getRelativeUrl(), specialise=self.instance_tree.getRelativeUrl(),
follow_up_value=self.project
) )
self.portal.portal_workflow._jumpToStateFor(software_instance3, 'start_requested') self.portal.portal_workflow._jumpToStateFor(software_instance3, 'start_requested')
software_instance3.validate() software_instance3.validate()
...@@ -615,8 +581,8 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -615,8 +581,8 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
Test that when we request instance with mode as 'unique_by_network', Test that when we request instance with mode as 'unique_by_network',
instance is not deployed on compute_node with no network. instance is not deployed on compute_node with no network.
""" """
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
self.software_instance.getUrlString()) self.software_instance.getUrlString())
...@@ -650,7 +616,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -650,7 +616,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
else: else:
return self.serialize_call() return self.serialize_call()
self._makeTree() self._makeTree(self.project)
self.software_instance.setSlaXml("""<?xml version='1.0' encoding='utf-8'?> self.software_instance.setSlaXml("""<?xml version='1.0' encoding='utf-8'?>
<instance> <instance>
<parameter id='mode'>unique_by_network</parameter> <parameter id='mode'>unique_by_network</parameter>
...@@ -678,9 +644,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -678,9 +644,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
<instance> <instance>
<parameter id='mode'>unique_by_network</parameter> <parameter id='mode'>unique_by_network</parameter>
</instance>""" </instance>"""
self._makeTree() self._makeTree(self.project)
compute_node1 = self._makeComputeNode()[0] compute_node1 = self._makeComputeNode(self.project)[0]
compute_node2 = self._makeComputeNode()[0] compute_node2 = self._makeComputeNode(self.project)[0]
self._installSoftware(compute_node1, self.software_instance.getUrlString()) self._installSoftware(compute_node1, self.software_instance.getUrlString())
self._installSoftware(compute_node2, self.software_instance.getUrlString()) self._installSoftware(compute_node2, self.software_instance.getUrlString())
...@@ -706,6 +672,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -706,6 +672,7 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
text_content=self.generateSafeXml(), text_content=self.generateSafeXml(),
sla_xml=sla_xml, sla_xml=sla_xml,
specialise=self.instance_tree.getRelativeUrl(), specialise=self.instance_tree.getRelativeUrl(),
follow_up_value=self.project
) )
self.portal.portal_workflow._jumpToStateFor(software_instance2, 'start_requested') self.portal.portal_workflow._jumpToStateFor(software_instance2, 'start_requested')
self.portal.portal_workflow._jumpToStateFor(software_instance2, 'validated') self.portal.portal_workflow._jumpToStateFor(software_instance2, 'validated')
...@@ -743,9 +710,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -743,9 +710,9 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
@simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True') @simulate('Person_isAllowedToAllocate', '*args, **kwargs', 'return True')
def test_allocation_unexpected_sla_parameter(self): def test_allocation_unexpected_sla_parameter(self):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
self.software_instance.getUrlString()) self.software_instance.getUrlString())
...@@ -762,13 +729,13 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S ...@@ -762,13 +729,13 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by S
def check_allocation_category_sla(self, base_category, compute_node_category, def check_allocation_category_sla(self, base_category, compute_node_category,
other_category): other_category):
self._makeTree() self._makeTree(self.project)
self._makeComputeNode() self._makeComputeNode(self.project)
self.assertEqual(self.compute_node.getAllocationScope(), "open/public") self.assertEqual(self.compute_node.getAllocationScope(), "open")
self.assertEqual(self.compute_node.getCapacityScope(), "open") self.assertEqual(self.compute_node.getCapacityScope(), "open")
self.compute_node.edit(**{base_category: compute_node_category}) self.compute_node.edit(**{base_category: compute_node_category})
self.assertEqual(self.compute_node.getAllocationScope(), "open/public") self.assertEqual(self.compute_node.getAllocationScope(), "open")
self.assertEqual(self.compute_node.getCapacityScope(), "open") self.assertEqual(self.compute_node.getCapacityScope(), "open")
self._installSoftware(self.compute_node, self._installSoftware(self.compute_node,
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
############################################################################## ##############################################################################
from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin
import transaction import transaction
from time import sleep
from zExceptions import Unauthorized
from unittest import expectedFailure from unittest import expectedFailure
from Products.ERP5Type.Errors import UnsupportedWorkflowMethod from Products.ERP5Type.Errors import UnsupportedWorkflowMethod
...@@ -29,13 +27,15 @@ from Products.ERP5Type.Errors import UnsupportedWorkflowMethod ...@@ -29,13 +27,15 @@ from Products.ERP5Type.Errors import UnsupportedWorkflowMethod
class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self.project = self.addProject()
# Clone compute_node document # Clone compute_node document
self.compute_node = self.portal.compute_node_module.template_compute_node\ self.compute_node = self.portal.compute_node_module.template_compute_node\
.Base_createCloneDocument(batch_mode=1) .Base_createCloneDocument(batch_mode=1)
new_id = self.generateNewId() new_id = self.generateNewId()
self.compute_node.edit( self.compute_node.edit(
title="compute node %s" % (new_id, ), title="compute node %s" % (new_id, ),
reference="TESTCOMP-%s" % (new_id, ) reference="TESTCOMP-%s" % (new_id, ),
follow_up_value=self.project
) )
self.compute_node.validate() self.compute_node.validate()
self.tic() self.tic()
...@@ -86,15 +86,18 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -86,15 +86,18 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.assertEqual(None, self.portal.REQUEST.get('compute_node_certificate')) self.assertEqual(None, self.portal.REQUEST.get('compute_node_certificate'))
def test_approveComputeNodeRegistration(self): def test_approveComputeNodeRegistration(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
compute_node = self.portal.compute_node_module.newContent(portal_type='Compute Node', compute_node = self.portal.compute_node_module.newContent(
portal_type='Compute Node',
title="Compute Node %s for %s" % (self.new_id, self.person_user.getReference()), title="Compute Node %s for %s" % (self.new_id, self.person_user.getReference()),
reference="TESTCOMP-%s" % self.new_id) reference="TESTCOMP-%s" % self.new_id,
follow_up_value=self.project
)
compute_node.approveComputeNodeRegistration() compute_node.approveComputeNodeRegistration()
self.assertEqual('open/personal', compute_node.getAllocationScope()) self.assertEqual('open', compute_node.getAllocationScope())
self.assertEqual(self.person_user.getRelativeUrl(),
compute_node.getSourceAdministration())
self.assertEqual('validated', compute_node.getValidationState()) self.assertEqual('validated', compute_node.getValidationState())
def _countInstanceBang(self, instance, comment): def _countInstanceBang(self, instance, comment):
...@@ -108,7 +111,7 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -108,7 +111,7 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
'report_compute_node_bang' and q['comment'] == comment]) 'report_compute_node_bang' and q['comment'] == comment])
def test_reportComputeNodeBang(self): def test_reportComputeNodeBang(self):
self._makeComplexComputeNode() self._makeComplexComputeNode(self.project)
self.login(self.compute_node.getUserId()) self.login(self.compute_node.getUserId())
comment = 'Bang from compute_node' comment = 'Bang from compute_node'
started_instance = self.compute_node.partition1.getAggregateRelatedValue( started_instance = self.compute_node.partition1.getAggregateRelatedValue(
...@@ -152,8 +155,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -152,8 +155,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self._countInstanceBang(destroyed_instance2, comment)) self._countInstanceBang(destroyed_instance2, comment))
def test_requestSoftwareRelease_software_release_url_required(self): def test_requestSoftwareRelease_software_release_url_required(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
self.assertRaises(TypeError, self.compute_node.requestSoftwareRelease, self.assertRaises(TypeError, self.compute_node.requestSoftwareRelease,
...@@ -161,8 +164,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -161,8 +164,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
transaction.abort() transaction.abort()
def test_requestSoftwareRelease_state_required(self): def test_requestSoftwareRelease_state_required(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
url = self.generateNewSoftwareReleaseUrl() url = self.generateNewSoftwareReleaseUrl()
...@@ -171,8 +174,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -171,8 +174,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
transaction.abort() transaction.abort()
def test_requestSoftwareRelease_available(self): def test_requestSoftwareRelease_available(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
url = self.generateNewSoftwareReleaseUrl() url = self.generateNewSoftwareReleaseUrl()
...@@ -187,8 +190,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -187,8 +190,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.assertEqual('validated', software_installation.getValidationState()) self.assertEqual('validated', software_installation.getValidationState())
def test_requestSoftwareRelease_destroyed(self): def test_requestSoftwareRelease_destroyed(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
url = self.generateNewSoftwareReleaseUrl() url = self.generateNewSoftwareReleaseUrl()
...@@ -201,8 +204,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -201,8 +204,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.assertEqual(None, software_installation) self.assertEqual(None, software_installation)
def test_requestSoftwareRelease_available_destroyed(self): def test_requestSoftwareRelease_available_destroyed(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
url = self.generateNewSoftwareReleaseUrl() url = self.generateNewSoftwareReleaseUrl()
...@@ -229,8 +232,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -229,8 +232,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.assertEqual('validated', software_installation.getValidationState()) self.assertEqual('validated', software_installation.getValidationState())
def test_requestSoftwareRelease_not_indexed(self): def test_requestSoftwareRelease_not_indexed(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
url = self.generateNewSoftwareReleaseUrl() url = self.generateNewSoftwareReleaseUrl()
...@@ -244,8 +247,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -244,8 +247,8 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflow(SlapOSTestCaseMixin):
@expectedFailure @expectedFailure
def test_requestSoftwareRelease_same_transaction(self): def test_requestSoftwareRelease_same_transaction(self):
self.person_user = self.makePerson() self.person_user = self.makePerson(self.project)
self.compute_node.edit(source_administration=self.person_user.getRelativeUrl()) self.addProjectProductionManagerAssignment(self.person_user, self.project)
self.tic() self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
url = self.generateNewSoftwareReleaseUrl() url = self.generateNewSoftwareReleaseUrl()
...@@ -485,17 +488,20 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflowSupply(SlapOSTestCaseMixin): ...@@ -485,17 +488,20 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflowSupply(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject() portal = self.getPortalObject()
self.project = self.addProject()
# Clone compute_node document # Clone compute_node document
compute_node = portal.compute_node_module.template_compute_node\ compute_node = portal.compute_node_module.template_compute_node\
.Base_createCloneDocument(batch_mode=1) .Base_createCloneDocument(batch_mode=1)
# Clone person document # Clone person document
person_user = self.makePerson(new_id=self.new_id, index=0) person_user = self.makePerson(self.project, new_id=self.new_id, index=0)
self.addProjectProductionManagerAssignment(person_user, self.project)
self.tic()
compute_node.edit( compute_node.edit(
title="Compute Node %s for %s" % (self.new_id, person_user.getReference()), title="Compute Node %s for %s" % (self.new_id, person_user.getReference()),
reference="TESTCOMP-%s" % self.new_id, reference="TESTCOMP-%s" % self.new_id,
source_administration=person_user.getRelativeUrl() follow_up_value=self.project
) )
compute_node.validate() compute_node.validate()
self.compute_node = compute_node self.compute_node = compute_node
...@@ -786,346 +792,3 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflowSupply(SlapOSTestCaseMixin): ...@@ -786,346 +792,3 @@ class TestSlapOSCoreComputeNodeSlapInterfaceWorkflowSupply(SlapOSTestCaseMixin):
self.assertEqual('start_requested', software_installation.getSlapState()) self.assertEqual('start_requested', software_installation.getSlapState())
self.assertEqual('SOFTINSTALL-%s' % (previous_id+2), self.assertEqual('SOFTINSTALL-%s' % (previous_id+2),
software_installation.getReference()) software_installation.getReference())
class TestSlapOSCoreComputeNodeSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin):
def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject()
# Clone compute_node document
compute_node = portal.compute_node_module.template_compute_node\
.Base_createCloneDocument(batch_mode=1)
# Clone person document
person_user = self.makePerson(new_id=self.new_id, index=0)
compute_node.edit(
title="Compute Node %s for %s" % (self.new_id, person_user.getReference()),
reference="TESTCOMP-%s" % self.new_id,
source_administration=person_user.getRelativeUrl()
)
compute_node.validate()
self.compute_node = compute_node
self.tic()
# Login as new user
self.login(person_user.getUserId())
new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
def _makeProject(self):
project = self.portal.project_module.newContent()
project.edit(reference="TESTPROJ-%s" % project.getId())
project.validate()
self.tic()
return project
def _makeOrganisation(self):
organisation = self.portal.organisation_module.newContent()
organisation.edit(reference="TESTSITE-%s" % organisation.getId())
organisation.validate()
self.tic()
return organisation
def test_Computer_requestTransfer_Unauthorized(self):
source_administrator = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
site = self._makeOrganisation()
self.login()
self.assertRaises(Unauthorized, self.compute_node.requestTransfer,
destination=site.getRelativeUrl(),
destination_section=None,
destination_project=None)
self.login(source_administrator.getUserId())
self.assertRaises(ValueError, self.compute_node.requestTransfer,
destination=None,
destination_section=None,
destination_project=None)
self.login()
other_user = self.makePerson(user=1)
self.assertEqual(1 , len(other_user.objectValues(portal_type="ERP5 Login")))
self.compute_node.setSourceAdministrationValue(source_administrator)
self.tic()
self.assertRaises(Unauthorized, self.compute_node.requestTransfer,
destination=None,
destination_section=None,
destination_project=None)
self.login(other_user.getUserId())
self.assertRaises(Unauthorized, self.compute_node.requestTransfer,
destination=None,
destination_section=None,
destination_project=None)
self.login(source_administrator.getUserId())
self.assertEqual(self.compute_node.requestTransfer(
destination=site.getRelativeUrl(),
destination_section=None,
destination_project=None), None)
def test_Computer_requestTransfer_project(self):
source_administrator = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.compute_node.setSourceAdministrationValue(source_administrator)
self.login()
project = self._makeProject()
other_project = self._makeProject()
site = self._makeOrganisation()
self.tic()
self.login(source_administrator.getUserId())
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), None)
# Place in a project
self.assertEqual(self.compute_node.requestTransfer(
destination=site.getRelativeUrl(),
destination_section=None,
destination_project=project.getRelativeUrl()), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), project)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(1,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), project)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(2,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=other_project.getRelativeUrl()), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), other_project)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(3,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), other_project)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(4,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
def test_Computer_requestTransfer_owner(self):
source_administrator = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.compute_node.setSourceAdministrationValue(source_administrator)
self.login()
organisation = self._makeOrganisation()
other_organisation = self._makeOrganisation()
site = self._makeOrganisation()
self.tic()
self.login(source_administrator.getUserId())
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), None)
self.assertEqual(self.compute_node.requestTransfer(
destination=site.getRelativeUrl(),
destination_project=None,
destination_section=organisation.getRelativeUrl()), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), organisation)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(1,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
self.login(source_administrator.getUserId())
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_project=None,
destination_section=other_organisation.getRelativeUrl()), None)
self.tic()
self.assertEqual(3,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), other_organisation)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(3,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(4,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
def test_Computer_requestTransfer_site(self):
source_administrator = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.compute_node.setSourceAdministrationValue(source_administrator)
self.login()
site = self._makeOrganisation()
other_site = self._makeOrganisation()
self.tic()
self.login(source_administrator.getUserId())
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), None)
self.assertEqual(self.compute_node.requestTransfer(
destination_section=None,
destination_project=None,
destination=site.getRelativeUrl()), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
self.assertEqual(1,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
self.login(source_administrator.getUserId())
# We don't remove from Project if destination project is not provided
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), site)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.assertEqual(self.compute_node.requestTransfer(
destination_section=None,
destination_project=None,
destination=other_site.getRelativeUrl()), None)
self.tic()
self.assertEqual(3,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), other_site)
self.assertEqual(3,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.assertEqual(self.compute_node.requestTransfer(
destination=None,
destination_section=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.compute_node.Item_getCurrentProjectValue(), None)
self.assertEqual(self.compute_node.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(self.compute_node.Item_getCurrentSiteValue(), other_site)
self.assertEqual(4,
len(self.compute_node.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
...@@ -31,7 +31,7 @@ class TestSlapOSCoreComputePartitionSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -31,7 +31,7 @@ class TestSlapOSCoreComputePartitionSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.compute_node.edit( self.compute_node.edit(
title="compute node %s" % (self.new_id, ), title="compute node %s" % (self.new_id, ),
reference="TESTCOMP-%s" % (self.new_id, ), reference="TESTCOMP-%s" % (self.new_id, ),
allocation_scope='open/personal', allocation_scope='open',
capacity_scope='open', capacity_scope='open',
) )
self.compute_node.validate() self.compute_node.validate()
......
...@@ -22,8 +22,7 @@ from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin ...@@ -22,8 +22,7 @@ from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin
from erp5.component.document.SoftwareInstance import SoftwareInstance, \ from erp5.component.document.SoftwareInstance import SoftwareInstance, \
DisconnectedSoftwareTree, CyclicSoftwareTree DisconnectedSoftwareTree, CyclicSoftwareTree
import transaction import transaction
from time import sleep
from zExceptions import Unauthorized
class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin): class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin):
"""Tests instance.requestInstance""" """Tests instance.requestInstance"""
...@@ -32,6 +31,7 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -32,6 +31,7 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject() portal = self.getPortalObject()
new_id = self.generateNewId() new_id = self.generateNewId()
self.project = self.addProject()
self.request_kw = dict( self.request_kw = dict(
software_release=self.generateNewSoftwareReleaseUrl(), software_release=self.generateNewSoftwareReleaseUrl(),
...@@ -40,7 +40,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -40,7 +40,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin):
instance_xml=self.generateSafeXml(), instance_xml=self.generateSafeXml(),
sla_xml=self.generateSafeXml(), sla_xml=self.generateSafeXml(),
shared=False, shared=False,
state="started" state="started",
project_reference=self.project.getReference()
) )
# prepare part of tree # prepare part of tree
...@@ -57,7 +58,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -57,7 +58,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin):
text_content=self.request_kw['instance_xml'], text_content=self.request_kw['instance_xml'],
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
root_slave=self.request_kw['shared'], root_slave=self.request_kw['shared'],
successor=self.software_instance.getRelativeUrl() successor=self.software_instance.getRelativeUrl(),
follow_up_value=self.project
) )
instance_tree.validate() instance_tree.validate()
self.portal.portal_workflow._jumpToStateFor(instance_tree, 'start_requested') self.portal.portal_workflow._jumpToStateFor(instance_tree, 'start_requested')
...@@ -69,7 +71,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -69,7 +71,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflow(SlapOSTestCaseMixin):
source_reference=self.request_kw['software_type'], source_reference=self.request_kw['software_type'],
text_content=self.request_kw['instance_xml'], text_content=self.request_kw['instance_xml'],
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
specialise=instance_tree.getRelativeUrl() specialise=instance_tree.getRelativeUrl(),
follow_up_value=self.project
) )
self.portal.portal_workflow._jumpToStateFor(self.software_instance, 'start_requested') self.portal.portal_workflow._jumpToStateFor(self.software_instance, 'start_requested')
self.software_instance.validate() self.software_instance.validate()
...@@ -1050,6 +1053,7 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin): ...@@ -1050,6 +1053,7 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject() portal = self.getPortalObject()
new_id = self.generateNewId() new_id = self.generateNewId()
self.project = self.addProject()
self.request_kw = dict( self.request_kw = dict(
software_release=self.generateNewSoftwareReleaseUrl(), software_release=self.generateNewSoftwareReleaseUrl(),
...@@ -1058,7 +1062,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin): ...@@ -1058,7 +1062,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin):
instance_xml=self.generateSafeXml(), instance_xml=self.generateSafeXml(),
sla_xml=self.generateSafeXml(), sla_xml=self.generateSafeXml(),
shared=False, shared=False,
state="started" state="started",
project_reference=self.project.getReference()
) )
# prepare part of tree # prepare part of tree
...@@ -1075,7 +1080,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin): ...@@ -1075,7 +1080,8 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin):
text_content=self.request_kw['instance_xml'], text_content=self.request_kw['instance_xml'],
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
root_slave=self.request_kw['shared'], root_slave=self.request_kw['shared'],
successor=self.software_instance.getRelativeUrl() successor=self.software_instance.getRelativeUrl(),
follow_up_value=self.project
) )
self.instance_tree.validate() self.instance_tree.validate()
self.portal.portal_workflow._jumpToStateFor(self.instance_tree, 'start_requested') self.portal.portal_workflow._jumpToStateFor(self.instance_tree, 'start_requested')
...@@ -1087,13 +1093,14 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin): ...@@ -1087,13 +1093,14 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin):
source_reference=self.request_kw['software_type'], source_reference=self.request_kw['software_type'],
text_content=self.request_kw['instance_xml'], text_content=self.request_kw['instance_xml'],
sla_xml=self.request_kw['sla_xml'], sla_xml=self.request_kw['sla_xml'],
specialise=self.instance_tree.getRelativeUrl() specialise=self.instance_tree.getRelativeUrl(),
follow_up_value=self.project
) )
self.portal.portal_workflow._jumpToStateFor(self.software_instance, 'start_requested') self.portal.portal_workflow._jumpToStateFor(self.software_instance, 'start_requested')
self.software_instance.validate() self.software_instance.validate()
self.tic() self.tic()
person_user = self.makePerson() person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -1122,202 +1129,6 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin): ...@@ -1122,202 +1129,6 @@ class TestSlapOSCoreInstanceSlapInterfaceWorkflowTransfer(SlapOSTestCaseMixin):
self.tic() self.tic()
return organisation return organisation
def test_RequesterInstance_requestTransfer_Unauthorized(self):
destination_section = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.login()
self.assertRaises(Unauthorized, self.instance_tree.requestTransfer,
destination=None,
destination_project=None)
self.login(destination_section.getUserId())
self.assertRaises(Unauthorized, self.instance_tree.requestTransfer,
destination=None,
destination_project=None)
self.login()
other_user = self.makePerson(user=1)
self.assertEqual(1 , len(other_user.objectValues(portal_type="ERP5 Login")))
self.instance_tree.setDestinationSectionValue(destination_section)
self.tic()
self.assertRaises(Unauthorized, self.instance_tree.requestTransfer,
destination=None,
destination_project=None)
self.login(other_user.getUserId())
self.assertRaises(Unauthorized, self.instance_tree.requestTransfer,
destination=None,
destination_project=None)
self.login(destination_section.getUserId())
self.assertEqual(self.instance_tree.requestTransfer(
destination=None,
destination_project=None), None)
def test_RequesterInstance_requestTransfer_project(self):
destination_section = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.instance_tree.setDestinationSectionValue(destination_section)
self.login()
project = self._makeProject()
other_project = self._makeProject()
self.tic()
self.login(destination_section.getUserId())
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), None)
# Place in a project
self.assertEqual(self.instance_tree.requestTransfer(
destination=None,
destination_project=project.getRelativeUrl()), None)
self.tic()
self.assertEqual(
self.instance_tree.Item_getCurrentProjectValue(), project)
self.assertEqual(
self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(
self.instance_tree.Item_getCurrentSiteValue(), None)
self.assertEqual(1,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
self.login(destination_section.getUserId())
# We don't remove from Project if destination project is not provided
self.assertEqual(self.instance_tree.requestTransfer(
destination=None,
destination_project=None), None)
self.tic()
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), project)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(2,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.assertEqual(self.instance_tree.requestTransfer(
destination=None,
destination_project=other_project.getRelativeUrl()), None)
self.tic()
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), other_project)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), None)
self.assertEqual(3,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(destination_section.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.assertEqual(self.instance_tree.requestTransfer(
destination_project=None,
destination=None), None)
self.tic()
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), other_project)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), None)
self.assertEqual(4,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
def test_RequesterInstance_requestTransfer_owner(self):
destination_section = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.instance_tree.setDestinationSectionValue(destination_section)
self.login()
organisation = self._makeOrganisation()
other_organisation = self._makeOrganisation()
self.tic()
self.login(destination_section.getUserId())
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), None)
self.assertEqual(self.instance_tree.requestTransfer(
destination=organisation.getRelativeUrl(),
destination_project=None), None)
self.tic()
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), organisation)
self.assertEqual(1,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
self.login(destination_section.getUserId())
self.assertEqual(self.instance_tree.requestTransfer(
destination_project=None,
destination=None), None)
self.tic()
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), organisation)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.assertEqual(self.instance_tree.requestTransfer(
destination_project=None,
destination=other_organisation.getRelativeUrl()), None)
self.tic()
self.assertEqual(3,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), other_organisation)
self.assertEqual(3,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(destination_section.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.assertEqual(self.instance_tree.requestTransfer(
destination_project=None,
destination=None), None)
self.tic()
self.assertEqual(self.instance_tree.Item_getCurrentProjectValue(), None)
self.assertEqual(self.instance_tree.Item_getCurrentOwnerValue(), destination_section)
self.assertEqual(self.instance_tree.Item_getCurrentSiteValue(), other_organisation)
self.assertEqual(4,
len(self.instance_tree.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
def test_generateCertificate(self): def test_generateCertificate(self):
self.login() self.login()
self.software_instance.setSslKey(None) self.software_instance.setSslKey(None)
......
...@@ -23,14 +23,19 @@ from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin ...@@ -23,14 +23,19 @@ from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin
class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
def test_ComputeNode_setSubjectList(self): def test_ComputeNode_setSubjectList(self):
self.person_user = self.makePerson() project = self.addProject()
self.person_user = self.makePerson(project)
self.addProjectProductionManagerAssignment(self.person_user, project)
self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
new_id = self.generateNewId() new_id = self.generateNewId()
compute_node = self.portal.compute_node_module.newContent( compute_node = self.portal.compute_node_module.newContent(
portal_type='Compute Node', portal_type='Compute Node',
title="Compute Node %s for %s" % (new_id, self.person_user.getReference()), title="Compute Node %s for %s" % (new_id, self.person_user.getReference()),
reference="TESTCOMP-%s" % new_id) reference="TESTCOMP-%s" % new_id,
follow_up_value=project
)
self.tic() self.tic()
assert compute_node.getDestinationSectionValue() is None assert compute_node.getDestinationSectionValue() is None
...@@ -40,7 +45,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -40,7 +45,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
self.person_user.getRelativeUrl() self.person_user.getRelativeUrl()
def check_Instance_validate(self, portal_type): def check_Instance_validate(self, portal_type):
self.person_user = self.makePerson() project = self.addProject()
self.person_user = self.makePerson(project)
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
# Instance Tree required for security. # Instance Tree required for security.
...@@ -49,14 +55,17 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -49,14 +55,17 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
title="HS %s for %s" % (self.new_id, self.person_user.getReference()), title="HS %s for %s" % (self.new_id, self.person_user.getReference()),
reference="TESTHS-%s" % self.new_id, reference="TESTHS-%s" % self.new_id,
destination_reference="TESTHS-%s" % self.new_id, destination_reference="TESTHS-%s" % self.new_id,
destination_section=self.person_user.getRelativeUrl() destination_section=self.person_user.getRelativeUrl(),
follow_up_value=project
) )
instance = self.portal.software_instance_module.newContent( instance = self.portal.software_instance_module.newContent(
portal_type=portal_type, portal_type=portal_type,
title="Instance %s for %s" % (self.new_id, self.person_user.getReference()), title="Instance %s for %s" % (self.new_id, self.person_user.getReference()),
reference="TESTINST-%s" % self.new_id, reference="TESTINST-%s" % self.new_id,
specialise_value=hs) specialise_value=hs,
follow_up_value=project
)
if portal_type == "Software Instance": if portal_type == "Software Instance":
self._addCertificateLogin(instance) self._addCertificateLogin(instance)
...@@ -89,7 +98,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -89,7 +98,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
return self.check_Instance_validate("Slave Instance") return self.check_Instance_validate("Slave Instance")
def test_SlaveInstance_requestDestroy(self): def test_SlaveInstance_requestDestroy(self):
self.person_user = self.makePerson() project = self.addProject()
self.person_user = self.makePerson(project)
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
# Instance Tree required for security. # Instance Tree required for security.
...@@ -98,7 +108,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -98,7 +108,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
title="HS %s for %s" % (self.new_id, self.person_user.getReference()), title="HS %s for %s" % (self.new_id, self.person_user.getReference()),
reference="TESTHS-%s" % self.new_id, reference="TESTHS-%s" % self.new_id,
destination_reference="TESTHS-%s" % self.new_id, destination_reference="TESTHS-%s" % self.new_id,
destination_section=self.person_user.getRelativeUrl() destination_section=self.person_user.getRelativeUrl(),
follow_up_value=project
) )
instance = self.portal.software_instance_module.newContent( instance = self.portal.software_instance_module.newContent(
...@@ -107,7 +118,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -107,7 +118,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
reference="TESTINST-%s" % self.new_id, reference="TESTINST-%s" % self.new_id,
destination_reference="TESTINST-%s" % self.new_id, destination_reference="TESTINST-%s" % self.new_id,
destination_section=self.person_user.getRelativeUrl(), destination_section=self.person_user.getRelativeUrl(),
specialise_value=hs specialise_value=hs,
follow_up_value=project
) )
request_kw = dict( request_kw = dict(
software_release='http://example.org', software_release='http://example.org',
...@@ -124,18 +136,24 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -124,18 +136,24 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
self.assertEqual(instance.getValidationState(), 'invalidated') self.assertEqual(instance.getValidationState(), 'invalidated')
def check_SoftwareInstallation_changeState(self, method_id): def check_SoftwareInstallation_changeState(self, method_id):
self.person_user = self.makePerson() project = self.addProject()
self.person_user = self.makePerson(project)
self.addProjectProductionManagerAssignment(self.person_user, project)
self.tic()
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
compute_node = self.portal.compute_node_module.newContent( compute_node = self.portal.compute_node_module.newContent(
portal_type='Compute Node', portal_type='Compute Node',
title="Compute Node %s for %s" % (self.new_id, self.person_user.getReference()), title="Compute Node %s for %s" % (self.new_id, self.person_user.getReference()),
reference="TESTCOMP-%s" % self.new_id) reference="TESTCOMP-%s" % self.new_id,
follow_up_value=project
)
self._addCertificateLogin(compute_node) self._addCertificateLogin(compute_node)
installation = self.portal.software_installation_module.newContent( installation = self.portal.software_installation_module.newContent(
portal_type='Software Installation', portal_type='Software Installation',
title="Installation %s for %s" % (self.new_id, self.person_user.getReference()), title="Installation %s for %s" % (self.new_id, self.person_user.getReference()),
aggregate_value=compute_node, aggregate_value=compute_node,
follow_up_value=project
) )
self.tic() self.tic()
...@@ -165,20 +183,31 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -165,20 +183,31 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
return self.check_SoftwareInstallation_changeState('requestDestroy') return self.check_SoftwareInstallation_changeState('requestDestroy')
def check_SoftwareInstance_changeState(self, method_id): def check_SoftwareInstance_changeState(self, method_id):
self.person_user = self.makePerson() project = self.addProject()
self.login(self.person_user.getUserId()) self.person_user = self.makePerson(project)
self.addProjectProductionManagerAssignment(self.person_user, project)
new_id = self.generateNewId() new_id = self.generateNewId()
compute_node = self.portal.compute_node_module.newContent( compute_node = self.portal.compute_node_module.newContent(
portal_type='Compute Node', portal_type='Compute Node',
title="Compute Node %s for %s" % (new_id, self.person_user.getReference()), title="Compute Node %s for %s" % (new_id, self.person_user.getReference()),
<<<<<<< HEAD
reference="TESTCOMP-%s" % new_id) reference="TESTCOMP-%s" % new_id)
self._addCertificateLogin(compute_node) self._addCertificateLogin(compute_node)
=======
reference="TESTCOMP-%s" % new_id,
follow_up_value=project
)
self._addERP5Login(compute_node)
>>>>>>> 1561dc0c2 (slapos_cloud: assignment needed to touch compute node)
partition = compute_node.newContent( partition = compute_node.newContent(
portal_type='Compute Partition', portal_type='Compute Partition',
title="Partition Compute Node %s for %s" % (new_id, title="Partition Compute Node %s for %s" % (new_id,
self.person_user.getReference()), self.person_user.getReference()),
reference="TESTPART-%s" % new_id) reference="TESTPART-%s" % new_id)
self.login(self.person_user.getUserId())
instance = self.portal.software_instance_module.newContent( instance = self.portal.software_instance_module.newContent(
portal_type="Software Instance", portal_type="Software Instance",
title="Instance %s for %s" % (new_id, self.person_user.getReference()), title="Instance %s for %s" % (new_id, self.person_user.getReference()),
...@@ -187,6 +216,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -187,6 +216,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
destination_reference="TESTINST-%s" % new_id, destination_reference="TESTINST-%s" % new_id,
ssl_certificate="foo", ssl_certificate="foo",
ssl_key="bar", ssl_key="bar",
follow_up_value=project
) )
request_kw = dict( request_kw = dict(
...@@ -230,7 +260,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -230,7 +260,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
return self.check_SoftwareInstance_changeState("requestDestroy") return self.check_SoftwareInstance_changeState("requestDestroy")
def check_change_instance_parameter(self, portal_type, method_id): def check_change_instance_parameter(self, portal_type, method_id):
self.person_user = self.makePerson() project = self.addProject()
self.person_user = self.makePerson(project)
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
instance = self.portal.software_instance_module.newContent( instance = self.portal.software_instance_module.newContent(
...@@ -240,6 +271,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -240,6 +271,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
destination_reference="TESTINST-%s" % self.new_id, destination_reference="TESTINST-%s" % self.new_id,
ssl_certificate="foo", ssl_certificate="foo",
ssl_key="bar", ssl_key="bar",
follow_up_value=project
) )
self.tic() self.tic()
...@@ -286,7 +318,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -286,7 +318,8 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
def test_SoftwareInstance_setSuccessorList(self): def test_SoftwareInstance_setSuccessorList(self):
portal_type = "Software Instance" portal_type = "Software Instance"
self.person_user = self.makePerson() project = self.addProject()
self.person_user = self.makePerson(project)
self.login(self.person_user.getUserId()) self.login(self.person_user.getUserId())
new_id = self.generateNewId() new_id = self.generateNewId()
...@@ -297,6 +330,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -297,6 +330,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
destination_reference="TESTINST-%s" % new_id, destination_reference="TESTINST-%s" % new_id,
ssl_certificate="foo", ssl_certificate="foo",
ssl_key="bar", ssl_key="bar",
follow_up_value=project
) )
new_id = self.generateNewId() new_id = self.generateNewId()
...@@ -308,6 +342,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -308,6 +342,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
ssl_certificate="foo", ssl_certificate="foo",
ssl_key="bar", ssl_key="bar",
successor_value=instance3, successor_value=instance3,
follow_up_value=project
) )
new_id = self.generateNewId() new_id = self.generateNewId()
...@@ -319,6 +354,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin): ...@@ -319,6 +354,7 @@ class TestSlapOSCoreSlapOSCloudInteractionWorkflow(SlapOSTestCaseMixin):
ssl_certificate="foo", ssl_certificate="foo",
ssl_key="bar", ssl_key="bar",
successor_value=instance2, successor_value=instance2,
follow_up_value=project
) )
self.tic() self.tic()
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
# #
############################################################################## ##############################################################################
from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin
from time import sleep
from zExceptions import Unauthorized
import transaction import transaction
class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin): class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin):
...@@ -28,8 +26,10 @@ class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -28,8 +26,10 @@ class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject() portal = self.getPortalObject()
self.project = self.addProject()
person_user = self.makePerson()
person_user = self.makePerson(self.project)
self.addProjectProductionManagerAssignment(person_user, self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -39,7 +39,8 @@ class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -39,7 +39,8 @@ class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl()) self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
self.network = portal.computer_network_module.newContent( self.network = portal.computer_network_module.newContent(
portal_type="Computer Network" portal_type="Computer Network",
follow_up_value=self.project
) )
self.tic() self.tic()
self.assertEqual( self.assertEqual(
...@@ -62,200 +63,3 @@ class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -62,200 +63,3 @@ class TestSlapOSCoreNetworkSlapInterfaceWorkflow(SlapOSTestCaseMixin):
self.network.validate() self.network.validate()
# Don't raise if network is validated # Don't raise if network is validated
self.assertEqual(self.network.approveRegistration(), None) self.assertEqual(self.network.approveRegistration(), None)
def _makeProject(self):
project = self.portal.project_module.newContent()
project.edit(reference="TESTPROJ-%s" % project.getId())
project.validate()
self.tic()
return project
def _makeOrganisation(self):
organisation = self.portal.organisation_module.newContent()
organisation.edit(reference="TESTSITE-%s" % organisation.getId())
organisation.validate()
self.tic()
return organisation
def test_ComputerNetwork_requestTransfer_project(self):
source_administrator = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.network.setSourceAdministrationValue(source_administrator)
self.login()
self.network.approveRegistration()
project = self._makeProject()
other_project = self._makeProject()
self.tic()
self.login(source_administrator.getUserId())
self.assertEqual(self.network.Item_getCurrentProjectValue(), None)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), None)
# Place in a project
self.network.requestTransfer(
destination_section=None,
destination_project=project.getRelativeUrl())
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), project)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(1,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# We don't remove from Project if destination project is not provided
self.network.requestTransfer(
destination_project=None,
destination_section=None
)
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), project)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(2,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.network.requestTransfer(
destination_section=None,
destination_project=other_project.getRelativeUrl())
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), other_project)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(3,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.network.requestTransfer(
destination_project=None,
destination_section=None
)
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), other_project)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), source_administrator)
self.assertEqual(4,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
def test_ComputerNetwork_requestTransfer_owner(self):
source_administrator = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.network.setSourceAdministrationValue(source_administrator)
self.login()
self.network.approveRegistration()
organisation = self._makeOrganisation()
other_organisation = self._makeOrganisation()
self.tic()
self.login(source_administrator.getUserId())
self.assertEqual(self.network.Item_getCurrentProjectValue(), None)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), None)
self.network.requestTransfer(
destination_project=None,
destination_section=organisation.getRelativeUrl())
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), None)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), organisation)
self.assertEqual(1,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.network.requestTransfer(
destination_project=None,
destination_section=None)
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), None)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), organisation)
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# Place in another project
self.network.requestTransfer(
destination_project=None,
destination_section=other_organisation.getRelativeUrl())
self.tic()
self.assertEqual(3,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.assertEqual(self.network.Item_getCurrentProjectValue(), None)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), other_organisation)
self.assertEqual(3,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
self.login(source_administrator.getUserId())
# Ensure that we don't have 2 new Internal Packing lists in the same second
sleep(1)
# We don't remove from Project if destination project is not provided
self.network.requestTransfer(
destination_project=None,
destination_section=None
)
self.tic()
self.assertEqual(self.network.Item_getCurrentProjectValue(), None)
self.assertEqual(self.network.Item_getCurrentOwnerValue(), other_organisation)
self.assertEqual(4,
len(self.network.getAggregateRelatedList(portal_type="Internal Packing List Line"))
)
def test_ComputerNetwork_requestTransfer_Unauthorized(self):
self.network.approveRegistration()
self.login()
self.assertRaises(Unauthorized, self.network.requestTransfer)
source_administrator = self.makePerson(user=1)
self.assertEqual(1 , len(source_administrator.objectValues( portal_type="ERP5 Login")))
self.login(source_administrator.getUserId())
self.assertRaises(Unauthorized, self.network.requestTransfer)
self.login()
other_user = self.makePerson(user=1)
self.assertEqual(1 , len(other_user.objectValues(portal_type="ERP5 Login")))
self.network.setSourceAdministrationValue(source_administrator)
self.tic()
self.assertRaises(Unauthorized, self.network.requestTransfer)
self.login(other_user.getUserId())
self.assertRaises(Unauthorized, self.network.requestTransfer)
self.login(source_administrator.getUserId())
self.network.requestTransfer(
destination_project=None,
destination_section=None
)
...@@ -6,12 +6,6 @@ ...@@ -6,12 +6,6 @@
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>default_reference</string> </key> <key> <string>default_reference</string> </key>
<value> <string>testSlapOSCloudNetworkSlapInterfaceWorkflow</string> </value> <value> <string>testSlapOSCloudNetworkSlapInterfaceWorkflow</string> </value>
...@@ -61,28 +55,13 @@ ...@@ -61,28 +55,13 @@
<item> <item>
<key> <string>workflow_history</string> </key> <key> <string>workflow_history</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -95,7 +74,7 @@ ...@@ -95,7 +74,7 @@
<item> <item>
<key> <string>component_validation_workflow</string> </key> <key> <string>component_validation_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
...@@ -104,7 +83,7 @@ ...@@ -104,7 +83,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
......
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2002-2012 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin
from zExceptions import Unauthorized
import transaction
class TestSlapOSCoreOrganisationSlapInterfaceWorkflow(SlapOSTestCaseMixin):
def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject()
person_user = self.makePerson()
self.tic()
# Login as new user
self.login(person_user.getUserId())
new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
self.organisation = portal.organisation_module.newContent(
portal_type="Organisation"
)
self.tic()
def beforeTearDown(self):
transaction.abort()
def test_organisation_approveRegistration_with_reference(self):
reference = "TEST-%s" % self.generateNewId()
self.organisation.setReference(reference)
self.organisation.approveRegistration()
self.assertEqual(self.organisation.getReference(), reference)
def test_organisation_approveRegistration_already_validated(self):
# Login as admin since user cannot re-approve a validated organisation
self.login()
self.organisation.setReference(None)
self.organisation.validate()
# Don't raise if organisation is validated
self.assertEqual(self.organisation.approveRegistration(), None)
def test_organisation_approveRegistration_site(self, role="host", expected_prefix="SITE-"):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.organisation.edit(role=role)
self.organisation.approveRegistration()
self.tic()
self.logout()
self.login(person.getUserId())
self.assertEqual(self.organisation.getValidationState(),
'validated')
self.assertTrue(self.organisation.getReference().startswith(expected_prefix),
"Reference don't start with %s : %s " % (
expected_prefix, self.organisation.getReference()))
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationValue() == self.organisation]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'open')
self.assertIn("Assigment for Organisation ", assignment_list[0].getTitle())
def test_organisation_approveRegistration_organisation(self):
self.test_organisation_approveRegistration_site(role="client", expected_prefix="O-")
def test_organisation_leaveOrganisation_no_user(self):
self.login()
self.assertRaises(Unauthorized, self.organisation.leaveOrganisation)
def test_organisation_leaveOrganisation_after_join(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
# Just make things fast, by using the API tested above
self.organisation.approveRegistration()
self.tic()
self.logout()
self.login(person.getUserId())
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationValue() == self.organisation]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'open')
self.organisation.leaveOrganisation()
self.tic()
self.login()
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationValue() == self.organisation]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'closed')
def test_organisation_acceptInvitation_no_invitation_token(self):
self.assertRaises(TypeError, self.organisation.acceptInvitation)
def test_organisation_acceptInvitation_no_token_dont_exist(self):
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token="DONOTEXIST")
def test_organisation_acceptInvitation(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.login()
token = self.portal.invitation_token_module.newContent(
portal_type="Invitation Token"
)
token_id = token.getId()
# User is None
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token=token_id)
# Not validated yet
self.login(person.getUserId())
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token=token_id)
self.login()
token.validate()
token.setSourceValue(person)
self.login(person.getUserId())
# Not used by the owner
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token=token_id)
self.login()
token.setSourceValue(None)
self.login(person.getUserId())
self.organisation.acceptInvitation(invitation_token=token_id)
self.tic()
self.login()
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationValue() == self.organisation]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'open')
self.assertEqual(token.getValidationState(), "invalidated")
def test_organisation_acceptInvitation_already_member(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.organisation.approveRegistration()
self.tic()
self.login()
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationValue() == self.organisation]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'open')
token = self.portal.invitation_token_module.newContent(
portal_type="Invitation Token"
)
token_id = token.getId()
# User is None
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token=token_id)
# Not validated yet
self.login(person.getUserId())
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token=token_id)
self.login()
token.validate()
token.setSourceValue(person)
self.login(person.getUserId())
# Not used by the owner
self.assertRaises(ValueError, self.organisation.acceptInvitation,
invitation_token=token_id)
self.login()
token.setSourceValue(None)
self.login(person.getUserId())
self.organisation.acceptInvitation(invitation_token=token_id)
self.tic()
self.login()
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationValue() == self.organisation]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'open')
self.assertEqual(token.getValidationState(), "invalidated")
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testSlapOSCloudOrganisationSlapInterfaceWorkflow</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testSlapOSCloudOrganisationSlapInterfaceWorkflow</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>validate</string> </value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>validated</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -29,7 +29,8 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -29,7 +29,8 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson() self.project = self.addProject()
person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -65,6 +66,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -65,6 +66,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
# software_title is mandatory # software_title is mandatory
...@@ -75,6 +77,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -75,6 +77,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
# software_type is mandatory # software_type is mandatory
...@@ -85,6 +88,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -85,6 +88,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
# instance_xml is mandatory # instance_xml is mandatory
...@@ -95,6 +99,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -95,6 +99,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
# instance_xml is mandatory # instance_xml is mandatory
...@@ -105,6 +110,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -105,6 +110,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
# sla_xml is mandatory # sla_xml is mandatory
...@@ -115,6 +121,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -115,6 +121,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
instance_xml=instance_xml, instance_xml=instance_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
# shared is mandatory # shared is mandatory
...@@ -125,6 +132,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -125,6 +132,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
instance_xml=instance_xml, instance_xml=instance_xml,
sla_xml=sla_xml, sla_xml=sla_xml,
state=state, state=state,
project_reference=self.project.getReference()
) )
# state is mandatory # state is mandatory
...@@ -135,6 +143,17 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -135,6 +143,17 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
instance_xml=instance_xml, instance_xml=instance_xml,
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
project_reference=self.project.getReference()
)
# project_reference is mandatory
self.assertRaises(TypeError, person.requestSoftwareInstance,
software_release=software_release,
software_title=software_title,
software_type=software_type,
instance_xml=instance_xml,
sla_xml=sla_xml,
shared=shared
) )
def test_Person_requestSoftwareInstance_acceptedState(self): def test_Person_requestSoftwareInstance_acceptedState(self):
...@@ -159,6 +178,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -159,6 +178,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="foo", state="foo",
project_reference=self.project.getReference()
) )
person.requestSoftwareInstance( person.requestSoftwareInstance(
...@@ -169,6 +189,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -169,6 +189,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="started", state="started",
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
self.assertEqual("start_requested", instance_tree.getSlapState()) self.assertEqual("start_requested", instance_tree.getSlapState())
...@@ -181,6 +202,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -181,6 +202,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="stopped", state="stopped",
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
self.assertEqual("stop_requested", instance_tree.getSlapState()) self.assertEqual("stop_requested", instance_tree.getSlapState())
...@@ -193,6 +215,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -193,6 +215,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="destroyed", state="destroyed",
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
self.assertEqual(None, instance_tree) self.assertEqual(None, instance_tree)
...@@ -219,6 +242,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -219,6 +242,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
self.assertEqual("Instance Tree", self.assertEqual("Instance Tree",
...@@ -250,6 +274,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -250,6 +274,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
self.assertEqual(software_release, self.assertEqual(software_release,
...@@ -286,6 +311,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -286,6 +311,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
transaction.commit() transaction.commit()
...@@ -297,6 +323,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -297,6 +323,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
@expectedFailure @expectedFailure
...@@ -322,6 +349,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -322,6 +349,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
instance_tree_reference = instance_tree.getReference() instance_tree_reference = instance_tree.getReference()
...@@ -350,6 +378,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -350,6 +378,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml2, sla_xml=sla_xml2,
shared=shared2, shared=shared2,
state=state2, state=state2,
project_reference=self.project.getReference()
) )
instance_tree2 = person.REQUEST.get('request_instance_tree') instance_tree2 = person.REQUEST.get('request_instance_tree')
...@@ -390,6 +419,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -390,6 +419,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
transaction.commit() transaction.commit()
...@@ -408,6 +438,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -408,6 +438,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
def test_Person_requestSoftwareInstance_InstanceTreeNewTitle(self): def test_Person_requestSoftwareInstance_InstanceTreeNewTitle(self):
...@@ -433,6 +464,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -433,6 +464,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state=state, state=state,
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
...@@ -460,6 +492,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -460,6 +492,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml2, sla_xml=sla_xml2,
shared=shared2, shared=shared2,
state=state2, state=state2,
project_reference=self.project.getReference()
) )
instance_tree2 = person.REQUEST.get('request_instance_tree') instance_tree2 = person.REQUEST.get('request_instance_tree')
...@@ -499,6 +532,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -499,6 +532,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="stopped", state="stopped",
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
transaction.commit() transaction.commit()
...@@ -512,6 +546,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -512,6 +546,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="destroyed", state="destroyed",
project_reference=self.project.getReference()
) )
instance_tree2 = person.REQUEST.get('request_instance_tree') instance_tree2 = person.REQUEST.get('request_instance_tree')
self.assertEqual(None, instance_tree2) self.assertEqual(None, instance_tree2)
...@@ -538,6 +573,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -538,6 +573,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="stopped", state="stopped",
project_reference=self.project.getReference()
) )
instance_tree = person.REQUEST.get('request_instance_tree') instance_tree = person.REQUEST.get('request_instance_tree')
transaction.commit() transaction.commit()
...@@ -550,6 +586,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -550,6 +586,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="destroyed", state="destroyed",
project_reference=self.project.getReference()
) )
self.assertEqual("destroy_requested", instance_tree.getSlapState()) self.assertEqual("destroy_requested", instance_tree.getSlapState())
transaction.commit() transaction.commit()
...@@ -563,6 +600,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin): ...@@ -563,6 +600,7 @@ class TestSlapOSCorePersonRequest(SlapOSTestCaseMixin):
sla_xml=sla_xml, sla_xml=sla_xml,
shared=shared, shared=shared,
state="started", state="started",
project_reference=self.project.getReference()
) )
instance_tree2 = person.REQUEST.get('request_instance_tree') instance_tree2 = person.REQUEST.get('request_instance_tree')
self.assertEqual("start_requested", instance_tree2.getSlapState()) self.assertEqual("start_requested", instance_tree2.getSlapState())
...@@ -576,7 +614,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -576,7 +614,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson() self.project = self.addProject()
person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -591,17 +630,20 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -591,17 +630,20 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
# compute_node_title is mandatory # compute_node_title is mandatory
self.assertRaises(TypeError, person.requestComputeNode) self.assertRaises(TypeError, person.requestComputeNode,
project_reference=self.project.getReference())
# if provided does not raise # if provided does not raise
compute_node_title = self.generateNewComputeNodeTitle() compute_node_title = self.generateNewComputeNodeTitle()
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
def test_request(self): def test_request(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
compute_node_title = self.generateNewComputeNodeTitle() compute_node_title = self.generateNewComputeNodeTitle()
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
# check what is returned via request # check what is returned via request
compute_node_url = person.REQUEST.get('compute_node') compute_node_url = person.REQUEST.get('compute_node')
...@@ -620,7 +662,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -620,7 +662,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
id_generator='uid') id_generator='uid')
compute_node_title = self.generateNewComputeNodeTitle() compute_node_title = self.generateNewComputeNodeTitle()
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
# check what is returned via request # check what is returned via request
compute_node_url = person.REQUEST.get('compute_node') compute_node_url = person.REQUEST.get('compute_node')
...@@ -647,9 +690,11 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -647,9 +690,11 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
compute_node_title = self.generateNewComputeNodeTitle() compute_node_title = self.generateNewComputeNodeTitle()
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
transaction.commit() transaction.commit()
self.assertRaises(NotImplementedError, person.requestComputeNode, self.assertRaises(NotImplementedError, person.requestComputeNode,
project_reference=self.project.getReference(),
compute_node_title=compute_node_title) compute_node_title=compute_node_title)
def test_multiple_request_createdComputeNode(self): def test_multiple_request_createdComputeNode(self):
...@@ -661,7 +706,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -661,7 +706,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
compute_node_title = self.generateNewComputeNodeTitle() compute_node_title = self.generateNewComputeNodeTitle()
compute_node_title2 = self.generateNewComputeNodeTitle() compute_node_title2 = self.generateNewComputeNodeTitle()
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
# check what is returned via request # check what is returned via request
compute_node_url = person.REQUEST.get('compute_node') compute_node_url = person.REQUEST.get('compute_node')
...@@ -687,7 +733,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -687,7 +733,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
self.tic() self.tic()
# request again the same compute_node # request again the same compute_node
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
# check what is returned via request # check what is returned via request
compute_node_url = person.REQUEST.get('compute_node') compute_node_url = person.REQUEST.get('compute_node')
...@@ -711,7 +758,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -711,7 +758,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
self.assertEqual('close', compute_node.getCapacityScope()) self.assertEqual('close', compute_node.getCapacityScope())
# and now another one # and now another one
person.requestComputeNode(compute_node_title=compute_node_title2) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title2)
# check what is returned via request # check what is returned via request
compute_node_url2 = person.REQUEST.get('compute_node') compute_node_url2 = person.REQUEST.get('compute_node')
...@@ -741,7 +789,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -741,7 +789,8 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
compute_node_title = self.generateNewComputeNodeTitle() compute_node_title = self.generateNewComputeNodeTitle()
person.requestComputeNode(compute_node_title=compute_node_title) person.requestComputeNode(project_reference=self.project.getReference(),
compute_node_title=compute_node_title)
# check what is returned via request # check what is returned via request
compute_node_url = person.REQUEST.get('compute_node') compute_node_url = person.REQUEST.get('compute_node')
...@@ -765,233 +814,10 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin): ...@@ -765,233 +814,10 @@ class TestSlapOSCorePersonRequestComputeNode(SlapOSTestCaseMixin):
self.tic() self.tic()
self.assertRaises(NotImplementedError, person.requestComputeNode, self.assertRaises(NotImplementedError, person.requestComputeNode,
project_reference=self.project.getReference(),
compute_node_title=compute_node_title) compute_node_title=compute_node_title)
class TestSlapOSCorePersonRequestProject(SlapOSTestCaseMixin):
def generateNewProjectTitle(self):
return 'My Project %s' % self.generateNewId()
def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson()
self.tic()
# Login as new user
self.login(person_user.getUserId())
new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
def beforeTearDown(self):
pass
def test_Person_requestProject_title_is_mandatoty(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertRaises(TypeError, person.requestProject)
def test_Person_requestProject(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
project_title = self.generateNewProjectTitle()
person.requestProject(project_title=project_title)
self.tic()
self.login()
# check what is returned via request
project_relative_url = person.REQUEST.get('project_relative_url')
project_reference = person.REQUEST.get('project_reference')
self.assertNotEqual(None, project_relative_url)
self.assertNotEqual(None, project_reference)
project = person.restrictedTraverse(project_relative_url)
self.assertEqual(project.getTitle(), project_title)
self.assertEqual(project.getValidationState(), "validated")
self.assertEqual(project.getDestinationDecision(), person.getRelativeUrl())
def test_Person_requestProject_duplicated(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
project_title = self.generateNewProjectTitle()
person.requestProject(project_title=project_title)
self.tic()
self.login()
# check what is returned via request
project_relative_url = person.REQUEST.get('project_relative_url')
project_reference = person.REQUEST.get('project_reference')
self.assertNotEqual(None, project_relative_url)
self.assertNotEqual(None, project_reference)
project = person.restrictedTraverse(project_relative_url)
self.assertEqual(project.getTitle(), project_title)
self.assertEqual(project.getValidationState(), "validated")
self.assertEqual(project.getDestinationDecision(), person.getRelativeUrl())
project2 = project.Base_createCloneDocument(batch_mode=1)
project2.validate()
self.tic()
self.login(person.getUserId())
self.assertRaises(NotImplementedError, person.requestProject,
project_title=project_title)
def test_Person_requestProject_request_again(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
project_title = self.generateNewProjectTitle()
person.requestProject(project_title=project_title)
# check what is returned via request
project_relative_url = person.REQUEST.get('project_relative_url')
project_reference = person.REQUEST.get('project_reference')
self.assertNotEqual(None, project_relative_url)
self.assertNotEqual(None, project_reference)
self.tic()
self.login()
# check what is returned via request
person.REQUEST.set('project_relative_url', None)
person.REQUEST.set('project_reference', None)
self.login(person.getUserId())
person.requestProject(project_title=project_title)
# check what is returned via request
same_project_relative_url = person.REQUEST.get('project_relative_url')
same_project_reference = person.REQUEST.get('project_reference')
self.assertEqual(same_project_relative_url, project_relative_url)
self.assertEqual(same_project_reference, project_reference)
class TestSlapOSCorePersonRequestOrganisation(SlapOSTestCaseMixin):
def generateNewOrganisationTitle(self):
return 'My Organisation %s' % self.generateNewId()
def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson()
self.tic()
# Login as new user
self.login(person_user.getUserId())
new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
def beforeTearDown(self):
pass
def test_Person_requestOrganisation_title_is_mandatoty(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertRaises(TypeError, person.requestOrganisation)
def test_Person_requestOrganisation(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
organisation_title = self.generateNewOrganisationTitle()
person.requestOrganisation(organisation_title=organisation_title)
self.tic()
self.login()
# check what is returned via request
organisation_relative_url = person.REQUEST.get('organisation_relative_url')
self.assertNotEqual(None, organisation_relative_url)
organisation = person.restrictedTraverse(organisation_relative_url)
self.assertEqual(organisation.getTitle(), organisation_title)
self.assertEqual(organisation.getValidationState(), "validated")
self.assertEqual(organisation.getRoleId(), "client")
self.assertIn("O-", organisation.getReference())
def test_Person_requestOrganisation_duplicated(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
organisation_title = self.generateNewOrganisationTitle()
person.requestOrganisation(organisation_title=organisation_title)
self.tic()
self.login()
# check what is returned via request
organisation_relative_url = person.REQUEST.get('organisation_relative_url')
self.assertNotEqual(None, organisation_relative_url)
organisation = person.restrictedTraverse(organisation_relative_url)
self.assertEqual(organisation.getTitle(), organisation_title)
self.assertEqual(organisation.getValidationState(), "validated")
self.assertEqual(organisation.getRoleId(), "client")
self.assertIn("O-", organisation.getReference())
organisation2 = organisation.Base_createCloneDocument(batch_mode=1)
organisation2.validate()
self.tic()
self.login(person.getUserId())
self.assertRaises(NotImplementedError, person.requestOrganisation,
organisation_title=organisation_title)
def test_Person_requestOrganisation_request_again(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
organisation_title = self.generateNewOrganisationTitle()
person.requestOrganisation(organisation_title=organisation_title)
# check what is returned via request
organisation_relative_url = person.REQUEST.get('organisation_relative_url')
self.assertNotEqual(None, organisation_relative_url)
self.tic()
self.login()
# check what is returned via request
person.REQUEST.set('organisation_relative_url', None)
self.login(person.getUserId())
person.requestOrganisation(organisation_title=organisation_title)
# check what is returned via request
same_organisation_relative_url = person.REQUEST.get('organisation_relative_url')
self.assertEqual(same_organisation_relative_url, organisation_relative_url)
def test_Person_requestOrganisation_dont_conflict_with_site(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
organisation_title = self.generateNewOrganisationTitle()
person.requestOrganisation(organisation_title=organisation_title)
self.tic()
self.login()
# check what is returned via request
organisation_relative_url = person.REQUEST.get('organisation_relative_url')
self.assertNotEqual(None, organisation_relative_url)
organisation = person.restrictedTraverse(organisation_relative_url)
self.assertEqual(organisation.getTitle(), organisation_title)
self.assertEqual(organisation.getValidationState(), "validated")
self.assertEqual(organisation.getRoleId(), "client")
self.assertIn("O-", organisation.getReference())
organisation2 = organisation.Base_createCloneDocument(batch_mode=1)
organisation2.edit(role="host")
organisation2.validate()
person.REQUEST.set('organisation_relative_url', None)
self.tic()
self.login(person.getUserId())
person.requestOrganisation(organisation_title=organisation_title)
self.tic()
self.login()
# check what is returned via request
same_organisation_relative_url = person.REQUEST.get('organisation_relative_url')
self.assertEqual(same_organisation_relative_url, organisation_relative_url)
class TestSlapOSCorePersonRequestSite(SlapOSTestCaseMixin): class TestSlapOSCorePersonRequestSite(SlapOSTestCaseMixin):
def generateNewOrganisationTitle(self): def generateNewOrganisationTitle(self):
...@@ -999,7 +825,8 @@ class TestSlapOSCorePersonRequestSite(SlapOSTestCaseMixin): ...@@ -999,7 +825,8 @@ class TestSlapOSCorePersonRequestSite(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson() self.project = self.addProject()
person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -1124,7 +951,8 @@ class TestSlapOSCorePersonRequestNetwork(SlapOSTestCaseMixin): ...@@ -1124,7 +951,8 @@ class TestSlapOSCorePersonRequestNetwork(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson() self.project = self.addProject()
person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -1218,7 +1046,8 @@ class TestSlapOSCorePersonRequestToken(SlapOSTestCaseMixin): ...@@ -1218,7 +1046,8 @@ class TestSlapOSCorePersonRequestToken(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
person_user = self.makePerson() self.project = self.addProject()
person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -1260,7 +1089,8 @@ class TestSlapOSCorePersonNotify(SlapOSTestCaseMixin): ...@@ -1260,7 +1089,8 @@ class TestSlapOSCorePersonNotify(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
self.person = self.makePerson() self.project = self.addProject()
self.person = self.makePerson(self.project)
self.tic() self.tic()
def beforeTearDown(self): def beforeTearDown(self):
...@@ -1276,7 +1106,7 @@ class TestSlapOSCorePersonNotify(SlapOSTestCaseMixin): ...@@ -1276,7 +1106,7 @@ class TestSlapOSCorePersonNotify(SlapOSTestCaseMixin):
support_request_title="a", support_request_description="b", aggregate="c") support_request_title="a", support_request_description="b", aggregate="c")
def test_Person_notify_computer_node(self): def test_Person_notify_computer_node(self):
compute_node, _ = self._makeComputeNode() compute_node, _ = self._makeComputeNode(self.project)
self._test_Person_notify(compute_node) self._test_Person_notify(compute_node)
def test_Person_notify_instance_tree(self): def test_Person_notify_instance_tree(self):
...@@ -1295,7 +1125,7 @@ class TestSlapOSCorePersonNotify(SlapOSTestCaseMixin): ...@@ -1295,7 +1125,7 @@ class TestSlapOSCorePersonNotify(SlapOSTestCaseMixin):
self._test_Person_notify(instance_tree) self._test_Person_notify(instance_tree)
def test_Person_notify_software_installation(self): def test_Person_notify_software_installation(self):
self._makeComputeNode() self._makeComputeNode(self.project)
software_installation = self.portal\ software_installation = self.portal\
.software_installation_module.template_software_installation\ .software_installation_module.template_software_installation\
.Base_createCloneDocument(batch_mode=1) .Base_createCloneDocument(batch_mode=1)
......
...@@ -26,9 +26,9 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -26,9 +26,9 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin):
def afterSetUp(self): def afterSetUp(self):
SlapOSTestCaseMixin.afterSetUp(self) SlapOSTestCaseMixin.afterSetUp(self)
portal = self.getPortalObject() self.project = self.addProject()
person_user = self.makePerson() person_user = self.makePerson(self.project)
self.tic() self.tic()
# Login as new user # Login as new user
...@@ -37,9 +37,6 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -37,9 +37,6 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin):
new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl()) self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
self.project = portal.project_module.newContent(
portal_type="Project"
)
# Value set by the init # Value set by the init
self.assertTrue(self.project.getReference().startswith("PROJ-"), self.assertTrue(self.project.getReference().startswith("PROJ-"),
"Reference don't start with PROJ- : %s" % self.project.getReference()) "Reference don't start with PROJ- : %s" % self.project.getReference())
...@@ -48,62 +45,16 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -48,62 +45,16 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin):
def beforeTearDown(self): def beforeTearDown(self):
transaction.abort() transaction.abort()
def test_project_approveRegistration_no_reference(self):
self.project.setReference(None)
self.assertRaises(ValueError, self.project.approveRegistration)
def test_project_approveRegistration_already_validated(self):
# Login as admin since user cannot re-approve a validated project
self.login()
self.project.setReference(None)
self.project.validate()
# Don't raise if project is validated
self.assertEqual(self.project.approveRegistration(), None)
def test_project_approveRegistration(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.project.approveRegistration()
self.tic()
self.logout()
self.login(person.getUserId())
self.assertEqual(self.project.getValidationState(),
'validated')
self.assertNotEqual(self.project.getStartDate(),
None)
assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationProjectValue() == self.project]
self.assertEqual(len(assignment_list), 1)
self.assertEqual(assignment_list[0].getValidationState(), 'open')
self.assertIn("Assigment for Project ", assignment_list[0].getTitle())
def test_project_leaveProject_no_user(self): def test_project_leaveProject_no_user(self):
self.login() self.login()
self.assertRaises(Unauthorized, self.project.leaveProject) self.assertRaises(Unauthorized, self.project.leaveProject)
def test_project_leaveProject_owner(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.project.edit(destination_decision=person.getRelativeUrl())
self.tic()
self.project.leaveProject()
self.assertEqual(self.project.getDestinationDecision(),
None)
def test_project_leaveProject_after_join(self): def test_project_leaveProject_after_join(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
# Just make things fast, by using the API tested above
self.project.approveRegistration()
self.tic()
self.logout() self.logout()
self.login(person.getUserId()) self.login(person.getUserId())
...@@ -173,8 +124,6 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin): ...@@ -173,8 +124,6 @@ class TestSlapOSCoreProjectSlapInterfaceWorkflow(SlapOSTestCaseMixin):
def test_project_acceptInvitation_already_member(self): def test_project_acceptInvitation_already_member(self):
person = self.portal.portal_membership.getAuthenticatedMember().getUserValue() person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
self.project.approveRegistration()
self.tic()
self.login() self.login()
assignment_list = [i for i in person.objectValues(portal_type="Assignment") assignment_list = [i for i in person.objectValues(portal_type="Assignment")
if i.getDestinationProjectValue() == self.project] if i.getDestinationProjectValue() == self.project]
......
...@@ -6,12 +6,6 @@ ...@@ -6,12 +6,6 @@
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>default_reference</string> </key> <key> <string>default_reference</string> </key>
<value> <string>testSlapOSCloudProjectSlapInterfaceWorkflow</string> </value> <value> <string>testSlapOSCloudProjectSlapInterfaceWorkflow</string> </value>
...@@ -61,28 +55,13 @@ ...@@ -61,28 +55,13 @@
<item> <item>
<key> <string>workflow_history</string> </key> <key> <string>workflow_history</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -95,7 +74,7 @@ ...@@ -95,7 +74,7 @@
<item> <item>
<key> <string>component_validation_workflow</string> </key> <key> <string>component_validation_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
...@@ -104,7 +83,7 @@ ...@@ -104,7 +83,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>source/portal_workflow/organisation_slap_interface_workflow/state_draft</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>person_slap_interface_workflow</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>organisation_slap_interface_workflow</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>manager_bypass</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow</string> </value>
</item>
<item>
<key> <string>state_variable</string> </key>
<value> <string>slap_state</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Organisation Slap Interface Workflow</string> </value>
</item>
<item>
<key> <string>workflow_managed_permission</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
organisation = state_change['object']
portal = organisation.getPortalObject()
person = portal.portal_membership.getAuthenticatedMember().getUserValue()
# Get required arguments
kwargs = state_change.kwargs
# Required args
# Raise TypeError if all parameters are not provided
try:
token_id = kwargs['invitation_token']
except KeyError:
raise TypeError("Organisation_acceptInvitation takes exactly 1 argument")
try:
invitation_token = portal.invitation_token_module[token_id]
except KeyError:
raise ValueError("The Invitation Token can't be found, please review the URL.")
if person is None:
message_str = "Please login before access the invitation link."
raise ValueError(message_str)
if invitation_token.getPortalType() != "Invitation Token":
message_str = "The Invitation Token can't be found, please review the URL."
raise ValueError(message_str)
if invitation_token.getValidationState() != "validated":
message_str = "The Invitation Token was already used and it cannot be reused, please ask a new one."
raise ValueError(message_str)
if invitation_token.getSourceValue() == person:
message_str = "Invitation Token cannot be used by the same user that generated the token!"
raise ValueError(message_str)
for assignment in person.objectValues(portal_type="Assignment"):
if assignment.getSubordination() == organisation.getRelativeUrl() and \
assignment.getValidationState() == "open":
invitation_token.invalidate(comment="User already has assignment to the Person")
break
if invitation_token.getValidationState() == "validated":
person.newContent(
title="Assigment for Organisation (%s) %s" % (organisation.getRole(), organisation.getTitle()),
portal_type="Assignment",
subordination_value=organisation,
destination_value=organisation).open()
invitation_token.invalidate()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>script_Organisation_acceptInvitation</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Script</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Organisation_acceptInvitation</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
organisation = state_change["object"]
portal = context.getPortalObject()
role = organisation.getRole()
if role == "host":
reference_prefix = "SITE"
else:
reference_prefix = "O"
if organisation.getReference() in [None, ""]:
reference = "%s-%s" % (reference_prefix, portal.portal_ids.generateNewId(
id_group='slap_organisation_reference',
id_generator='uid'))
organisation.setReference(reference)
if organisation.getValidationState() != "draft":
return
organisation.validate()
# Get the user id of the context owner.
local_role_list = organisation.get_local_roles()
for group, role_list in local_role_list:
if 'Owner' in role_list:
user_id = group
break
person = portal.portal_catalog.getResultValue(user_id=user_id)
if person is None:
# Value was created by super user, so there isn't a point on continue
return
for assignment in person.objectValues(portal_type="Assignment"):
if assignment.getSubordination() == organisation.getRelativeUrl():
if assignment.getValidationState() != "open":
assignment.open()
return
person.newContent(
title="Assigment for Organisation (%s) %s" % (organisation.getRole(), organisation.getTitle()),
portal_type="Assignment",
subordination_value=organisation,
destination_value=organisation).open()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>script_Organisation_approveRegistration</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Script</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Organisation_approveRegistration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>script_Organisation_checkConsistency</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Script</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
from zExceptions import Unauthorized
organisation = state_change['object']
portal = organisation.getPortalObject()
person = portal.portal_membership.getAuthenticatedMember().getUserValue()
if person is None:
raise Unauthorized
for assignment in person.objectValues(portal_type="Assignment"):
if assignment.getDestination() == organisation.getRelativeUrl():
assignment.close()
break
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>script_Organisation_leaveOrganisation</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Script</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow State" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>acquire_permission</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/portal_workflow/organisation_slap_interface_workflow/transition_accept_invitation</string>
<string>destination/portal_workflow/organisation_slap_interface_workflow/transition_approve_registration</string>
<string>destination/portal_workflow/organisation_slap_interface_workflow/transition_leave_organisation</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>state_draft</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow State</string> </value>
</item>
<item>
<key> <string>state_permission_role_list_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>state_type</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Draft</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>action_name</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/workflow</string>
<string>after_script/portal_workflow/organisation_slap_interface_workflow/script_Organisation_acceptInvitation</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_permission</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>transition_accept_invitation</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Accept Invitation</string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>action_name</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/workflow</string>
<string>before_script/portal_workflow/organisation_slap_interface_workflow/script_Organisation_checkConsistency</string>
<string>after_script/portal_workflow/organisation_slap_interface_workflow/script_Organisation_approveRegistration</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_permission</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>transition_approve_registration</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Approve Registration</string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>action_name</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/workflow</string>
<string>before_script/portal_workflow/organisation_slap_interface_workflow/script_Organisation_checkConsistency</string>
<string>after_script/portal_workflow/organisation_slap_interface_workflow/script_Organisation_leaveOrganisation</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_permission</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>transition_leave_organisation</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Leave Organisation</string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The last transition</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_action</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>variable_default_expression</string> </key>
<value> <string>transition/getReference|nothing</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The name of the user who performed the last transition</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_actor</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>variable_default_expression</string> </key>
<value> <string>user/getUserName</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Comments about the last transition</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_comment</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>variable_default_expression</string> </key>
<value> <string>python:state_change.kwargs.get(\'comment\', \'\')</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Error message if validation failed</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Provides access to workflow history</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_history</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>variable_default_expression</string> </key>
<value> <string>state_change/getHistory</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>portal type (use as filter for worklists)</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_portal_type</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Time of the last transition</string> </value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_time</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>variable_default_expression</string> </key>
<value> <string>state_change/getDateTime</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
person = state_change['object']
portal = person.getPortalObject()
# Get required arguments
kwargs = state_change.kwargs
# Required args
# Raise TypeError if all parameters are not provided
try:
project_title = kwargs['project_title']
except KeyError:
raise TypeError, "Person_requestProject takes exactly 1 argument"
tag = "%s_%s_ProjectInProgress" % (person.getUid(),
project_title)
if (portal.portal_activities.countMessageWithTag(tag) > 0):
# The software instance is already under creation but can not be fetched from catalog
# As it is not possible to fetch informations, it is better to raise an error
raise NotImplementedError(tag)
project_portal_type = "Project"
project_list = portal.portal_catalog.portal_catalog(
portal_type=project_portal_type, title=project_title, limit=2)
if len(project_list) == 2:
raise NotImplementedError
elif len(project_list) == 1:
context.REQUEST.set("project_relative_url", project_list[0].getRelativeUrl())
context.REQUEST.set("project_reference", project_list[0].getReference())
else:
module = portal.getDefaultModule(portal_type=project_portal_type)
project = module.newContent(
portal_type=project_portal_type,
title=project_title,
destination_decision_value=person,
activate_kw={'tag': tag}
)
context.REQUEST.set("project_relative_url", project.getRelativeUrl())
context.REQUEST.set("project_reference", project.getReference())
project.approveRegistration()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>script_Person_requestProject</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Script</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Person_requestProject</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
<string>destination/portal_workflow/person_slap_interface_workflow/transition_notify</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_notify</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_compute_node</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_compute_node</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_network</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_network</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_project</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_site</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_site</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_software_instance</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_software_instance</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_support</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_support</string>
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
<string>destination/portal_workflow/person_slap_interface_workflow/transition_notify</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_notify</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_compute_node</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_compute_node</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_network</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_network</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_project</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_site</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_site</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_software_instance</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_software_instance</string>
<string>destination/portal_workflow/person_slap_interface_workflow/transition_request_support</string> <string>destination/portal_workflow/person_slap_interface_workflow/transition_request_support</string>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>action_name</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/workflow</string>
<string>before_script/portal_workflow/person_slap_interface_workflow/script_Person_checkConsistency</string>
<string>after_script/portal_workflow/person_slap_interface_workflow/script_Person_requestProject</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_permission</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>transition_request_project</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Request Project</string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -35,6 +35,7 @@ if invitation_token.getSourceValue() == person: ...@@ -35,6 +35,7 @@ if invitation_token.getSourceValue() == person:
for assignment in person.objectValues(portal_type="Assignment"): for assignment in person.objectValues(portal_type="Assignment"):
if assignment.getDestinationProject() == project.getRelativeUrl() and \ if assignment.getDestinationProject() == project.getRelativeUrl() and \
assignment.getFunction() == 'customer' and \
assignment.getValidationState() == "open": assignment.getValidationState() == "open":
invitation_token.invalidate(comment="User already has assignment to the Person") invitation_token.invalidate(comment="User already has assignment to the Person")
break break
...@@ -43,6 +44,7 @@ if invitation_token.getValidationState() == "validated": ...@@ -43,6 +44,7 @@ if invitation_token.getValidationState() == "validated":
person.newContent( person.newContent(
title="Assigment for Project %s" % project.getTitle(), title="Assigment for Project %s" % project.getTitle(),
portal_type="Assignment", portal_type="Assignment",
function='customer',
destination_project_value=project).open() destination_project_value=project).open()
invitation_token.invalidate() invitation_token.invalidate()
project = state_change["object"]
from DateTime import DateTime
portal = context.getPortalObject()
if project.getValidationState() != "draft":
return
if project.getReference() in [None, ""]:
raise ValueError("Reference is missing on the Project")
# Get the user id of the context owner.
local_role_list = project.get_local_roles()
for group, role_list in local_role_list:
if 'Owner' in role_list:
user_id = group
break
person = portal.portal_catalog.getResultValue(user_id=user_id)
if person is None:
# Value was created by super user, so there isn't a point on continue
return
for assignment in person.objectValues(portal_type="Assignment"):
if assignment.getDestinationProject() == project.getRelativeUrl():
if assignment.getValidationState() != "open":
assignment.open()
return
person.newContent(
title="Assigment for Project %s" % project.getTitle(),
portal_type="Assignment",
destination_project=project.getRelativeUrl()).open()
project.edit(start_date=DateTime())
project.validate()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>script_Project_approveRegistration</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Script</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Project_approveRegistration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -6,11 +6,8 @@ person = portal.portal_membership.getAuthenticatedMember().getUserValue() ...@@ -6,11 +6,8 @@ person = portal.portal_membership.getAuthenticatedMember().getUserValue()
if person is None: if person is None:
raise Unauthorized raise Unauthorized
if project.getDestinationDecision() == person.getRelativeUrl():
project.setDestinationDecision(None)
for assignment in person.objectValues(portal_type="Assignment"): for assignment in person.objectValues(portal_type="Assignment"):
# Close all user assignments (customer/admin/...) related to this project
if assignment.getDestinationProject() == project.getRelativeUrl() and \ if assignment.getDestinationProject() == project.getRelativeUrl() and \
assignment.getValidationState() != 'closed': assignment.getValidationState() != 'closed':
assignment.close() assignment.close()
break
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
<value> <value>
<tuple> <tuple>
<string>destination/portal_workflow/project_slap_interface_workflow/transition_accept_invitation</string> <string>destination/portal_workflow/project_slap_interface_workflow/transition_accept_invitation</string>
<string>destination/portal_workflow/project_slap_interface_workflow/transition_approve_registration</string>
<string>destination/portal_workflow/project_slap_interface_workflow/transition_leave_project</string> <string>destination/portal_workflow/project_slap_interface_workflow/transition_leave_project</string>
</tuple> </tuple>
</value> </value>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>action_name</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/workflow</string>
<string>before_script/portal_workflow/project_slap_interface_workflow/script_Project_checkConsistency</string>
<string>after_script/portal_workflow/project_slap_interface_workflow/script_Project_approveRegistration</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_permission</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>transition_approve_registration</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Approve Registration</string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -15,7 +15,6 @@ Instance Node | validation_workflow ...@@ -15,7 +15,6 @@ Instance Node | validation_workflow
Instance Tree | edit_workflow Instance Tree | edit_workflow
Instance Tree | instance_slap_interface_workflow Instance Tree | instance_slap_interface_workflow
Instance Tree | instance_tree_workflow Instance Tree | instance_tree_workflow
Organisation | organisation_slap_interface_workflow
Person | person_slap_interface_workflow Person | person_slap_interface_workflow
Project | project_slap_interface_workflow Project | project_slap_interface_workflow
Remote Node | compute_node_slap_interface_workflow Remote Node | compute_node_slap_interface_workflow
......
...@@ -8,7 +8,6 @@ test.erp5.testSlapOSCloudNetworkSlapInterfaceWorkflow ...@@ -8,7 +8,6 @@ test.erp5.testSlapOSCloudNetworkSlapInterfaceWorkflow
test.erp5.testSlapOSCloudComputeNodeSlapInterfaceWorkflow test.erp5.testSlapOSCloudComputeNodeSlapInterfaceWorkflow
test.erp5.testSlapOSCloudInstanceSlapInterfaceWorkflow test.erp5.testSlapOSCloudInstanceSlapInterfaceWorkflow
test.erp5.testSlapOSCloudProjectSlapInterfaceWorkflow test.erp5.testSlapOSCloudProjectSlapInterfaceWorkflow
test.erp5.testSlapOSCloudOrganisationSlapInterfaceWorkflow
test.erp5.testSlapOSCloudSecurityGroup test.erp5.testSlapOSCloudSecurityGroup
test.erp5.testSlapOSCloudConstraint test.erp5.testSlapOSCloudConstraint
test.erp5.testSlapOSCloudUpgrader test.erp5.testSlapOSCloudUpgrader
......
...@@ -5,7 +5,6 @@ installation_slap_interface_workflow ...@@ -5,7 +5,6 @@ installation_slap_interface_workflow
instance_slap_interface_workflow instance_slap_interface_workflow
instance_tree_workflow instance_tree_workflow
network_slap_interface_workflow network_slap_interface_workflow
organisation_slap_interface_workflow
person_slap_interface_workflow person_slap_interface_workflow
project_slap_interface_workflow project_slap_interface_workflow
slapos_cloud_interaction_workflow slapos_cloud_interaction_workflow
\ No newline at end of file
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