Commit 78f26d43 authored by Cédric Le Ninivin's avatar Cédric Le Ninivin Committed by Romain Courteaud

slapos_cloud: Add getJSONSchemaUrl method

This is an attempt to provide stability to the Schema URL and by extension to asJSONText
With absolute url usage used to calculate the Schema URL the url change according to the url being used
parent 22e62992
...@@ -65,17 +65,28 @@ class SoftwareInstallation(Item, JSONType): ...@@ -65,17 +65,28 @@ class SoftwareInstallation(Item, JSONType):
# software instance has to define an xml parameter # software instance has to define an xml parameter
status_dict = self.getAccessStatus() status_dict = self.getAccessStatus()
result = { result = {
"$schema": self.getPortalObject().portal_types.restrictedTraverse(self.getPortalType()).absolute_url() "$schema": self.getJSONSchemaUrl(),
+ "/getTextContent",
"reference": self.getReference().decode("UTF-8"), "reference": self.getReference().decode("UTF-8"),
"software_release_uri": self.getUrlString(), "software_release_uri": self.getUrlString(),
"compute_node_id": self.getAggregateReference(), "compute_node_id": self.getAggregateReference(),
"state": state, "state": state,
"reported_state": status_dict.get("state"), "reported_state": status_dict.get("state"),
"status_message": status_dict.get("text"), "status_message": status_dict.get("text"),
"processing_timestamp": self.getSlapTimestamp(),
} }
result.update() result.update()
return json.dumps(result, indent=2) return json.dumps(result, indent=2)
def getSlapTimestamp(self): def getSlapTimestamp(self):
return int(self.getModificationDate()) return int(self.getModificationDate())
security.declareProtected(Permissions.AccessContentsInformation,
'getJSONSchemaUrl')
def getJSONSchemaUrl(self):
"""
This is an attempt to provide stability to the Schema URL and by extension to asJSONText
"""
portal = self.getPortalObject()
portal_type_path = portal.portal_types.restrictedTraverse(self.getPortalType())
base_url = portal.portal_preferences.getPreferredSlaposWebSiteUrl().strip("/")
return "/".join([base_url, portal_type_path.getRelativeUrl(), "getTextContent"])
\ No newline at end of file
...@@ -320,6 +320,17 @@ class SoftwareInstance(Item, JSONType): ...@@ -320,6 +320,17 @@ class SoftwareInstance(Item, JSONType):
comment='successor_list edited to unlink non commited instances') comment='successor_list edited to unlink non commited instances')
self.setLastData(str(instance_reference_list), key=cache_reference) self.setLastData(str(instance_reference_list), key=cache_reference)
security.declareProtected(Permissions.AccessContentsInformation,
'getJSONSchemaUrl')
def getJSONSchemaUrl(self):
"""
This is an attempt to provide stability to the Schema URL and by extension to asJSONText
"""
portal = self.getPortalObject()
portal_type_path = portal.portal_types.restrictedTraverse("Software Instance")
base_url = portal.portal_preferences.getPreferredSlaposWebSiteUrl().strip("/")
return "/".join([base_url, portal_type_path.getRelativeUrl(), "getTextContent"])
security.declareProtected(Permissions.AccessContentsInformation, security.declareProtected(Permissions.AccessContentsInformation,
'asJSONText') 'asJSONText')
def asJSONText(self): def asJSONText(self):
...@@ -341,8 +352,7 @@ class SoftwareInstance(Item, JSONType): ...@@ -341,8 +352,7 @@ class SoftwareInstance(Item, JSONType):
raise ValueError("Unknown slap state : %s" % requested_state) raise ValueError("Unknown slap state : %s" % requested_state)
# software instance has to define an xml parameter # software instance has to define an xml parameter
result = { result = {
"$schema": self.getPortalObject().portal_types.restrictedTraverse("Software Instance").absolute_url() "$schema": self.getJSONSchemaUrl(),
+ "/getTextContent",
"title": self.getTitle().decode("UTF-8"), "title": self.getTitle().decode("UTF-8"),
"reference": self.getReference().decode("UTF-8"), "reference": self.getReference().decode("UTF-8"),
"software_release_uri": self.getUrlString(), "software_release_uri": self.getUrlString(),
...@@ -357,7 +367,7 @@ class SoftwareInstance(Item, JSONType): ...@@ -357,7 +367,7 @@ class SoftwareInstance(Item, JSONType):
"sla_parameters": self.getSlaXmlAsDict(), "sla_parameters": self.getSlaXmlAsDict(),
"compute_node_id": parameter_dict.get("slap_computer_id"), "compute_node_id": parameter_dict.get("slap_computer_id"),
"compute_partition_id": parameter_dict.get("slap_computer_partition_id"), "compute_partition_id": parameter_dict.get("slap_computer_partition_id"),
"processing_timestamp": parameter_dict.get("timestamp"), "processing_timestamp": self.getSlapTimestamp(),
"access_status_message": self.getTextAccessStatus(), "access_status_message": self.getTextAccessStatus(),
"portal_type": self.getPortalType(), "portal_type": self.getPortalType(),
} }
......
...@@ -336,3 +336,70 @@ class SlapOSComputeNodeMixin(object): ...@@ -336,3 +336,70 @@ class SlapOSComputeNodeMixin(object):
self.getReference(), ', '.join([q.getRelativeUrl() for q \ self.getReference(), ', '.join([q.getRelativeUrl() for q \
in software_installation_list]) in software_installation_list])
)) ))
def getComputePartitionNewsDict(self):
key = '%s_partition_news' % self.getReference()
cache_plugin = self._getCachePlugin()
refresh_etag = self._calculateRefreshEtag()
try:
entry = cache_plugin.get(key, DEFAULT_CACHE_SCOPE)
except KeyError:
entry = None
if entry is not None and isinstance(entry.getValue(), dict):
cached_dict = entry.getValue()
cached_etag = cached_dict.get('refresh_etag', None)
if (refresh_etag != cached_etag):
return self._getCachedComputePartitionNewsDict(key, refresh_etag)
else:
return cached_dict.get('data')
return self._getCachedComputePartitionNewsDict(key, refresh_etag)
def _getCachedComputePartitionNewsDict(self, key, refresh_etag):
unrestrictedSearchResults = self.getPortalObject().portal_catalog.unrestrictedSearchResults
compute_partition_uid_list = [x.uid for x in unrestrictedSearchResults(
parent_uid=self.getUid(),
validation_state="validated",
portal_type="Compute Partition")]
software_instance_list = unrestrictedSearchResults(
portal_type="Software Instance",
default_aggregate_uid=compute_partition_uid_list,
validation_state="validated",
group_by_list=['default_aggregate_uid'],
select_list=['default_aggregate_uid', 'default_aggregate_title']
)
compute_partition_dict = { }
for software_instance in software_instance_list:
compute_partition_dict[software_instance.default_aggregate_title] = software_instance.getAccessStatus()
try:
self._getCachePlugin().set(key, DEFAULT_CACHE_SCOPE,
dict (
time=time.time(),
refresh_etag=refresh_etag,
data=compute_partition_dict
),
cache_duration=self.getPortalObject().portal_caches\
.getRamCacheRoot().get('compute_node_information_cache_factory'\
).cache_duration
)
except (Unauthorized, IndexError):
# XXX: Unauthorized hack. Race condition of not ready setup delivery which provides
# security information shall not make this method fail, as it will be
# called later anyway
# Note: IndexError ignored, as it happend in case if full reindex is
# called on site
pass
return compute_partition_dict
def getJSONSchemaUrl(self):
"""
This is an attempt to provide stability to the Schema URL and by extension to asJSONText
"""
portal = self.getPortalObject()
portal_type_path = portal.portal_types.restrictedTraverse(self.getPortalType())
base_url = portal.portal_preferences.getPreferredSlaposWebSiteUrl().strip("/")
return "/".join([base_url, portal_type_path.getRelativeUrl(), "getTextContent"])
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