Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jérome Perrin
slapos.core
Commits
3c25d369
Commit
3c25d369
authored
Oct 29, 2013
by
Cédric de Saint Martin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[slapos_cloud] Add support for "unique_by_network" SLA mode.
parent
1f9ac435
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
340 additions
and
9 deletions
+340
-9
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Person_findPartition.xml
...teItem/portal_skins/slapos_cloud/Person_findPartition.xml
+11
-2
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_tryToAllocatePartition.xml
.../slapos_cloud/SoftwareInstance_tryToAllocatePartition.xml
+70
-6
master/bt5/slapos_cloud/TestTemplateItem/testSlapOSCloudAlarm.py
...bt5/slapos_cloud/TestTemplateItem/testSlapOSCloudAlarm.py
+259
-1
No files found.
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/Person_findPartition.xml
View file @
3c25d369
...
@@ -53,7 +53,7 @@
...
@@ -53,7 +53,7 @@
<value>
<string
encoding=
"cdata"
>
<![CDATA[
<value>
<string
encoding=
"cdata"
>
<![CDATA[
import random\n
import random\n
from Products.ZSQLCatalog.SQLCatalog import SimpleQuery\n
from Products.ZSQLCatalog.SQLCatalog import SimpleQuery
, ComplexQuery
\n
person = context\n
person = context\n
\n
\n
computer_partition = None\n
computer_partition = None\n
...
@@ -88,6 +88,15 @@ if \'network_guid\' in filter_kw:\n
...
@@ -88,6 +88,15 @@ if \'network_guid\' in filter_kw:\n
network_guid = filter_kw.pop(\'network_guid\')\n
network_guid = filter_kw.pop(\'network_guid\')\n
query_kw["default_subordination_reference"] = SimpleQuery(default_subordination_reference=network_guid)\n
query_kw["default_subordination_reference"] = SimpleQuery(default_subordination_reference=network_guid)\n
\n
\n
if computer_network_query:\n
if query_kw.get("default_subordination_reference"):\n
query_kw["default_subordination_reference"] = ComplexQuery(\n
query_kw["default_subordination_reference"],\n
computer_network_query\n
)\n
else:\n
query_kw["default_subordination_reference"] = computer_network_query\n
\n
computer_base_category_list = [\n
computer_base_category_list = [\n
\'group\',\n
\'group\',\n
\'cpu_core\',\n
\'cpu_core\',\n
...
@@ -161,7 +170,7 @@ return computer_partition.getRelativeUrl()\n
...
@@ -161,7 +170,7 @@ return computer_partition.getRelativeUrl()\n
</item>
</item>
<item>
<item>
<key>
<string>
_params
</string>
</key>
<key>
<string>
_params
</string>
</key>
<value>
<string>
software_release_url, software_type, software_instance_portal_type, filter_kw, test_mode=False
</string>
</value>
<value>
<string>
software_release_url, software_type, software_instance_portal_type, filter_kw,
computer_network_query=None,
test_mode=False
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
id
</string>
</key>
<key>
<string>
id
</string>
</key>
...
...
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/slapos_cloud/SoftwareInstance_tryToAllocatePartition.xml
View file @
3c25d369
...
@@ -50,7 +50,10 @@
...
@@ -50,7 +50,10 @@
</item>
</item>
<item>
<item>
<key>
<string>
_body
</string>
</key>
<key>
<string>
_body
</string>
</key>
<value>
<string>
from Products.DCWorkflow.DCWorkflow import ValidationFailed\n
<value>
<string
encoding=
"cdata"
>
<![CDATA[
from Products.DCWorkflow.DCWorkflow import ValidationFailed\n
from Products.ZSQLCatalog.SQLCatalog import SimpleQuery, ComplexQuery\n
from zExceptions import Unauthorized\n
from zExceptions import Unauthorized\n
\n
\n
if context.getPortalType() not in (\'Software Instance\', \'Slave Instance\'):\n
if context.getPortalType() not in (\'Software Instance\', \'Slave Instance\'):\n
...
@@ -63,7 +66,7 @@ def markHistory(document, comment):\n
...
@@ -63,7 +66,7 @@ def markHistory(document, comment):\n
if last_workflow_item != comment:\n
if last_workflow_item != comment:\n
portal_workflow.doActionFor(document, action=\'edit_action\', comment=comment)\n
portal_workflow.doActionFor(document, action=\'edit_action\', comment=comment)\n
\n
\n
def assignComputerPartition(software_instance):\n
def assignComputerPartition(software_instance
, hosting_subscription
):\n
computer_partition = software_instance.getAggregateValue(\n
computer_partition = software_instance.getAggregateValue(\n
portal_type="Computer Partition")\n
portal_type="Computer Partition")\n
if computer_partition is None:\n
if computer_partition is None:\n
...
@@ -75,18 +78,66 @@ def assignComputerPartition(software_instance):\n
...
@@ -75,18 +78,66 @@ def assignComputerPartition(software_instance):\n
if not person.Person_isAllowedToAllocate():\n
if not person.Person_isAllowedToAllocate():\n
raise Unauthorized(\'Allocation disallowed\')\n
raise Unauthorized(\'Allocation disallowed\')\n
\n
\n
tag = None\n
try:\n
try:\n
sla_dict = software_instance.getSlaXmlAsDict()\n
sla_dict = software_instance.getSlaXmlAsDict()\n
except Exception:\n
except Exception:\n
# Note: it is impossible to import module exceptions from python scripts\n
# Note: it is impossible to import module exceptions from python scripts\n
computer_partition_relative_url = None\n
computer_partition_relative_url = None\n
else:\n
else:\n
\n
# "Each instance should be allocated to a different network." (i.e at most one instance of the tree per network)\n
computer_network_query = None\n
if sla_dict.get(\'mode\', None) == \'unique_by_network\':\n
# Prevent creating two instances in the same computer_network\n
hosting_subscription_uid = hosting_subscription.getUid()\n
tag = "%s_inProgress" % hosting_subscription_uid\n
if (context.getPortalObject().portal_activities.countMessageWithTag(tag) >
0):\n
# The software instance is already under creation but can not be fetched from catalog\n
# As it is not possible to fetch informations, just ignore\n
markHistory(software_instance,\n
\'Allocation failed: blocking activites in progress for %s\' % hosting_subscription_uid)\n
\n
sla_dict.pop(\'mode\')\n
# XXX: does NOT scale if hosting subscription contains many SoftwareInstance\n
hosting_subscription = software_instance.getSpecialiseValue()\n
software_instance_tree_list = [sql_obj.getObject() \\\n
for sql_obj in context.getPortalObject().portal_catalog(\n
portal_type=[\'Software Instance\', \'Slave Instance\'],\n
default_specialise_uid=hosting_subscription.getUid(),\n
)\n
]\n
computer_network_query_list = []\n
# Don\'t deploy in computer with no network\n
computer_network_query_list.append(ComplexQuery(\n
SimpleQuery(\n
default_subordination_uid=\'\'),\n
logical_operator=\'not\',\n
))\n
for software_instance in software_instance_tree_list:\n
computer_partition = software_instance.getAggregateValue()\n
if not computer_partition:\n
continue\n
computer_network = computer_partition.getParentValue().getSubordinationValue()\n
if computer_network:\n
computer_network_query_list.append(ComplexQuery(\n
SimpleQuery(\n
default_subordination_uid=computer_network.getUid()),\n
logical_operator=\'not\',\n
))\n
\n
computer_network_query = ComplexQuery(*computer_network_query_list)\n
hosting_subscription.serialize()\n
\n
elif sla_dict.get(\'mode\'):\n
computer_network_query = \'-1\'\n
\n
computer_partition_relative_url = person.Person_restrictMethodAsShadowUser(\n
computer_partition_relative_url = person.Person_restrictMethodAsShadowUser(\n
shadow_document=person,\n
shadow_document=person,\n
callable_object=person.Person_findPartition,\n
callable_object=person.Person_findPartition,\n
argument_list=[software_instance.getUrlString(), software_instance.getSourceReference(),\n
argument_list=[software_instance.getUrlString(), software_instance.getSourceReference(),\n
software_instance.getPortalType(), sla_dict])\n
software_instance.getPortalType(), sla_dict
, computer_network_query
])\n
return computer_partition_relative_url\n
return computer_partition_relative_url
, tag
\n
\n
\n
software_instance = context\n
software_instance = context\n
if software_instance.getValidationState() != \'validated\' \\\n
if software_instance.getValidationState() != \'validated\' \\\n
...
@@ -94,14 +145,25 @@ if software_instance.getValidationState() != \'validated\' \\\n
...
@@ -94,14 +145,25 @@ if software_instance.getValidationState() != \'validated\' \\\n
or software_instance.getAggregateValue(portal_type=\'Computer Partition\') is not None:\n
or software_instance.getAggregateValue(portal_type=\'Computer Partition\') is not None:\n
return\n
return\n
\n
\n
hosting_subscription = software_instance.getSpecialiseValue()\n
try:\n
try:\n
computer_partition_url = assignComputerPartition(software_instance)\n
computer_partition_url, tag = assignComputerPartition(software_instance,\n
hosting_subscription)\n
\n
# XXX: We create a dummy activity to prevent to allocations on the same network\n
if tag:\n
hosting_subscription.activate(activity="SQLQueue", tag=tag,\n
after_tag="allocate_%s" % computer_partition_url).getId()\n
\n
except ValueError:\n
except ValueError:\n
# It was not possible to find free Computer Partition\n
# It was not possible to find free Computer Partition\n
markHistory(software_instance, \'Allocation failed: no free Computer Partition\')\n
markHistory(software_instance, \'Allocation failed: no free Computer Partition\')\n
except Unauthorized, e:\n
except Unauthorized, e:\n
# user has bad balance\n
# user has bad balance\n
markHistory(software_instance, \'Allocation failed: %s\' % e)\n
markHistory(software_instance, \'Allocation failed: %s\' % e)\n
except NotImplementedError, e:\n
# user has bad balance\n
markHistory(software_instance, \'Allocation failed: %s\' % e)\n
else:\n
else:\n
if computer_partition_url is not None:\n
if computer_partition_url is not None:\n
try:\n
try:\n
...
@@ -111,7 +173,9 @@ else:\n
...
@@ -111,7 +173,9 @@ else:\n
markHistory(software_instance, \'Allocation failed: consistency failed\')\n
markHistory(software_instance, \'Allocation failed: consistency failed\')\n
else:\n
else:\n
software_instance.allocatePartition(computer_partition_url=computer_partition_url)\n
software_instance.allocatePartition(computer_partition_url=computer_partition_url)\n
</string>
</value>
]]>
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
_params
</string>
</key>
<key>
<string>
_params
</string>
</key>
...
...
master/bt5/slapos_cloud/TestTemplateItem/testSlapOSCloudAlarm.py
View file @
3c25d369
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment