diff --git a/master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/SlaposCapacity/free_capacity_quantity_property.xml b/master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/SlaposCapacity/free_capacity_quantity_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f6f33effc64abe15dd210c2f4cf53805bda858f --- /dev/null +++ b/master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/SlaposCapacity/free_capacity_quantity_property.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + free_capacity_quantity_property + + + portal_type + Standard Property + + + property_default + python: 0 + + + + + diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseAllocableState.py b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseAllocableState.py deleted file mode 100644 index 3e05970f7a99b0bcd6f6f584d7879cd0d149bfce..0000000000000000000000000000000000000000 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseAllocableState.py +++ /dev/null @@ -1,27 +0,0 @@ -network = context - -# XXX - The use of current authenticated person will return always 'Close' if -# the person is administrator (such as 'zope' user) but not the owner of computer -# -# person = context.ERP5Site_getAuthenticatedMemberPersonValue() -allocation_state = 'Close' -software_type = '' -filter_kw = {} - -for computer in network.getSubordinationRelatedValueList(): - person = computer.getSourceAdministrationValue() - filter_kw['computer_guid']=computer.getReference() - try: - isAllowed = person.Person_restrictMethodAsShadowUser(shadow_document=person, - callable_object=person.Person_findPartition, - argument_list=[software_release_url, software_type, 'Software Instance', - filter_kw], - argument_dict={'test_mode': True} - ) - if isAllowed: - allocation_state = 'Open' - break - except: - continue - -return allocation_state diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseFreeAmount.py b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseFreeAmount.py new file mode 100644 index 0000000000000000000000000000000000000000..3f2d5355ddb7272743b4bc742863c8ff39dccf84 --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseFreeAmount.py @@ -0,0 +1,12 @@ +network = context +portal = context.getPortalObject() +software_release = context.REQUEST.get('here') +if software_release is None or software_release.portal_type != 'Software Release': + software_release = portal.portal_catalog.getResultValue( + portal_type='Software Release', + url_string=software_release_url, + ) + +return sum([computer.Computer_getSoftwareReleaseFreePartitionCount(software_release.getUrlString()) + for computer in network.getSubordinationRelatedValueList() + if computer.getAllocationScope() in ['open/public']]) diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseFreeAmount.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseFreeAmount.xml new file mode 100644 index 0000000000000000000000000000000000000000..9d854f007a005679097c4c58dea8148717a25441 --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseFreeAmount.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + software_release_url=None, debug=False + + + id + ComputerNetwork_getSoftwareReleaseFreeAmount + + + + + diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_checkAndUpdateCapacityScope.py b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_checkAndUpdateCapacityScope.py index e05d2501a904010524ec786f40ec0183b48311d5..10e3d61abdde4921752d8727be7fad0b021d8d99 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_checkAndUpdateCapacityScope.py +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_checkAndUpdateCapacityScope.py @@ -10,6 +10,7 @@ if computer.getAllocationScope() not in ['open/public', 'open/subscription']: return can_allocate = True +free_capacity = None comment = '' # First and simple way to see if computer is dead @@ -59,43 +60,20 @@ if can_allocate: software_release_capacity_dict = {} consumed_capacity = 0 - def getSoftwareReleaseCapacity(instance): + def getSoftwareInstanceCapacity(instance): software_release_url = instance.getUrlString() software_type = instance.getSourceReference() if software_release_url in software_release_capacity_dict: return software_release_capacity_dict[software_release_url] - software_release = portal.portal_catalog.getResultValue( - portal_type='Software Release', - url_string={'query': software_release_url, 'key': 'ExactMatch'}) - - software_release_capacity = None - if software_release is not None: - # Search for Software Product Individual Variation with same reference - software_product = software_release.getAggregateValue() - if software_product is not None: - for variation in software_product.searchFolder( - portal_type="Software Product Individual Variation", - reference=software_type): - software_release_capacity = variation.getCapacityQuantity(None) - if software_release_capacity is not None: - break - - if software_release_capacity is None: - software_release_capacity = software_product.getCapacityQuantity(None) - - if software_release_capacity is None: - software_release_capacity = software_release.getCapacityQuantity(1) - - if software_release_capacity is None: - software_release_capacity = 1 - + software_release_capacity = instance.SoftwareInstance_getCapacity() software_release_capacity_dict[software_release_url] = software_release_capacity + return software_release_capacity if allocated_instance is not None: - software_release_capacity = getSoftwareReleaseCapacity(allocated_instance) - consumed_capacity += software_release_capacity + software_instance_capacity = getSoftwareInstanceCapacity(allocated_instance) + consumed_capacity += software_instance_capacity if consumed_capacity >= computer_capacity_quantity: can_allocate = False comment = 'Computer capacity limit exceeded' @@ -106,13 +84,15 @@ if can_allocate: portal_type=['Software Instance', 'Slave Instance'], validation_state='validated'): - software_release_capacity = getSoftwareReleaseCapacity(instance.getObject()) - consumed_capacity += software_release_capacity + software_instance_capacity = getSoftwareInstanceCapacity(instance.getObject()) + consumed_capacity += software_instance_capacity if consumed_capacity >= computer_capacity_quantity: can_allocate = False comment = 'Computer capacity limit exceeded' break + free_capacity = computer_capacity_quantity - consumed_capacity + # if can_allocate: # result_list = portal.portal_catalog.portal_catalog( # parent_uid=computer.getUid(), @@ -123,15 +103,18 @@ if can_allocate: # can_allocate = False # comment = 'No free partition left' -new_value = None -if can_allocate: - if computer.getCapacityScope() == 'close': - new_value = 'open' -else: - if computer.getCapacityScope() == 'open': - new_value = 'close' - -if new_value is not None: - computer.edit(capacity_scope=new_value) +modified_data = {} + +capacity_scope = 'open' if can_allocate else 'close' +if computer.getCapacityScope() != capacity_scope: + modified_data['capacity_scope'] = capacity_scope + +if free_capacity is None or free_capacity < 0: + free_capacity = 0 +if computer.getFreeCapacityQuantity() != free_capacity: + modified_data['free_capacity_quantity'] = free_capacity + +if len(modified_data) > 0: + computer.edit(**modified_data) if comment: portal.portal_workflow.doActionFor(computer, 'edit_action', comment=comment) diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_getSoftwareReleaseFreePartitionCount.py b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_getSoftwareReleaseFreePartitionCount.py new file mode 100644 index 0000000000000000000000000000000000000000..0ab9af945574fa7e9ce9ac4a45e7c908a32b6a8d --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_getSoftwareReleaseFreePartitionCount.py @@ -0,0 +1,35 @@ +computer = context +# XXX: Temporary? +if computer.getAllocationScope() not in ['open/public']: + return 0 + +portal = context.getPortalObject() +software_release = context.REQUEST.get('here') +if software_release is None or software_release.portal_type != 'Software Release': + software_release = portal.portal_catalog.getResultValue( + portal_type='Software Release', + url_string=software_release_url, + ) + +software_release_capacity = software_release.SoftwareRelease_getCapacity() +computer_free_capacity = computer.getFreeCapacityQuantity() + +computer_instance_capacity = computer_free_capacity // software_release_capacity + +# If computer capacity is 0, it means infinite +# In this case, only the partition count will be counted +if computer.getCapacityQuantity() == 0: + computer_instance_capacity = float('inf') + +computer_free_partition_count = portal.portal_catalog.countResults( + parent_uid=computer.getUid(), + software_release_url=software_release.getUrlString(), + free_for_request=1, +)[0][0] + +free_instance_count = min( + computer_free_partition_count, + computer_instance_capacity +) + +return free_instance_count diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_getSoftwareReleaseFreePartitionCount.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_getSoftwareReleaseFreePartitionCount.xml new file mode 100644 index 0000000000000000000000000000000000000000..e58406d17c3f3de033ca502a60e67c16a2c389c6 --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_getSoftwareReleaseFreePartitionCount.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + software_release_url=None + + + id + Computer_getSoftwareReleaseFreePartitionCount + + + + + diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity.xml index 21766617fa05048b26552fd68147b0ccc187f677..6376e136d49fbdcee4efa22cdbbbd306041815c9 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity.xml @@ -96,6 +96,7 @@ my_title my_capacity_quantity my_capacity_scope_translated_title + my_free_capacity_quantity diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity/my_free_capacity_quantity.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity/my_free_capacity_quantity.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5a7d259d472d14ee8cc4b276f32805ae58e8b5f --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Computer_viewCapacity/my_free_capacity_quantity.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_free_capacity_quantity + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + editable + 0 + + + field_id + my_integer_value + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Free capacity + + + + + + + + diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_getCapacity.py b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_getCapacity.py new file mode 100644 index 0000000000000000000000000000000000000000..328d2293cabef11361eb0f2ace19752ecd6c8c20 --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_getCapacity.py @@ -0,0 +1,30 @@ +software_instance = context +portal = context.getPortalObject() + +software_type = software_instance.getSourceReference() +software_release_url = software_instance.getUrlString() +software_release = portal.portal_catalog.getResultValue( + portal_type='Software Release', + url_string={'query': software_release_url, 'key': 'ExactMatch'}) + +software_instance_capacity = None +if software_release is not None: + software_product = software_release.getAggregateValue() + + # Search for Software Product Individual Variation with same reference + software_product = software_release.getAggregateValue() + if software_product is not None: + for variation in software_product.searchFolder( + portal_type="Software Product Individual Variation", + reference=software_type): + software_instance_capacity = variation.getCapacityQuantity(None) + if software_instance_capacity is not None: + break + + if software_instance_capacity is None: + software_instance_capacity = software_release.SoftwareRelease_getCapacity() + +if software_instance_capacity is None: + software_instance_capacity = 1 + +return software_instance_capacity diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseAllocableState.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_getCapacity.xml similarity index 92% rename from master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseAllocableState.xml rename to master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_getCapacity.xml index ec658c3e65d38838070ff4262971a6ed149c300e..bfe09a03cd226d174b070b1ef0afb4a9963cac0d 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/ComputerNetwork_getSoftwareReleaseAllocableState.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_getCapacity.xml @@ -50,11 +50,11 @@ _params - software_release_url + id - ComputerNetwork_getSoftwareReleaseAllocableState + SoftwareInstance_getCapacity diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_getCapacity.py b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_getCapacity.py new file mode 100644 index 0000000000000000000000000000000000000000..b3efb03fa69100c3f700b759129e1566ed9d4db1 --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_getCapacity.py @@ -0,0 +1,9 @@ +software_release = context + +software_product = software_release.getAggregateValue() +software_release_capacity = software_product.getCapacityQuantity(None) + +if software_release_capacity is None: + software_release_capacity = software_release.getCapacityQuantity(1) + +return software_release_capacity diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_getCapacity.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_getCapacity.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc26d067035dec490ee8bc603e96d05ee0b1ae4f --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_getCapacity.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + + + + id + SoftwareRelease_getCapacity + + + + + diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList.xml index 89f43265f5fa42dbb329c8404bf061097268101b..7646b47d7409079c3aa060ddc65ed9c3f8698615 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList.xml @@ -94,6 +94,7 @@ listbox_free_partition listbox_amount + listbox_free_instance_partition_count diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox.xml index baecca81266b3db6c5dfa28d66f238244be90eea..b91e8c57b7f20b9075bb6efd6a6a281da108ecee 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox.xml @@ -134,6 +134,10 @@ free_partition Free Partition Count + + free_instance_partition_count + Free Software Instance Count + allocation_scope_translated_title Allocation Scope diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox_status.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox_free_instance_partition_count.xml similarity index 81% rename from master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox_status.xml rename to master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox_free_instance_partition_count.xml index ee38ba5fe73b3df66ce8f5146dbba0c5aa978bce..f5190cf2f45db7edda9310f5fd99b8cce802e31a 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox_status.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableComputerList/listbox_free_instance_partition_count.xml @@ -11,7 +11,6 @@ default - display_width editable title @@ -19,7 +18,7 @@ id - listbox_status + listbox_free_instance_partition_count message_values @@ -44,10 +43,6 @@ form_id - - target - - @@ -61,6 +56,10 @@ AAAAAAAAAAI= + + editable + + field_id @@ -70,7 +69,7 @@ - target + title @@ -84,29 +83,21 @@ default - - display_width - 20 - editable 0 field_id - my_string_field + my_integer_field form_id Base_viewFieldLibrary - - target - Click to edit the target - title - Status + Free Instances Partitions @@ -122,7 +113,7 @@ _text - python: cell.ComputerNetwork_getSoftwareReleaseAllocableState(context.REQUEST.get(\'here\').getUrlString()) + cell/Computer_getSoftwareReleaseFreePartitionCount diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList.xml index 95ece3a749ebb368481de8dda62b8e5e1acebea9..373b8e44af2b99c4f0f48c2c2136284ee3ce859e 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList.xml @@ -59,7 +59,7 @@ listbox_amount - listbox_status + listbox_free_instances_amount diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox.xml index 346b920adcec7aff156f91ca4309eb8ae6939d32..435b8483012f22255116ea473da8b27b269c818d 100644 --- a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox.xml +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox.xml @@ -93,8 +93,8 @@ Instances Amount - status - Allocation Status + free_instances_amount + Free Instances Amount (on public computers) diff --git a/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox_free_instances_amount.xml b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox_free_instances_amount.xml new file mode 100644 index 0000000000000000000000000000000000000000..01f9b72a00920c1a54843d8b6a6b436c19a0c440 --- /dev/null +++ b/master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareRelease_viewUsableNetworkList/listbox_free_instances_amount.xml @@ -0,0 +1,121 @@ + + + + + + + + + + delegated_list + + + default + editable + title + + + + + id + listbox_free_instances_amount + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + editable + + + + field_id + + + + form_id + + + + title + + + + + + + values + + + + default + + + + editable + 0 + + + field_id + my_integer_field + + + form_id + Base_viewFieldLibrary + + + title + Free Instances Amount + + + + + + + + + + + + + + + _text + cell/ComputerNetwork_getSoftwareReleaseFreeAmount + + + + +