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
Labels
Merge Requests
18
Merge Requests
18
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
slapos.core
Commits
095d8073
Commit
095d8073
authored
Aug 06, 2019
by
Rafael Monnerat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
slap/hateoas: Update remaining part of the API to be JIO Complaint
The API must relies on Hateoas API based on JIO only.
parent
085f83fd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
65 additions
and
78 deletions
+65
-78
slapos/slap/hateoas.py
slapos/slap/hateoas.py
+52
-74
slapos/slap/slap.py
slapos/slap/slap.py
+13
-4
No files found.
slapos/slap/hateoas.py
View file @
095d8073
...
@@ -323,13 +323,19 @@ class HateoasNavigator(object):
...
@@ -323,13 +323,19 @@ class HateoasNavigator(object):
return
document_dict
return
document_dict
def
_getMeUrl
(
self
):
return
self
.
getRelativeUrlFromUrn
(
self
.
getRootDocument
()[
'_links'
][
'me'
][
'href'
])
def
getMeDocument
(
self
):
def
getMeDocument
(
self
):
person_relative_url
=
self
.
getRelativeUrlFromUrn
(
# User can be a Person, Software Instance or Computer
self
.
getRootDocument
()[
'_links'
][
'me'
][
'href'
])
return
self
.
jio_get
(
self
.
_getMeUrl
())
return
self
.
jio_get
(
person_relative_url
)
class
SlapHateoasNavigator
(
HateoasNavigator
):
class
SlapHateoasNavigator
(
HateoasNavigator
):
###############################################################
# API for Client as a Person
###############################################################
def
_getHostingSubscriptionList
(
self
,
title
=
None
,
select_list
=
[
"title"
,
"url_string"
]):
def
_getHostingSubscriptionList
(
self
,
title
=
None
,
select_list
=
[
"title"
,
"url_string"
]):
query_str
=
'portal_type:"Hosting Subscription" AND validation_state:validated'
query_str
=
'portal_type:"Hosting Subscription" AND validation_state:validated'
if
title
is
not
None
:
if
title
is
not
None
:
...
@@ -353,31 +359,17 @@ class SlapHateoasNavigator(HateoasNavigator):
...
@@ -353,31 +359,17 @@ class SlapHateoasNavigator(HateoasNavigator):
return
result
[
'data'
][
'rows'
]
return
result
[
'data'
][
'rows'
]
def
getHostingSubscriptionInstanceList
(
self
,
title
):
select_list
=
[
'uid'
,
'relative_url'
,
'portal_type'
,
'url_string'
,
'SoftwareInstance_getNewsDict'
]
query_str
=
'portal_type:("Software Instance", "Slave Instance") AND validation_state:validated'
query_str
+=
' AND default_specialise_title:="%s"'
%
title
result
=
self
.
jio_allDocs
(
query
=
{
"query"
:
query_str
,
"select_list"
:
select_list
})
def
_hateoas_getRelatedHostingSubscription
(
self
):
return
result
[
'data'
][
'rows'
]
action_object_slap_list
=
self
.
getMeDocument
()[
'_links'
][
'action_object_slap'
]
getter_link
=
self
.
hateoasGetLinkFromLinks
(
action_object_slap_list
,
'getHateoasRelatedHostingSubscription'
)
result
=
self
.
GET
(
getter_link
)
return
json
.
loads
(
result
)[
'_links'
][
'action_object_jump'
][
'href'
]
def
_hateoasGetInformation
(
self
,
url
):
result
=
self
.
GET
(
url
)
result
=
json
.
loads
(
result
)
object_link
=
self
.
hateoasGetLinkFromLinks
(
result
[
'_links'
][
'action_object_slap'
],
'getHateoasInformation'
)
result
=
self
.
GET
(
object_link
)
return
json
.
loads
(
result
)
def
getHateoasInstanceList
(
self
,
hosting_subscription_url
):
hosting_subscription
=
json
.
loads
(
self
.
GET
(
hosting_subscription_url
))
instance_list_url
=
self
.
hateoasGetLinkFromLinks
(
hosting_subscription
[
'_links'
][
'action_object_slap'
],
'getHateoasInstanceList'
)
instance_list
=
json
.
loads
(
self
.
GET
(
instance_list_url
))
return
instance_list
[
'_links'
][
'content'
]
def
getHostingSubscriptionDict
(
self
):
def
getHostingSubscriptionDict
(
self
,
title
=
None
):
hosting_subscription_list
=
self
.
_getHostingSubscriptionList
()
hosting_subscription_list
=
self
.
_getHostingSubscriptionList
(
title
=
title
)
hosting_subscription_dict
=
{}
hosting_subscription_dict
=
{}
for
hosting_subscription
in
hosting_subscription_list
:
for
hosting_subscription
in
hosting_subscription_list
:
software_instance
=
TempDocument
()
software_instance
=
TempDocument
()
...
@@ -428,13 +420,6 @@ class SlapHateoasNavigator(HateoasNavigator):
...
@@ -428,13 +420,6 @@ class SlapHateoasNavigator(HateoasNavigator):
return
self
.
jio_get
(
hosting_subscription_jio_key
)
return
self
.
jio_get
(
hosting_subscription_jio_key
)
def
getRelatedInstanceInformation
(
self
,
reference
):
related_hosting_subscription_url
=
self
.
_hateoas_getRelatedHostingSubscription
()
instance_list
=
self
.
getHateoasInstanceList
(
related_hosting_subscription_url
)
instance_url
=
self
.
hateoasGetLinkFromLinks
(
instance_list
,
reference
)
instance
=
self
.
_hateoasGetInformation
(
instance_url
)
return
instance
def
_getComputer
(
self
,
reference
):
def
_getComputer
(
self
,
reference
):
computer_list
=
self
.
_getComputerList
(
reference
=
reference
,
computer_list
=
self
.
_getComputerList
(
reference
=
reference
,
select_list
=
[
"reference"
,
"relative_url"
])
select_list
=
[
"reference"
,
"relative_url"
])
...
@@ -452,49 +437,42 @@ class SlapHateoasNavigator(HateoasNavigator):
...
@@ -452,49 +437,42 @@ class SlapHateoasNavigator(HateoasNavigator):
return
self
.
jio_get
(
computer_jio_key
)
return
self
.
jio_get
(
computer_jio_key
)
def
getSoftwareInstallationList
(
self
,
computer_guid
=
None
):
def
getSoftwareInstallationList
(
self
,
computer_guid
=
None
,
computer
=
self
.
_hateoas_getComputer
(
computer_guid
)
\
select_list
=
[
'uid'
,
'relative_url'
,
'url_string'
,
'SoftwareInstallation_getNewsDict'
]):
if
computer_guid
else
self
.
_hateoas_getComputer
(
self
.
computer_guid
)
query_str
=
'portal_type:"Software Installation" AND validation_state:validated'
if
computer_guid
is
not
None
:
query_str
+=
' AND default_aggregate_reference:="%s"'
%
computer_guid
action
=
computer
[
'_links'
][
'action_object_slap'
]
result
=
self
.
jio_allDocs
(
if
action
.
get
(
'title'
)
==
'getHateoasSoftwareInstallationList'
:
query
=
{
"query"
:
query_str
,
"select_list"
:
select_list
})
getter_link
=
action
[
'href'
]
else
:
raise
Exception
(
'No Link found found.'
)
result
=
self
.
hateoas_navigator
.
GET
(
getter_link
)
return
json
.
loads
(
result
)[
'_links'
][
'content'
]
def
getSoftwareInstallationNews
(
self
,
computer_guid
=
None
):
return
result
[
'data'
][
'rows'
]
getter_link
=
None
for
si
in
self
.
getSoftwareInstallationList
(
computer_guid
):
def
_getRelatedHostingSubscriptionUrl
(
self
,
instance_url
):
if
si
[
"title"
]
==
self
.
url
:
instance
=
self
.
jio_get
(
instance_url
)
getter_link
=
si
[
"href"
]
return
instance
[
"specialise_title"
]
break
# We could not find the document, so it is probably too soon.
def
getRelatedInstanceInformation
(
self
,
instance_url
,
title
):
if
getter_link
is
None
:
related_hosting_subscription_title
=
self
.
_getRelatedHostingSubscription
(
instance_url
)
return
""
instance_list
=
self
.
getHostingSubscriptionInstanceList
(
related_hosting_subscription_title
,
instance_title
)
result
=
self
.
GET
(
getter_link
)
return
self
.
jio_get
(
instance_url
)
action_object_slap_list
=
json
.
loads
(
result
)[
'_links'
][
'action_object_slap'
]
for
action
in
action_object_slap_list
:
if
action
.
get
(
'title'
)
==
'getHateoasNews'
:
getter_link
=
action
[
'href'
]
break
else
:
raise
Exception
(
'getHateoasNews not found.'
)
result
=
self
.
GET
(
getter_link
)
if
len
(
json
.
loads
(
result
)[
'news'
])
>
0
:
return
json
.
loads
(
result
)[
'news'
][
0
][
"text"
]
return
""
def
getInstanceNews
(
self
,
url
):
def
getInstanceNews
(
self
,
url
):
result
=
self
.
GET
(
url
)
return
self
.
jio_get
(
url
)[
'news'
]
result
=
json
.
loads
(
result
)
if
result
[
'_links'
].
get
(
'action_object_slap'
,
None
)
is
None
:
def
getSoftwareInstallationNews
(
self
,
computer_guid
=
None
,
url
=
None
):
return
None
for
si
in
self
.
getSoftwareInstallationList
(
computer_guid
):
object_link
=
self
.
hateoasGetLinkFromLinks
(
if
si
[
"url_string"
]
==
url
:
result
[
'_links'
][
'action_object_slap'
],
'getHateoasNews'
)
return
si
[
'SoftwareInstallation_getNewsDict'
][
'text'
]
result
=
self
.
GET
(
object_link
)
def
getComputerNews
(
self
,
computer_guid
):
return
json
.
loads
(
result
)[
'news'
]
return
self
.
_getComputer
(
reference
=
computer_guid
)[
'data'
][
'news'
][
'computer'
][
'text'
]
def
getComputerPartitionNews
(
self
,
computer_guid
,
partition_id
):
try
:
return
self
.
_getComputer
(
reference
=
computer_guid
)[
'data'
][
'news'
][
'partition'
][
partition_id
][
'text'
]
except
KeyError
:
return
"#error no data found"
slapos/slap/slap.py
View file @
095d8073
...
@@ -534,14 +534,23 @@ class ComputerPartition(SlapRequester):
...
@@ -534,14 +534,23 @@ class ComputerPartition(SlapRequester):
if
not
getattr
(
self
,
'_hateoas_navigator'
,
None
):
if
not
getattr
(
self
,
'_hateoas_navigator'
,
None
):
raise
Exception
(
'SlapOS Master Hateoas API required for this operation is not availble.'
)
raise
Exception
(
'SlapOS Master Hateoas API required for this operation is not availble.'
)
raw_information
=
self
.
_hateoas_navigator
.
getRelatedInstanceInformation
(
partition_reference
)
instance_url
=
self
.
getMeUrl
()
raw_information
=
self
.
_hateoas_navigator
.
getRelatedInstanceInformation
(
instance_url
,
partition_reference
)
software_instance
=
SoftwareInstance
()
software_instance
=
SoftwareInstance
()
# XXX redefine SoftwareInstance to be more consistent
for
key
,
value
in
six
.
iteritems
(
raw_information
[
"data"
]):
for
key
,
value
in
six
.
iteritems
(
raw_information
):
if
key
in
[
'_links'
]:
if
key
in
[
'_links'
]:
continue
continue
setattr
(
software_instance
,
'_%s'
%
key
,
value
)
setattr
(
software_instance
,
'_%s'
%
key
,
value
)
setattr
(
software_instance
,
'_software_release_url'
,
raw_information
[
"_links"
][
"software_release"
])
if
raw_information
[
"data"
].
get
(
"text_content"
,
None
)
is
not
None
:
setattr
(
software_instance
,
'_parameter_dict'
,
xml2dict
(
raw_information
[
"data"
][
'text_content'
]))
else
:
setattr
(
software_instance
,
'_parameter_dict'
,
{})
setattr
(
software_instance
,
'_requested_state'
,
raw_information
[
"data"
][
'slap_state'
])
setattr
(
software_instance
,
'_connection_dict'
,
raw_information
[
"data"
][
'connection_parameter_list'
])
setattr
(
software_instance
,
'_software_release_url'
,
raw_information
[
"data"
][
'url_string'
])
return
software_instance
return
software_instance
def
getId
(
self
):
def
getId
(
self
):
...
...
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