Commit aa5e1094 authored by Cédric de Saint Martin's avatar Cédric de Saint Martin

Merge branch 'master' into cache

parents 845652db 6872ca03
...@@ -11,7 +11,12 @@ Changes ...@@ -11,7 +11,12 @@ Changes
(folder_id) (folder_id)
- only_cp filter which computer patition, will be runned. it can be a - only_cp filter which computer patition, will be runned. it can be a
list, splited by comman (slappartX,slappartY ...) [Rafael Monnerat] list, splited by comman (slappartX,slappartY ...) [Rafael Monnerat]
* Cleanup unused option (--usage-report-periodicity). [Cedric de Saint Martin] * slapgrid: Cleanup unused option (--usage-report-periodicity). [Cedric de
Saint Martin]
* slapgrid: --develop will work also for Computer Partitions. [Cedric de Saint
Martin]
* slaplib: setConnectionDict won't call Master if parameters haven't changed.
[Cedric de Saint Martin]
0.26.2 (2012-07-09) 0.26.2 (2012-07-09)
----------------- -----------------
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/int</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Used to inform client to update the instance.</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>bang_timestamp_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
468 469
\ No newline at end of file \ No newline at end of file
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</item> </item>
<item> <item>
<key> <string>enabled</string> </key> <key> <string>enabled</string> </key>
<value> <int>0</int> </value> <value> <int>1</int> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
\n \n
# Getting existing partitions\n # Getting existing partitions\n
existing_partition_dict = {}\n existing_partition_dict = {}\n
for c in context.contentValues():\n for c in context.contentValues(portal_type="Computer Partition"):\n
existing_partition_dict[c.getReference()] = c\n existing_partition_dict[c.getReference()] = c\n
\n \n
# update computer data\n # update computer data\n
...@@ -94,18 +94,31 @@ context.edit(\n ...@@ -94,18 +94,31 @@ context.edit(\n
)\n )\n
\n \n
compareAndUpdateAddressList(context, [{\'addr\': computer_dict[\'address\'], \'netmask\': computer_dict[\'netmask\']}])\n compareAndUpdateAddressList(context, [{\'addr\': computer_dict[\'address\'], \'netmask\': computer_dict[\'netmask\']}])\n
expected_partition_dict = {}\n
for send_partition in computer_dict[\'partition_list\']:\n for send_partition in computer_dict[\'partition_list\']:\n
partition = existing_partition_dict.get(send_partition[\'reference\'], None)\n partition = existing_partition_dict.get(send_partition[\'reference\'], None)\n
expected_partition_dict[send_partition[\'reference\']] = True\n
if partition is None:\n if partition is None:\n
partition = context.newContent(portal_type=\'Computer Partition\')\n partition = context.newContent(portal_type=\'Computer Partition\')\n
partition.validate()\n partition.validate()\n
partition.markFree()\n partition.markFree()\n
elif partition.getSlapState() == \'inactive\':\n elif partition.getSlapState() == \'inactive\':\n
# Reactivate partition\n # Reactivate partition\n
partition.markFree()\n partition.markFree(comment="Reactivated by slapformat")\n
\n
if partition.getValidationState() == "invalidated":\n
partition.validate(comment="Reactivated by slapformat")\n
partition.edit(reference=send_partition[\'reference\'])\n partition.edit(reference=send_partition[\'reference\'])\n
network_interface = send_partition[\'tap\'][\'name\']\n network_interface = send_partition[\'tap\'][\'name\']\n
compareAndUpdateAddressList(partition, send_partition[\'address_list\'], {\'network_interface\': network_interface})\n compareAndUpdateAddressList(partition, send_partition[\'address_list\'], {\'network_interface\': network_interface})\n
\n
# Desactivate all other partitions\n
for key, value in existing_partition_dict.items():\n
if key not in expected_partition_dict:\n
if value.getSlapState() == "free":\n
value.markInactive(comment="Desactivated by slapformat")\n
if value.getValidationState() == "validated":\n
value.invalidate(comment="Desactivated by slapformat")\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
......
...@@ -2,98 +2,97 @@ ...@@ -2,98 +2,97 @@
<ZopeData> <ZopeData>
<record id="1" aka="AAAAAAAAAAE="> <record id="1" aka="AAAAAAAAAAE=">
<pickle> <pickle>
<global name="Alarm" module="erp5.portal_type"/> <global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
<item> <item>
<key> <string>active_sense_method_id</string> </key> <key> <string>actbox_category</string> </key>
<value> <string>Alarm_searchInstanceAndRequestDestruction</string> </value> <value> <string>workflow</string> </value>
</item> </item>
<item> <item>
<key> <string>description</string> </key> <key> <string>actbox_name</string> </key>
<value> <string>Finds all instances related to archived hosting subscriptions and request their destruction.</string> </value> <value> <string></string> </value>
</item> </item>
<item> <item>
<key> <string>enabled</string> </key> <key> <string>actbox_url</string> </key>
<value> <int>1</int> </value> <value> <string></string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>activate_script_name</string> </key>
<value> <string>cleanup_archived_hs_instances</string> </value>
</item>
<item>
<key> <string>periodicity_hour</string> </key>
<value> <value>
<tuple/> <tuple/>
</value> </value>
</item> </item>
<item> <item>
<key> <string>periodicity_hour_frequency</string> </key> <key> <string>after_script_name</string> </key>
<value> <int>12</int> </value>
</item>
<item>
<key> <string>periodicity_minute</string> </key>
<value> <value>
<tuple/> <tuple/>
</value> </value>
</item> </item>
<item> <item>
<key> <string>periodicity_minute_frequency</string> </key> <key> <string>before_commit_script_name</string> </key>
<value> <value>
<none/> <list>
<string>Instance_changePromiseParameter</string>
</list>
</value> </value>
</item> </item>
<item> <item>
<key> <string>periodicity_month</string> </key> <key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value> <value>
<tuple/> <none/>
</value> </value>
</item> </item>
<item> <item>
<key> <string>periodicity_month_day</string> </key> <key> <string>id</string> </key>
<value> <string>change_instance_parameter</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value> <value>
<tuple/> <list>
<string>_setRootSoftwareReleaseUrl</string>
<string>_setTextContent</string>
<string>_setSourceReference</string>
<string>_setSlaXml</string>
</list>
</value> </value>
</item> </item>
<item> <item>
<key> <string>periodicity_start_date</string> </key> <key> <string>once_per_transaction</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value> <value>
<object> <list>
<klass> <string>Slave Instance</string>
<global name="DateTime" module="DateTime.DateTime"/> <string>Software Instance</string>
</klass> </list>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1288051200.0</float>
<string>GMT</string>
</tuple>
</state>
</object>
</value> </value>
</item> </item>
<item> <item>
<key> <string>periodicity_week</string> </key> <key> <string>script_name</string> </key>
<value> <value>
<tuple/> <tuple/>
</value> </value>
</item> </item>
<item> <item>
<key> <string>portal_type</string> </key> <key> <string>temporary_document_disallowed</string> </key>
<value> <string>Alarm</string> </value> <value> <int>1</int> </value>
</item> </item>
<item> <item>
<key> <string>sense_method_id</string> </key> <key> <string>title</string> </key>
<value> <value> <string></string> </value>
<none/>
</value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>trigger_type</string> </key>
<value> <string>Cleanup archived Hosting Subscription Instances</string> </value> <value> <int>2</int> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<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>_body</string> </key>
<value> <string>instance = state_change[\'object\']\n
instance.bang(bang_tree=False, comment="Parameter changed")\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Instance_changePromiseParameter</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
788 794
\ No newline at end of file \ No newline at end of file
portal_alarms/cleanup_archived_hs_instances
portal_alarms/confirm_ordered_sale_order portal_alarms/confirm_ordered_sale_order
portal_alarms/confirm_planned_sale_invoice_transaction portal_alarms/confirm_planned_sale_invoice_transaction
portal_alarms/deliver_subscription_sale_packing_list portal_alarms/deliver_subscription_sale_packing_list
......
...@@ -74,6 +74,7 @@ if (state in (started, stopped)):\n ...@@ -74,6 +74,7 @@ if (state in (started, stopped)):\n
new_delivery.start()\n new_delivery.start()\n
new_delivery.stop()\n new_delivery.stop()\n
new_delivery.deliver()\n new_delivery.deliver()\n
new_delivery.startBuilding()\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
......
...@@ -155,6 +155,7 @@ else:\n ...@@ -155,6 +155,7 @@ else:\n
packing_list.confirm()\n packing_list.confirm()\n
elif (state == destroyed):\n elif (state == destroyed):\n
packing_list.confirm()\n packing_list.confirm()\n
packing_list.startBuilding()\n
\n \n
elif delivery.getPortalType() == "Sale Packing List":\n elif delivery.getPortalType() == "Sale Packing List":\n
line_list = delivery.contentValues(portal_type="Sale Packing List Line")\n line_list = delivery.contentValues(portal_type="Sale Packing List Line")\n
......
...@@ -81,7 +81,6 @@ packing_list_line = packing_list.newContent(\n ...@@ -81,7 +81,6 @@ packing_list_line = packing_list.newContent(\n
)\n )\n
\n \n
\n \n
packing_list.startBuilding()\n
return packing_list\n return packing_list\n
</string> </value> </string> </value>
</item> </item>
......
23 24
\ No newline at end of file \ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<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>_body</string> </key>
<value> <string>instance = state_change[\'object\']\n
if (instance.getPortalType() in ["Software Instance", "Slave Instance"]) and (instance.getSlapState() != \'destroy_requested\'):\n
instance.bang(bang_tree=False, comment="State changed from %s to destroy_requested" % instance.getSlapState())\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>RequestedInstance_bangIfStateChangeToDestroyed</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<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>_body</string> </key>
<value> <string>instance = state_change[\'object\']\n
if (instance.getPortalType() in ["Software Instance", "Slave Instance"]) and (instance.getSlapState() != \'start_requested\'):\n
instance.bang(bang_tree=False, comment="State changed from %s to start_requested" % instance.getSlapState())\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>RequestedInstance_bangIfStateChangeToStarted</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<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>_body</string> </key>
<value> <string>instance = state_change[\'object\']\n
if (instance.getPortalType() in ["Software Instance", "Slave Instance"]) and (instance.getSlapState() != \'stop_requested\'):\n
instance.bang(bang_tree=False, comment="State changed from %s to stop_requested" % instance.getSlapState())\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>RequestedInstance_bangIfStateChangeToStopped</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -50,9 +50,12 @@ ...@@ -50,9 +50,12 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>instance = state_change[\'object\']\n <value> <string>from DateTime import DateTime\n
instance = state_change[\'object\']\n
assert instance.getPortalType() in ["Slave Instance", "Software Instance"]\n assert instance.getPortalType() in ["Slave Instance", "Software Instance"]\n
\n \n
instance.edit(bang_timestamp=int(DateTime()))\n
\n
if state_change.kwargs[\'bang_tree\']:\n if state_change.kwargs[\'bang_tree\']:\n
from Products.ZSQLCatalog.SQLCatalog import Query, NegatedQuery\n from Products.ZSQLCatalog.SQLCatalog import Query, NegatedQuery\n
portal = instance.getPortalObject()\n portal = instance.getPortalObject()\n
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
<key> <string>transitions</string> </key> <key> <string>transitions</string> </key>
<value> <value>
<tuple> <tuple>
<string>bang</string>
<string>request_start</string> <string>request_start</string>
<string>request_stop</string> <string>request_stop</string>
</tuple> </tuple>
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
</item> </item>
<item> <item>
<key> <string>script_name</string> </key> <key> <string>script_name</string> </key>
<value> <string></string> </value> <value> <string>RequestedInstance_bangIfStateChangeToDestroyed</string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
</item> </item>
<item> <item>
<key> <string>script_name</string> </key> <key> <string>script_name</string> </key>
<value> <string></string> </value> <value> <string>RequestedInstance_bangIfStateChangeToStarted</string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
</item> </item>
<item> <item>
<key> <string>script_name</string> </key> <key> <string>script_name</string> </key>
<value> <string></string> </value> <value> <string>RequestedInstance_bangIfStateChangeToStopped</string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
41 42
\ No newline at end of file \ No newline at end of file
...@@ -143,15 +143,23 @@ class SlapTool(BaseTool): ...@@ -143,15 +143,23 @@ class SlapTool(BaseTool):
""" """
def _getComputerInformation(computer_id, user): def _getComputerInformation(computer_id, user):
user_document = self.getPortalObject().portal_catalog.getResultValue(
reference=user, portal_type=['Person', 'Computer', 'Software Instance'])
user_type = user_document.getPortalType()
self.REQUEST.response.setHeader('Content-Type', 'text/xml') self.REQUEST.response.setHeader('Content-Type', 'text/xml')
slap_computer = Computer(computer_id) slap_computer = Computer(computer_id)
parent_uid = self._getComputerUidByReference(computer_id) parent_uid = self._getComputerUidByReference(computer_id)
slap_computer._computer_partition_list = [] slap_computer._computer_partition_list = []
slap_computer._software_release_list = \ if user_type == 'Computer':
slap_computer._software_release_list = \
self._getSoftwareReleaseValueListForComputer(computer_id) self._getSoftwareReleaseValueListForComputer(computer_id)
else:
slap_computer._software_release_list = []
for computer_partition in self.getPortalObject().portal_catalog( for computer_partition in self.getPortalObject().portal_catalog(
parent_uid=parent_uid, parent_uid=parent_uid,
validation_state="validated",
portal_type="Computer Partition"): portal_type="Computer Partition"):
slap_computer._computer_partition_list.append( slap_computer._computer_partition_list.append(
self._getSlapPartitionByPackingList(computer_partition.getObject())) self._getSlapPartitionByPackingList(computer_partition.getObject()))
...@@ -171,19 +179,31 @@ class SlapTool(BaseTool): ...@@ -171,19 +179,31 @@ class SlapTool(BaseTool):
Reuses slap library for easy marshalling. Reuses slap library for easy marshalling.
""" """
self.REQUEST.response.setHeader('Content-Type', 'text/xml') def _getFullComputerInformation(computer_id, user):
slap_computer = Computer(computer_id) user_document = self.getPortalObject().portal_catalog.getResultValue(
parent_uid = self._getComputerUidByReference(computer_id) reference=user, portal_type=['Person', 'Computer', 'Software Instance'])
user_type = user_document.getPortalType()
slap_computer._computer_partition_list = [] self.REQUEST.response.setHeader('Content-Type', 'text/xml')
slap_computer._software_release_list = \ slap_computer = Computer(computer_id)
self._getSoftwareReleaseValueListForComputer(computer_id, full=True) parent_uid = self._getComputerUidByReference(computer_id)
for computer_partition in self.getPortalObject().portal_catalog(
parent_uid=parent_uid, slap_computer._computer_partition_list = []
portal_type="Computer Partition"): if user_type == 'Computer':
slap_computer._computer_partition_list.append( slap_computer._software_release_list = \
self._getSlapPartitionByPackingList(computer_partition.getObject())) self._getSoftwareReleaseValueListForComputer(computer_id, full=True)
return xml_marshaller.xml_marshaller.dumps(slap_computer) else:
slap_computer._software_release_list = []
for computer_partition in self.getPortalObject().portal_catalog(
parent_uid=parent_uid,
validation_state="validated",
portal_type="Computer Partition"):
slap_computer._computer_partition_list.append(
self._getSlapPartitionByPackingList(computer_partition.getObject()))
return xml_marshaller.xml_marshaller.dumps(slap_computer)
user = self.getPortalObject().portal_membership.getAuthenticatedMember().getUserName()
return CachingMethod(_getFullComputerInformation,
id='_getFullComputerInformation',
cache_factory='slap_cache_factory')(computer_id, user)
security.declareProtected(Permissions.AccessContentsInformation, security.declareProtected(Permissions.AccessContentsInformation,
'getComputerPartitionCertificate') 'getComputerPartitionCertificate')
...@@ -428,11 +448,64 @@ class SlapTool(BaseTool): ...@@ -428,11 +448,64 @@ class SlapTool(BaseTool):
""" """
# Try to get the computer partition to raise an exception if it doesn't # Try to get the computer partition to raise an exception if it doesn't
# exist # exist
self._getComputerPartitionDocument( portal = self.getPortalObject()
computer_partition_document = self._getComputerPartitionDocument(
computer_reference, computer_partition_reference) computer_reference, computer_partition_reference)
return xml_marshaller.xml_marshaller.dumps( slap_partition = SlapComputerPartition(computer_reference,
SlapComputerPartition(computer_reference, computer_partition_reference)
computer_partition_reference)) slap_partition._software_release_document = None
slap_partition._requested_state = 'destroyed'
slap_partition._need_modification = 0
software_instance = None
if computer_partition_document.getSlapState() == 'busy':
software_instance_list = portal.portal_catalog(
portal_type="Software Instance",
default_aggregate_uid=computer_partition_document.getUid(),
validation_state="validated",
limit=2,
)
software_instance_count = len(software_instance_list)
if software_instance_count == 1:
software_instance = software_instance_list[0].getObject()
elif software_instance_count > 1:
# XXX do not prevent the system to work if one partition is broken
raise NotImplementedError, "Too many instances %s linked to %s" % \
([x.path for x in software_instance_list],
computer_partition_document.getRelativeUrl())
if software_instance is not None:
# trick client side, that data has been synchronised already for given
# document
slap_partition._synced = True
state = software_instance.getSlapState()
if state == "stop_requested":
slap_partition._requested_state = 'stopped'
if state == "start_requested":
slap_partition._requested_state = 'started'
slap_partition._software_release_document = SoftwareRelease(
software_release=software_instance.getRootSoftwareReleaseUrl(),
computer_guid=computer_reference)
slap_partition._need_modification = 1
parameter_dict = self._getSoftwareInstanceAsParameterDict(
software_instance)
# software instance has to define an xml parameter
slap_partition._parameter_dict = self._instanceXmlToDict(
parameter_dict.pop('xml'))
slap_partition._connection_dict = self._instanceXmlToDict(
parameter_dict.pop('connection_xml'))
for slave_instance_dict in parameter_dict.get("slave_instance_list", []):
if slave_instance_dict.has_key("connection_xml"):
slave_instance_dict.update(self._instanceXmlToDict(
slave_instance_dict.pop("connection_xml")))
if slave_instance_dict.has_key("xml"):
slave_instance_dict.update(self._instanceXmlToDict(
slave_instance_dict.pop("xml")))
slap_partition._parameter_dict.update(parameter_dict)
return xml_marshaller.xml_marshaller.dumps(slap_partition)
#################################################### ####################################################
# Internal methods # Internal methods
...@@ -933,7 +1006,7 @@ class SlapTool(BaseTool): ...@@ -933,7 +1006,7 @@ class SlapTool(BaseTool):
computer_partition = software_instance.getAggregateValue(portal_type="Computer Partition") computer_partition = software_instance.getAggregateValue(portal_type="Computer Partition")
timestamp = int(computer_partition.getModificationDate()) timestamp = int(computer_partition.getModificationDate())
newtimestamp = int(software_instance.getModificationDate()) newtimestamp = int(software_instance.getBangTimestamp(int(software_instance.getModificationDate())))
if (newtimestamp > timestamp): if (newtimestamp > timestamp):
timestamp = newtimestamp timestamp = newtimestamp
...@@ -960,8 +1033,8 @@ class SlapTool(BaseTool): ...@@ -960,8 +1033,8 @@ class SlapTool(BaseTool):
'xml': slave_instance.getTextContent(), 'xml': slave_instance.getTextContent(),
'connection_xml': slave_instance.getConnectionXml(), 'connection_xml': slave_instance.getConnectionXml(),
}) })
newtimestamp = int(slave_instance.getModificationDate()) newtimestamp = int(slave_instance.getBangTimestamp(int(software_instance.getModificationDate())))
if (newtimestamp > timestamp): if (newtimestamp > timestamp):
timestamp = newtimestamp timestamp = newtimestamp
return { return {
'xml': software_instance.getTextContent(), 'xml': software_instance.getTextContent(),
...@@ -972,7 +1045,7 @@ class SlapTool(BaseTool): ...@@ -972,7 +1045,7 @@ class SlapTool(BaseTool):
'slap_software_release_url': software_instance.getRootSoftwareReleaseUrl(), 'slap_software_release_url': software_instance.getRootSoftwareReleaseUrl(),
'slave_instance_list': slave_instance_list, 'slave_instance_list': slave_instance_list,
'ip_list': ip_list, 'ip_list': ip_list,
'timestamp': "%s" % timestamp, 'timestamp': "%i" % timestamp,
} }
@UnrestrictedMethod @UnrestrictedMethod
......
...@@ -32,7 +32,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -32,7 +32,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
transaction_list = list(set(transaction_list)) transaction_list = list(set(transaction_list))
self.assertEquals(1, len(transaction_list)) self.assertEquals(1, len(transaction_list))
return transaction_list[0].getObject().getParentValue() return transaction_list[0].getObject()
def stepCheckRegistrationAccounting(self, sequence, **kw): def stepCheckRegistrationAccounting(self, sequence, **kw):
""" """
...@@ -481,7 +481,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -481,7 +481,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
# 1 invoice line is expected # 1 invoice line is expected
invoice_line_list = sale_invoice.contentValues( invoice_line_list = sale_invoice.contentValues(
portal_type="Invoice Line") portal_type="Invoice Line")
self.assertEquals(3, len(invoice_line_list)) self.assertEquals(4, len(invoice_line_list))
service_line = [x for x in invoice_line_list \ service_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_setup'][0] if x.getResource() == 'service_module/vifib_instance_setup'][0]
...@@ -489,6 +489,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -489,6 +489,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
if x.getResource() == 'service_module/vifib_instance_subscription'][0] if x.getResource() == 'service_module/vifib_instance_subscription'][0]
hosting_line = [x for x in invoice_line_list \ hosting_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_hosting'][0] if x.getResource() == 'service_module/vifib_instance_hosting'][0]
update_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_update'][0]
self.assertEquals(True, service_line.hasPrice()) self.assertEquals(True, service_line.hasPrice())
self.assertAlmostEquals(0, service_line.getPrice(), 3) self.assertAlmostEquals(0, service_line.getPrice(), 3)
...@@ -502,6 +504,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -502,6 +504,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
self.assertAlmostEquals(0, hosting_line.getPrice(), 3) self.assertAlmostEquals(0, hosting_line.getPrice(), 3)
self.assertEquals(1, hosting_line.getQuantity()) self.assertEquals(1, hosting_line.getQuantity())
self.assertEquals(True, update_line.hasPrice())
self.assertAlmostEquals(0, update_line.getPrice(), 3)
self.assertEquals(1, update_line.getQuantity())
# 0 transaction line # 0 transaction line
transaction_line_list = sale_invoice.contentValues( transaction_line_list = sale_invoice.contentValues(
portal_type="Sale Invoice Transaction Line") portal_type="Sale Invoice Transaction Line")
...@@ -567,7 +573,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -567,7 +573,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
# 1 invoice line is expected # 1 invoice line is expected
invoice_line_list = sale_invoice.contentValues( invoice_line_list = sale_invoice.contentValues(
portal_type="Invoice Line") portal_type="Invoice Line")
self.assertEquals(4, len(invoice_line_list)) self.assertEquals(5, len(invoice_line_list))
service_line = [x for x in invoice_line_list \ service_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_setup'][0] if x.getResource() == 'service_module/vifib_instance_setup'][0]
...@@ -577,6 +583,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -577,6 +583,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
if x.getResource() == 'service_module/vifib_instance_hosting'][0] if x.getResource() == 'service_module/vifib_instance_hosting'][0]
destroy_line = [x for x in invoice_line_list \ destroy_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_cleanup'][0] if x.getResource() == 'service_module/vifib_instance_cleanup'][0]
update_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_update'][0]
self.assertEquals(True, service_line.hasPrice()) self.assertEquals(True, service_line.hasPrice())
self.assertAlmostEquals(0, service_line.getPrice(), 3) self.assertAlmostEquals(0, service_line.getPrice(), 3)
...@@ -594,6 +602,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -594,6 +602,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
self.assertAlmostEquals(0, destroy_line.getPrice(), 3) self.assertAlmostEquals(0, destroy_line.getPrice(), 3)
self.assertEquals(1, destroy_line.getQuantity()) self.assertEquals(1, destroy_line.getQuantity())
self.assertEquals(True, update_line.hasPrice())
self.assertAlmostEquals(0, update_line.getPrice(), 3)
self.assertEquals(2, update_line.getQuantity())
# 0 transaction line # 0 transaction line
transaction_line_list = sale_invoice.contentValues( transaction_line_list = sale_invoice.contentValues(
portal_type="Sale Invoice Transaction Line") portal_type="Sale Invoice Transaction Line")
...@@ -612,7 +624,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -612,7 +624,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
portal_type="Sale Invoice Transaction", portal_type="Sale Invoice Transaction",
simulation_state="planned"): simulation_state="planned"):
invoice = invoice.getObject() invoice = invoice.getObject()
invoice.confirm() invoice.SaleInvoiceTransaction_confirmPlanned(
# force invoice confirmation (or moving to next month)
this_month=invoice.getStartDate() + 1
)
def stepCheckWaitingInvoice(self, sequence, **kw): def stepCheckWaitingInvoice(self, sequence, **kw):
""" """
...@@ -650,10 +665,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -650,10 +665,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
self.assertAlmostEquals( self.assertAlmostEquals(
1, sale_invoice.getTotalPrice(), 3) 1, sale_invoice.getTotalPrice(), 3)
# 5 invoice lines are expected # 6 invoice lines are expected
invoice_line_list = sale_invoice.contentValues( invoice_line_list = sale_invoice.contentValues(
portal_type="Invoice Line") portal_type="Invoice Line")
self.assertEquals(5, len(invoice_line_list)) self.assertEquals(6, len(invoice_line_list))
service_line = [x for x in invoice_line_list \ service_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_setup'][0] if x.getResource() == 'service_module/vifib_instance_setup'][0]
...@@ -663,6 +678,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -663,6 +678,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
if x.getResource() == 'service_module/vifib_instance_hosting'][0] if x.getResource() == 'service_module/vifib_instance_hosting'][0]
destroy_line = [x for x in invoice_line_list \ destroy_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_cleanup'][0] if x.getResource() == 'service_module/vifib_instance_cleanup'][0]
update_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_update'][0]
tax_line = [x for x in invoice_line_list \ tax_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_tax'][0] if x.getResource() == 'service_module/vifib_tax'][0]
...@@ -682,6 +699,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -682,6 +699,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
self.assertAlmostEquals(0, destroy_line.getPrice(), 3) self.assertAlmostEquals(0, destroy_line.getPrice(), 3)
self.assertEquals(1, destroy_line.getQuantity()) self.assertEquals(1, destroy_line.getQuantity())
self.assertEquals(True, update_line.hasPrice())
self.assertAlmostEquals(0, update_line.getPrice(), 3)
self.assertEquals(2, update_line.getQuantity())
self.assertEquals(True, tax_line.hasPrice()) self.assertEquals(True, tax_line.hasPrice())
self.assertAlmostEquals(0.196, tax_line.getPrice(), 3) self.assertAlmostEquals(0.196, tax_line.getPrice(), 3)
self.assertAlmostEquals(0.836, tax_line.getQuantity(), 3) self.assertAlmostEquals(0.836, tax_line.getQuantity(), 3)
...@@ -823,7 +844,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -823,7 +844,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
# 5 invoice lines are expected # 5 invoice lines are expected
invoice_line_list = sale_invoice.contentValues( invoice_line_list = sale_invoice.contentValues(
portal_type="Invoice Line") portal_type="Invoice Line")
self.assertEquals(5, len(invoice_line_list)) self.assertEquals(6, len(invoice_line_list))
service_line = [x for x in invoice_line_list \ service_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_setup'][0] if x.getResource() == 'service_module/vifib_instance_setup'][0]
...@@ -833,6 +854,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -833,6 +854,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
if x.getResource() == 'service_module/vifib_instance_hosting'][0] if x.getResource() == 'service_module/vifib_instance_hosting'][0]
destroy_line = [x for x in invoice_line_list \ destroy_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_cleanup'][0] if x.getResource() == 'service_module/vifib_instance_cleanup'][0]
update_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_update'][0]
tax_line = [x for x in invoice_line_list \ tax_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_tax'][0] if x.getResource() == 'service_module/vifib_tax'][0]
...@@ -852,6 +875,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -852,6 +875,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
self.assertAlmostEquals(0, destroy_line.getPrice(), 3) self.assertAlmostEquals(0, destroy_line.getPrice(), 3)
self.assertEquals(1, destroy_line.getQuantity()) self.assertEquals(1, destroy_line.getQuantity())
self.assertEquals(True, update_line.hasPrice())
self.assertAlmostEquals(0, update_line.getPrice(), 3)
self.assertEquals(2, update_line.getQuantity())
self.assertEquals(True, tax_line.hasPrice()) self.assertEquals(True, tax_line.hasPrice())
self.assertAlmostEquals(0.196, tax_line.getPrice(), 3) self.assertAlmostEquals(0.196, tax_line.getPrice(), 3)
self.assertAlmostEquals(0.836, tax_line.getQuantity(), 3) self.assertAlmostEquals(0.836, tax_line.getQuantity(), 3)
...@@ -1130,7 +1157,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -1130,7 +1157,7 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
# 5 invoice lines are expected # 5 invoice lines are expected
invoice_line_list = sale_invoice.contentValues( invoice_line_list = sale_invoice.contentValues(
portal_type="Invoice Line") portal_type="Invoice Line")
self.assertEquals(5, len(invoice_line_list)) self.assertEquals(6, len(invoice_line_list))
service_line = [x for x in invoice_line_list \ service_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_setup'][0] if x.getResource() == 'service_module/vifib_instance_setup'][0]
...@@ -1140,6 +1167,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -1140,6 +1167,8 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
if x.getResource() == 'service_module/vifib_instance_hosting'][0] if x.getResource() == 'service_module/vifib_instance_hosting'][0]
destroy_line = [x for x in invoice_line_list \ destroy_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_cleanup'][0] if x.getResource() == 'service_module/vifib_instance_cleanup'][0]
update_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_instance_update'][0]
tax_line = [x for x in invoice_line_list \ tax_line = [x for x in invoice_line_list \
if x.getResource() == 'service_module/vifib_tax'][0] if x.getResource() == 'service_module/vifib_tax'][0]
...@@ -1159,6 +1188,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin): ...@@ -1159,6 +1188,10 @@ class TestVifibDefaultUseCase(TestVifibSlapWebServiceMixin):
self.assertAlmostEquals(0, destroy_line.getPrice(), 3) self.assertAlmostEquals(0, destroy_line.getPrice(), 3)
self.assertEquals(2, destroy_line.getQuantity()) self.assertEquals(2, destroy_line.getQuantity())
self.assertEquals(True, update_line.hasPrice())
self.assertAlmostEquals(0, update_line.getPrice(), 3)
self.assertEquals(6, update_line.getQuantity())
self.assertEquals(True, tax_line.hasPrice()) self.assertEquals(True, tax_line.hasPrice())
self.assertAlmostEquals(0.196, tax_line.getPrice(), 3) self.assertAlmostEquals(0.196, tax_line.getPrice(), 3)
self.assertAlmostEquals(1.672, tax_line.getQuantity(), 3) self.assertAlmostEquals(1.672, tax_line.getQuantity(), 3)
......
...@@ -5,9 +5,9 @@ master_url = https://slap.vifib.com/ ...@@ -5,9 +5,9 @@ master_url = https://slap.vifib.com/
# Replace computer_id by the unique identifier of your computer on vifib.net, # Replace computer_id by the unique identifier of your computer on vifib.net,
# starting by COMP- # starting by COMP-
computer_id = COMP-12345 computer_id = COMP-12345
key_file = /etc/opt/slapos/key key_file = /etc/opt/slapos/ssl/computer.key
cert_file = /etc/opt/slapos/certificate cert_file = /etc/opt/slapos/ssl/computer.crt
certificate_repository_path = /etc/opt/slapos/pki/ certificate_repository_path = /etc/opt/slapos/ssl/partition_pki
[slapformat] [slapformat]
# Replace by your network interface like eth0, eth1, slapbr0... # Replace by your network interface like eth0, eth1, slapbr0...
......
...@@ -489,11 +489,12 @@ class ComputerPartition(SlapDocument): ...@@ -489,11 +489,12 @@ class ComputerPartition(SlapDocument):
return self._software_release_document return self._software_release_document
def setConnectionDict(self, connection_dict, slave_reference=None): def setConnectionDict(self, connection_dict, slave_reference=None):
self._connection_helper.POST('/setComputerPartitionConnectionXml', { if self.getConnectionParameterDict() != connection_dict:
'computer_id': self._computer_id, self._connection_helper.POST('/setComputerPartitionConnectionXml', {
'computer_partition_id': self._partition_id, 'computer_id': self._computer_id,
'connection_xml': xml_marshaller.dumps(connection_dict), 'computer_partition_id': self._partition_id,
'slave_reference': slave_reference}) 'connection_xml': xml_marshaller.dumps(connection_dict),
'slave_reference': slave_reference})
@_syncComputerPartitionInformation @_syncComputerPartitionInformation
def getInstanceParameter(self, key): def getInstanceParameter(self, key):
......
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