diff --git a/master/bt5/vifib_slapos_capacity/SkinTemplateItem/portal_skins/vifib_slapos_capacity/Computer_checkAndDesactivatePartitionList.xml b/master/bt5/vifib_slapos_capacity/SkinTemplateItem/portal_skins/vifib_slapos_capacity/Computer_checkAndDesactivatePartitionList.xml index 901a5d09cebcb70a283bd008ac3c56cca97f4156..eab23bb59342b6acfa5827f83303eaadde250ad7 100644 --- a/master/bt5/vifib_slapos_capacity/SkinTemplateItem/portal_skins/vifib_slapos_capacity/Computer_checkAndDesactivatePartitionList.xml +++ b/master/bt5/vifib_slapos_capacity/SkinTemplateItem/portal_skins/vifib_slapos_capacity/Computer_checkAndDesactivatePartitionList.xml @@ -55,13 +55,81 @@ computer = context\n portal = context.getPortalObject()\n \n +if computer.getAllocationScope() != \'open/public\':\n + # Don\'t update non public computer\n + return\n +\n +can_allocate = True\n +comment = \'\'\n +\n +# First and simple way to see if computer is dead\n modification_date = portal.portal_workflow.getInfoFor(computer, \'time\', wf_id=\'edit_workflow\')\n if (DateTime() - modification_date) > 1:\n # Computer didn\'t talk to vifib for 1 days, do not consider it as a trustable public server for now\n - for partition in computer.contentValues(portal_type="Computer Partition"):\n - if partition.getSlapState() == \'free\':\n - # Desactivate partition. A new partition will be created if the computer runs slapformat\n - partition.markInactive()\n + # slapformat is supposed to run at least once per day\n + can_allocate = False\n + comment = "Computer didn\'t contact the server for more than one day"\n +\n +if can_allocate:\n + # Check if computer has error reported\n + memcached_dict = portal.portal_memcached.getMemcachedDict(\n + key_prefix=\'slap_tool\',\n + plugin_path=\'portal_memcached/default_memcached_plugin\')\n + try:\n + d = memcached_dict[computer.getReference()]\n + except KeyError:\n + can_allocate = False\n + comment = "Computer didn\'t contact the server"\n + else:\n + log_dict = json.loads(d)\n + if \'#error\' in log_dict.get(\'text\', \'#error\'):\n + can_allocate = False\n + comment = \'Computer reported an error\'\n + # XXX TODO: compare creation date of #ok message\n +\n +if can_allocate:\n + # Check the computer capacity.\n + # there is a arbitrary hardcoded default value: not more than 20 instances on\n + # a computer\n + computer_capacity_quantity = computer.getCapacityQuantity(20)\n + software_release_capacity_dict = {}\n + consumed_capacity = 0\n +\n + for instance in portal.portal_catalog.portal_catalog(\n + default_aggregate_uid=computer.getUid(),\n + portal_type=[\'Software Instance\', \'Slave Instance\'],\n + validation_state=\'validated\'):\n +\n + instance = instance.getObject()\n +\n + software_release_url = instance.getRootSoftwareReleaseUrl()\n + if software_release_url in software_release_capacity_dict:\n + software_release_capacity = software_release_capacity_dict[software_release_url]\n + else:\n + delivery_line = instance.getCausalityValue().getMovementList[0]\n + software_release = delivery_line.getAggregateValue(portal_type=\'Software Release\')\n + if software_release:\n + software_release_capacity = software_release.getCapacityQuantity(1)\n + software_release_capacity_dict[software_release_url] = software_release_capacity\n +\n + consumed_capacity += software_release_capacity\n + if consumed_capacity >= computer_capacity_quantity:\n + can_allocate = False\n + comment = \'Computer capacity limit exceded\'\n + break\n +\n +new_value = None\n +if can_allocate:\n + if computer.getCapacityScope() == \'closed\':\n + new_value = \'open\'\n +else:\n + if computer.getCapacityScope() == \'open\':\n + new_value = \'closed\'\n +\n +if new_value is not None:\n + computer.edit(capacity_scope=new_value)\n + if comment:\n + portal.portal_workflow.doActionFor(computer, \'edit_action\', comment=comment)\n ]]></string> </value> diff --git a/master/bt5/vifib_slapos_capacity/bt/revision b/master/bt5/vifib_slapos_capacity/bt/revision index e440e5c842586965a7fb77deda2eca68612b1f53..bf0d87ab1b2b0ec1a11a3973d2845b42413d9767 100644 --- a/master/bt5/vifib_slapos_capacity/bt/revision +++ b/master/bt5/vifib_slapos_capacity/bt/revision @@ -1 +1 @@ -3 \ No newline at end of file +4 \ No newline at end of file