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
Léo-Paul Géneau
slapos.core
Commits
2c33ccfe
Commit
2c33ccfe
authored
Jul 18, 2019
by
Rafael Monnerat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
slapos/slap: Add API to get Computer information
parent
cde0ec75
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
215 additions
and
17 deletions
+215
-17
setup.py
setup.py
+2
-0
slapos/cli/computer_info.py
slapos/cli/computer_info.py
+80
-0
slapos/cli/computer_list.py
slapos/cli/computer_list.py
+68
-0
slapos/slap/hateoas.py
slapos/slap/hateoas.py
+46
-17
slapos/slap/slap.py
slapos/slap/slap.py
+19
-0
No files found.
setup.py
View file @
2c33ccfe
...
...
@@ -110,6 +110,8 @@ setup(name=name,
'configure client = slapos.cli.configure_client:ConfigureClientCommand'
,
'service info = slapos.cli.info:InfoCommand'
,
'service list = slapos.cli.list:ListCommand'
,
'computer list = slapos.cli.computer_list:ListCommand'
,
'computer info = slapos.cli.computer_info:InfoCommand'
,
'supply = slapos.cli.supply:SupplyCommand'
,
'remove = slapos.cli.remove:RemoveCommand'
,
'request = slapos.cli.request:RequestCommand'
,
...
...
slapos/cli/computer_info.py
0 → 100644
View file @
2c33ccfe
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2010-2014 Vifib SARL and Contributors.
# All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation; either version 2.1
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import
logging
import
pprint
import
sys
from
slapos.cli.config
import
ClientConfigCommand
from
slapos.client
import
init
,
ClientConfig
from
slapos.slap
import
ResourceNotReady
,
NotFoundError
def
resetLogger
(
logger
):
"""Remove all formatters, log files, etc."""
if
not
getattr
(
logger
,
'parent'
,
None
):
return
handler
=
logger
.
parent
.
handlers
[
0
]
logger
.
parent
.
removeHandler
(
handler
)
logger
.
addHandler
(
logging
.
StreamHandler
(
sys
.
stdout
))
class
InfoCommand
(
ClientConfigCommand
):
"""get information of an computer"""
def
get_parser
(
self
,
prog_name
):
ap
=
super
(
InfoCommand
,
self
).
get_parser
(
prog_name
)
ap
.
add_argument
(
'reference'
,
help
=
'Your computer reference'
)
return
ap
def
take_action
(
self
,
args
):
configp
=
self
.
fetch_config
(
args
)
conf
=
ClientConfig
(
args
,
configp
)
local
=
init
(
conf
,
self
.
app
.
log
)
exit_code
=
do_info
(
self
.
app
.
log
,
conf
,
local
)
if
exit_code
!=
0
:
exit
(
exit_code
)
def
do_info
(
logger
,
conf
,
local
):
resetLogger
(
logger
)
try
:
computer
=
local
[
'slap'
].
registerComputer
(
conf
.
reference
).
getInformation
()
except
ResourceNotReady
:
logger
.
warning
(
'Computer does not exist or is not ready yet.'
)
return
(
2
)
except
NotFoundError
:
logger
.
warning
(
'Computer %s does not exist.'
,
conf
.
reference
)
return
(
2
)
import
pdb
;
pdb
.
set_trace
()
logger
.
info
(
'Computer Reference: %s'
,
computer
.
_reference
)
slapos/cli/computer_list.py
0 → 100644
View file @
2c33ccfe
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2010-2014 Vifib SARL and Contributors.
# All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation; either version 2.1
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import
logging
import
sys
import
six
from
slapos.cli.config
import
ClientConfigCommand
from
slapos.client
import
init
,
ClientConfig
def
resetLogger
(
logger
):
"""Remove all formatters, log files, etc."""
if
not
getattr
(
logger
,
'parent'
,
None
):
return
handler
=
logger
.
parent
.
handlers
[
0
]
logger
.
parent
.
removeHandler
(
handler
)
logger
.
addHandler
(
logging
.
StreamHandler
(
sys
.
stdout
))
class
ListCommand
(
ClientConfigCommand
):
"""request an instance and get status and parameters of instance"""
def
get_parser
(
self
,
prog_name
):
ap
=
super
(
ListCommand
,
self
).
get_parser
(
prog_name
)
return
ap
def
take_action
(
self
,
args
):
configp
=
self
.
fetch_config
(
args
)
conf
=
ClientConfig
(
args
,
configp
)
local
=
init
(
conf
,
self
.
app
.
log
)
do_list
(
self
.
app
.
log
,
conf
,
local
)
def
do_list
(
logger
,
conf
,
local
):
resetLogger
(
logger
)
computer_dict
=
local
[
'slap'
].
getComputerDict
()
if
computer_dict
==
{}:
logger
.
info
(
'No existing computer.'
)
return
logger
.
info
(
'List of Computers:'
)
for
title
,
computer
in
six
.
iteritems
(
computer_dict
):
logger
.
info
(
'%s %s'
,
computer
.
_reference
,
title
)
slapos/slap/hateoas.py
View file @
2c33ccfe
...
...
@@ -301,18 +301,13 @@ class HateoasNavigator(object):
return
self
.
_extractPropertyFromFormDict
(
document_dict
)
def
getDocumentAndHateoas
(
self
,
relative_url
,
view
=
'view'
):
site_document
=
self
.
getRootDocument
()
return
expand
(
site_document
[
'_links'
][
'traverse'
][
'href'
],
dict
(
relative_url
=
relative_url
,
view
=
view
)
)
def
jio_getAttachment
(
self
,
key
,
action
,
options
):
pass
def
getMeDocument
(
self
):
person_relative_url
=
self
.
getRelativeUrlFromUrn
(
self
.
getRootDocument
()[
'_links'
][
'me'
][
'href'
])
person_url
=
self
.
getDocumentAndHateoas
(
person_relative_url
)
return
json
.
loads
(
self
.
GET
(
person_url
))
return
self
.
jio_get
(
person_relative_url
)
class
SlapHateoasNavigator
(
HateoasNavigator
):
def
_getHostingSubscriptionList
(
self
,
title
=
None
,
select_list
=
[
"title"
,
"url_string"
]):
...
...
@@ -325,6 +320,20 @@ class SlapHateoasNavigator(HateoasNavigator):
return
result
[
'data'
][
'rows'
]
def
_getComputerList
(
self
,
title
=
None
,
reference
=
None
,
select_list
=
[
"title"
,
"reference"
]):
query_str
=
'portal_type:"Computer" AND validation_state:validated'
if
title
is
not
None
:
query_str
+=
' AND title:="%s"'
%
title
if
reference
is
not
None
:
query_str
+=
' AND reference:="%s"'
%
reference
result
=
self
.
jio_allDocs
(
query
=
{
"query"
:
query_str
,
"select_list"
:
select_list
})
return
result
[
'data'
][
'rows'
]
def
_hateoas_getRelatedHostingSubscription
(
self
):
action_object_slap_list
=
self
.
getMeDocument
()[
'_links'
][
'action_object_slap'
]
getter_link
=
self
.
hateoasGetLinkFromLinks
(
action_object_slap_list
,
'getHateoasRelatedHostingSubscription'
)
...
...
@@ -361,11 +370,24 @@ class SlapHateoasNavigator(HateoasNavigator):
return
hosting_subscription_dict
def
getComputerDict
(
self
):
computer_list
=
self
.
_getComputerList
()
computer_dict
=
{}
for
computer_json
in
computer_list
:
computer
=
TempDocument
()
for
key
,
value
in
computer_json
.
iteritems
():
if
key
in
[
'_links'
]:
continue
setattr
(
computer
,
'_%s'
%
key
,
value
)
computer_dict
[
computer
.
_title
]
=
computer
return
computer_dict
def
getHostingSubscriptionRootSoftwareInstanceInformation
(
self
,
reference
):
hosting_subscription_list
=
self
.
_getHostingSubscriptionList
(
title
=
reference
,
select_list
=
[
"title"
,
"relative_url"
])
assert
len
(
hosting_subscription_list
)
=
=
1
,
\
assert
len
(
hosting_subscription_list
)
<
=
1
,
\
"There are more them one Hosting Subscription for this reference"
for
hosting_subscription_candidate
in
hosting_subscription_list
:
...
...
@@ -376,7 +398,6 @@ class SlapHateoasNavigator(HateoasNavigator):
if
hosting_subscription_jio_key
is
None
:
raise
NotFoundError
(
'This document does not exist.'
)
return
self
.
jio_get
(
hosting_subscription_jio_key
)
def
getRelatedInstanceInformation
(
self
,
reference
):
...
...
@@ -386,14 +407,22 @@ class SlapHateoasNavigator(HateoasNavigator):
instance
=
self
.
_hateoasGetInformation
(
instance_url
)
return
instance
def
_hateoas_getComputer
(
self
,
reference
):
content_list
=
json
.
loads
(
result
)[
'_embedded'
][
'contents'
]
if
len
(
content_list
)
==
0
:
raise
Exception
(
'No Computer found.'
)
def
_getComputer
(
self
,
reference
):
computer_list
=
self
.
_getComputerList
(
reference
=
reference
,
select_list
=
[
"reference"
,
"relative_url"
])
assert
len
(
computer_list
)
<=
1
,
\
"There are more them one Computer for this reference"
for
computer_candidate
in
computer_list
:
if
computer_candidate
.
get
(
"reference"
)
==
reference
:
computer_jio_key
=
computer_candidate
[
'relative_url'
]
break
if
computer_jio_key
is
None
:
raise
NotFoundError
(
'This computer does not exist.'
)
computer_relative_url
=
content_list
[
0
][
"relative_url"
]
getter_url
=
self
.
getDocumentAndHateoas
(
computer_relative_url
)
return
json
.
loads
(
self
.
GET
(
getter_url
))
return
self
.
jio_get
(
computer_jio_key
)
def
getSoftwareInstallationList
(
self
,
computer_guid
=
None
):
computer
=
self
.
_hateoas_getComputer
(
computer_guid
)
\
...
...
slapos/slap/slap.py
View file @
2c33ccfe
...
...
@@ -362,6 +362,19 @@ class Computer(SlapDocument):
'computer_id'
:
self
.
_computer_id
})
return
loads
(
xml
)
def
getInformation
(
self
):
if
not
getattr
(
self
,
'_hateoas_navigator'
,
None
):
raise
Exception
(
'SlapOS Master Hateoas API required for this operation is not availble.'
)
raw_information
=
self
.
_hateoas_navigator
.
_getComputer
(
reference
=
self
.
_computer_id
)
computer
=
Computer
(
self
.
_computer_id
)
for
key
,
value
in
six
.
iteritems
(
raw_information
[
"data"
]):
if
key
in
[
'_links'
]:
continue
setattr
(
computer
,
'_%s'
%
key
,
value
)
return
computer
def
parsed_error_message
(
status
,
body
,
path
):
m
=
re
.
search
(
'(Error Value:
\
n
.*)'
,
body
,
re
.
MULTILINE
)
...
...
@@ -796,3 +809,9 @@ class slap:
if
not
getattr
(
self
,
'_hateoas_navigator'
,
None
):
raise
Exception
(
'SlapOS Master Hateoas API required for this operation is not availble.'
)
return
self
.
_hateoas_navigator
.
getHostingSubscriptionDict
()
def
getComputerDict
(
self
):
if
not
getattr
(
self
,
'_hateoas_navigator'
,
None
):
raise
Exception
(
'SlapOS Master Hateoas API required for this operation is not availble.'
)
return
self
.
_hateoas_navigator
.
getComputerDict
()
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