Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
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
Alexander Emmerich
erp5
Commits
c281ca18
Commit
c281ca18
authored
Aug 06, 2019
by
Rafael Monnerat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5.util: Update the SlapOS API
The API changed on the slap, this commit follow up the changes.
parent
c5e2f481
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
33 additions
and
120 deletions
+33
-120
erp5/util/testnode/SlapOSMasterCommunicator.py
erp5/util/testnode/SlapOSMasterCommunicator.py
+33
-120
No files found.
erp5/util/testnode/SlapOSMasterCommunicator.py
View file @
c281ca18
...
...
@@ -10,6 +10,8 @@ from uritemplate import expand
import
slapos.slap
from
slapos.slap
import
SoftwareProductCollection
from
slapos.client
import
SOFTWARE_PRODUCT_NAMESPACE
from
slapos.slap.util
import
xml2dict
from
requests.exceptions
import
HTTPError
from
..taskdistribution
import
SAFE_RPC_EXCEPTION_LIST
from
.
import
logger
...
...
@@ -19,8 +21,6 @@ import six
# max time to instance changing state: 3 hour
MAX_INSTANCE_TIME
=
60
*
60
*
3
SOFTWARE_PRODUCT_NAMESPACE
=
"product."
SOFTWARE_STATE_UNKNOWN
=
"SOFTWARE_STATE_UNKNOWN"
SOFTWARE_STATE_INSTALLING
=
"SOFTWARE_STATE_INSTALLING"
SOFTWARE_STATE_INSTALLED
=
"SOFTWARE_STATE_INSTALLED"
...
...
@@ -83,6 +83,10 @@ class SlapOSMasterCommunicator(object):
self
.
url
=
url
#########################################################
# Wrapper functions to support network retries
#########################################################
@
retryOnNetworkFailure
def
_supply
(
self
,
state
=
"available"
):
if
self
.
computer_guid
is
None
:
...
...
@@ -113,126 +117,35 @@ class SlapOSMasterCommunicator(object):
state
=
state
,
**
self
.
request_kw
)
@
retryOnNetworkFailure
def
isInstanceRequested
(
self
,
instance_title
):
hateoas
=
getattr
(
self
.
slap
,
'_hateoas_navigator'
,
None
)
return
instance_title
in
hateoas
.
getHostingSubscriptionDict
(
)
return
len
(
self
.
hateoas_navigator
.
_getHostingSubscriptionList
(
title
=
instance_title
)
)
@
retryOnNetworkFailure
def
_hateoas_getComputer
(
self
,
reference
):
root_document
=
self
.
hateoas_navigator
.
getRootDocument
()
search_url
=
root_document
[
"_links"
][
'raw_search'
][
'href'
]
getter_link
=
expand
(
search_url
,
{
"query"
:
"reference:%s AND portal_type:Computer"
%
reference
,
"select_list"
:
[
"relative_url"
],
"limit"
:
1
})
result
=
self
.
hateoas_navigator
.
GET
(
getter_link
)
content_list
=
json
.
loads
(
result
)[
'_embedded'
][
'contents'
]
if
len
(
content_list
)
==
0
:
raise
Exception
(
'No Computer found.'
)
computer_relative_url
=
content_list
[
0
][
"relative_url"
]
getter_url
=
self
.
hateoas_navigator
.
getDocumentAndHateoas
(
computer_relative_url
)
def
getComputer
(
self
,
reference
):
return
self
.
hateoas_navigator
.
getComputer
(
reference
)
return
json
.
loads
(
self
.
hateoas_navigator
.
GET
(
getter_url
))
@
retryOnNetworkFailure
def
getSoftwareInstallationList
(
self
,
computer_guid
=
None
):
# XXX Move me to slap.py API
computer
=
self
.
_hateoas_getComputer
(
computer_guid
)
if
computer_guid
else
self
.
_hateoas_getComputer
(
self
.
computer_guid
)
# Not a list ?
action
=
computer
[
'_links'
][
'action_object_slap'
]
if
action
.
get
(
'title'
)
==
'getHateoasSoftwareInstallationList'
:
getter_link
=
action
[
'href'
]
else
:
raise
Exception
(
'No Link found found.'
)
result
=
self
.
hateoas_navigator
.
GET
(
getter_link
)
return
json
.
loads
(
result
)[
'_links'
][
'content'
]
@
retryOnNetworkFailure
def
getSoftwareInstallationNews
(
self
,
computer_guid
=
None
):
getter_link
=
None
for
si
in
self
.
getSoftwareInstallationList
(
computer_guid
):
if
si
[
"title"
]
==
self
.
url
:
getter_link
=
si
[
"href"
]
break
# We could not find the document, so it is probably too soon.
if
getter_link
is
None
:
return
""
result
=
self
.
hateoas_navigator
.
GET
(
getter_link
)
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
.
hateoas_navigator
.
GET
(
getter_link
)
if
len
(
json
.
loads
(
result
)[
'news'
])
>
0
:
return
json
.
loads
(
result
)[
'news'
][
0
][
"text"
]
return
""
return
self
.
hateoas_navigator
.
getSoftwareInstallationList
(
computer_guid
=
computer_guid
)
@
retryOnNetworkFailure
def
getInstanceUrlList
(
self
):
hosting_subscription_dict
=
self
.
hateoas_navigator
.
_hateoas_getHostingSubscriptionDict
()
# Don't store hosting subscription url. It changes from time to time.
hosting_subscription_url
=
None
for
hs
in
hosting_subscription_dict
:
if
hs
[
'title'
]
==
self
.
name
:
hosting_subscription_url
=
hs
[
'href'
]
break
if
hosting_subscription_url
is
None
:
return
None
return
self
.
hateoas_navigator
.
getHateoasInstanceList
(
hosting_subscription_url
)
@
retryOnNetworkFailure
def
getNewsFromInstance
(
self
,
url
):
result
=
self
.
hateoas_navigator
.
GET
(
url
)
result
=
json
.
loads
(
result
)
if
result
[
'_links'
].
get
(
'action_object_slap'
,
None
)
is
None
:
return
None
object_link
=
self
.
hateoas_navigator
.
hateoasGetLinkFromLinks
(
result
[
'_links'
][
'action_object_slap'
],
'getHateoasNews'
)
result
=
self
.
hateoas_navigator
.
GET
(
object_link
)
return
json
.
loads
(
result
)[
'news'
]
return
self
.
hateoas_navigator
.
getHostingSubscriptionInstanceList
(
self
.
title
)
@
retryOnNetworkFailure
def
getInformationFromInstance
(
self
,
url
):
result
=
self
.
hateoas_navigator
.
GET
(
url
)
result
=
json
.
loads
(
result
)
if
result
[
'_links'
].
get
(
'action_object_slap'
,
None
)
is
None
:
print
(
result
[
'links'
])
return
None
object_link
=
self
.
hateoas_navigator
.
hateoasGetLinkFromLinks
(
result
[
'_links'
][
'action_object_slap'
],
'getHateoasInformation'
)
result
=
self
.
hateoas_navigator
.
GET
(
object_link
)
return
json
.
loads
(
result
)
return
self
.
hateoas_navigator
.
jio_get
(
url
)
@
retryOnNetworkFailure
def
_getSoftwareState
(
self
,
computer_guid
=
None
):
if
self
.
computer_guid
is
None
:
return
SOFTWARE_STATE_INSTALLED
message
=
self
.
getSoftwareInstallationNews
(
computer_guid
)
message
=
self
.
hateoas_navigator
.
getSoftwareInstallationNews
(
computer_guid
=
computer_guid
,
self
.
url
)
logger
.
info
(
message
)
if
message
.
startswith
(
"#error no data found"
):
return
SOFTWARE_STATE_UNKNOWN
...
...
@@ -270,19 +183,18 @@ class SlapOSMasterCommunicator(object):
message_list
=
[]
try
:
for
instance
in
self
.
getInstanceUrlList
():
news
=
self
.
getNewsFromInstance
(
instance
[
"href"
])
information
=
self
.
getInformationFromInstance
(
instance
[
"href"
])
news
=
instance
[
'SoftwareInstance_getNewsDict'
]
state
=
INSTANCE_STATE_UNKNOWN
monitor_information_dict
=
{}
info_created_at
=
"-1"
is_slave
=
in
formation
[
'slave'
]
is_slave
=
in
stance
[
'portal_type'
]
==
"Slave Instance"
if
is_slave
:
if
(
information
[
"connection_dict"
])
>
0
:
if
len
(
instance
[
'getConnectionXmlAsDict'
])
>
0
:
state
=
INSTANCE_STATE_STARTED
else
:
# not slave
instance_state
=
news
[
0
]
instance_state
=
news
if
instance_state
.
get
(
'created_at'
,
'-1'
)
!=
"-1"
:
# the following does NOT take TZ into account
created_at
=
datetime
.
datetime
.
strptime
(
instance_state
[
'created_at'
],
...
...
@@ -306,7 +218,7 @@ class SlapOSMasterCommunicator(object):
if
state
==
INSTANCE_STATE_STARTED_WITH_ERROR
:
# search for monitor url
monitor_v6_url
=
in
formation
[
"connection_dict"
].
get
(
"monitor_v6_url"
)
monitor_v6_url
=
in
stance
[
'getConnectionXmlAsDict'
].
get
(
"monitor_v6_url"
)
try
:
monitor_information_dict
=
self
.
getRSSEntryFromMonitoring
(
monitor_v6_url
)
except
Exception
:
...
...
@@ -314,11 +226,13 @@ class SlapOSMasterCommunicator(object):
logger
.
error
(
traceback
.
format_exc
())
monitor_information_dict
=
{
"message"
:
"Unable to download"
}
instance
[
"connection_dict"
]
=
instance
[
"getConnectionXmlAsDict"
]
instance
[
"parameter_dict"
]
=
xml2dict
(
instance
[
"text_content"
]))
message_list
.
append
({
'title'
:
instance
[
"title"
],
'slave'
:
is_slave
,
'news'
:
news
[
0
]
,
'information'
:
in
formation
,
'news'
:
news
,
'information'
:
in
stance
,
'monitor'
:
monitor_information_dict
,
'state'
:
state
})
...
...
@@ -456,8 +370,7 @@ class SlapOSTester(SlapOSMasterCommunicator):
for
instance
in
self
.
getInstanceUrlList
():
if
instance
[
"title"
]
==
"Monitor Frontend apache-frontend-1"
:
try
:
information
=
self
.
getInformationFromInstance
(
instance
[
"href"
])
frontend_master_ipv6
=
information
[
'parameter_dict'
][
'url'
]
frontend_master_ipv6
=
xml2dict
(
instance
[
'text_content'
])[
'url'
]
except
Exception
as
e
:
pass
start_time
=
time
.
time
()
...
...
@@ -471,18 +384,17 @@ class SlapOSTester(SlapOSMasterCommunicator):
def
getInstanceUrlDict
(
self
):
frontend_url_list
=
[]
for
instance
in
self
.
getInstanceUrlList
():
information
=
self
.
getInformationFromInstance
(
instance
[
"href"
])
if
"frontend-"
in
instance
[
"title"
]:
try
:
frontend
=
[
instance
[
"title"
].
replace
(
"frontend-"
,
""
),
in
formation
[
"connection_d
ict"
][
"secure_access"
]]
in
stance
[
"getConnectionXmlAsD
ict"
][
"secure_access"
]]
frontend_url_list
.
append
(
frontend
)
except
Exception
as
e
:
logger
.
info
(
"Frontend url not generated yet for instance: "
+
instance
[
"title"
])
pass
if
instance
[
"title"
]
==
self
.
name
:
try
:
connection_json
=
json
.
loads
(
in
formation
[
"connection_d
ict"
][
"_"
])
connection_json
=
json
.
loads
(
in
stance
[
"getConnectionXmlAsD
ict"
][
"_"
])
user
=
connection_json
[
"inituser-login"
]
password
=
connection_json
[
"inituser-password"
]
except
Exception
as
e
:
...
...
@@ -491,8 +403,9 @@ class SlapOSTester(SlapOSMasterCommunicator):
def
destroyInstance
(
self
,
instance_title
):
self
.
name
=
instance_title
if
self
.
getInstanceUrlList
():
for
instance
in
self
.
getInstanceUrlList
():
instance_url_list
=
self
.
InstanceUrlList
()
if
instance_url_list
:
for
instance
in
instance_url_list
:
if
instance
[
"title"
]
!=
instance_title
:
self
.
_request
(
INSTANCE_STATE_DESTROYED
,
instance
[
"title"
])
else
:
...
...
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