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
c32a6331
Commit
c32a6331
authored
May 31, 2011
by
Łukasz Nowak
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import rest-json branch from
git://gitorious.org/slapos/slapos-libslap-python.git
parent
06006524
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
76 additions
and
58 deletions
+76
-58
setup.py
setup.py
+1
-0
slapos/slap/slap.py
slapos/slap/slap.py
+75
-58
No files found.
setup.py
View file @
c32a6331
...
...
@@ -39,6 +39,7 @@ setup(name=name,
'supervisor'
,
# slapgrid uses supervisor to manage processes
'xml_marshaller>=0.9.3'
,
# to unmarshall/marshall python objects to/from
# XML
'simplejson'
,
# for rest manipulation
'zc.buildout>=1.5.0'
,
# slapgrid uses buildout as its backend to do the
# job
'zope.interface'
,
# slap library implementes interfaces
...
...
slapos/slap/slap.py
View file @
c32a6331
...
...
@@ -30,8 +30,9 @@ __all__ = ["slap", "ComputerPartition", "Computer", "SoftwareRelease",
"ResourceNotReady"
]
from
interface
import
slap
as
interface
from
xml_marshaller
import
xml_marshaller
import
httplib
import
simplejson
as
json
import
socket
import
ssl
import
urllib
...
...
@@ -63,6 +64,18 @@ class HTTPSConnectionCA(httplib.HTTPSConnection):
ca_certs
=
self
.
ca_file
,
cert_reqs
=
ssl
.
CERT_REQUIRED
)
def
partitiondict2partition
(
partition_dict
):
slap_partition
=
ComputerPartition
(
partition_dict
[
'computer_id'
],
partition_dict
[
'partition_reference'
])
slap_partition
.
_requested_state
=
partition_dict
[
'requested_state'
]
slap_partition
.
_need_modification
=
partition_dict
[
'need_modification'
]
slap_partition
.
_parameter_dict
=
partition_dict
[
'parameter_dict'
]
slap_partition
.
_connection_dict
=
partition_dict
[
'connection_dict'
]
slap_partition
.
_software_release_document
=
SoftwareRelease
(
software_release
=
partition_dict
[
'software_release'
],
computer_guid
=
partition_dict
[
'computer_id'
])
return
slap_partition
class
SlapDocument
:
pass
...
...
@@ -108,19 +121,6 @@ class SoftwareRelease(SlapDocument):
'url'
:
self
.
_software_release
,
'computer_id'
:
self
.
_computer_guid
})
# XXX What is this SoftwareInstance class?
class
SoftwareInstance
(
SlapDocument
):
"""
Contains Software Instance information
"""
def
__init__
(
self
,
**
kwargs
):
"""
Makes easy initialisation of class parameters
"""
for
k
,
v
in
kwargs
.
iteritems
():
setattr
(
self
,
k
,
v
)
"""Exposed exceptions"""
# XXX Why do we need to expose exceptions?
class
ResourceNotReady
(
Exception
):
...
...
@@ -140,31 +140,31 @@ class Supply(SlapDocument):
zope
.
interface
.
implements
(
interface
.
ISupply
)
def
supply
(
self
,
software_release
,
computer_guid
=
None
):
self
.
_connection_helper
.
POST
(
'/supplySupply'
,
{
'url'
:
software_release
,
'computer_id'
:
computer_guid
})
self
.
_connection_helper
.
POST
(
'/%s/software'
%
computer_guid
,
json
.
dumps
({
'url'
:
software_release
}),
"application/json"
)
class
OpenOrder
(
SlapDocument
):
zope
.
interface
.
implements
(
interface
.
IOpenOrder
)
def
request
(
self
,
software_release
,
partition_reference
,
par
tition_parameter
_kw
=
None
,
software_type
=
None
):
if
par
tition_parameter
_kw
is
None
:
par
tition_parameter
_kw
=
{}
par
ameter_dict
_kw
=
None
,
software_type
=
None
):
if
par
ameter_dict
_kw
is
None
:
par
ameter_dict
_kw
=
{}
request_dict
=
{
'software_release'
:
software_release
,
'partition_reference'
:
partition_reference
,
'par
tition_parameter_xml'
:
xml_marshaller
.
dumps
(
partition_parameter_kw
)
,
'par
ameter_dict'
:
parameter_dict_kw
,
}
if
software_type
is
not
None
:
request_dict
[
'software_type'
]
=
software_type
self
.
_connection_helper
.
POST
(
'/requestComputerPartition'
,
request_dict
)
xml
=
self
.
_connection_helper
.
response
.
read
()
software_instance
=
xml_marshaller
.
loads
(
xml
)
self
.
_connection_helper
.
POST
(
'/partition'
,
json
.
dumps
(
request_dict
),
content_type
=
"application/json"
)
json_document
=
self
.
_connection_helper
.
response
.
read
()
software_instance
=
json
.
loads
(
json_document
)
computer_partition
=
ComputerPartition
(
software_instance
.
slap_computer_id
.
encode
(
'UTF-8'
),
software_instance
.
slap_computer_partition_id
.
encode
(
'UTF-8'
))
software_instance
[
'slap_computer_id'
]
.
encode
(
'UTF-8'
),
software_instance
[
'slap_computer_partition_id'
]
.
encode
(
'UTF-8'
))
return
computer_partition
def
_syncComputerInformation
(
func
):
...
...
@@ -209,16 +209,17 @@ class Computer(SlapDocument):
def
reportUsage
(
self
,
computer_partition_list
):
if
computer_partition_list
==
[]:
return
# xxx-Cedric : do not send computer, but only a dict json-compliant.
computer
=
Computer
(
self
.
_computer_id
)
computer
.
computer_partition_usage_list
=
computer_partition_list
marshalled_slap_usage
=
xml_marshaller
.
dumps
(
computer
)
marshalled_slap_usage
=
json
.
dumps
(
computer
)
self
.
_connection_helper
.
POST
(
'/useComputer'
,
{
'computer_id'
:
self
.
_computer_id
,
'use_string'
:
marshalled_slap_usage
})
def
updateConfiguration
(
self
,
xml
):
def
updateConfiguration
(
self
,
xml
_document
):
self
.
_connection_helper
.
POST
(
'/loadComputerConfigurationFromXML'
,
{
'xml'
:
xml
})
'/loadComputerConfigurationFromXML'
,
{
'xml'
:
xml
_document
})
return
self
.
_connection_helper
.
response
.
read
()
def
_syncComputerPartitionInformation
(
func
):
...
...
@@ -279,12 +280,12 @@ class ComputerPartition(SlapDocument):
# Computer Partition data are fetch from server shall be delayed
@
_syncComputerPartitionInformation
def
request
(
self
,
software_release
,
software_type
,
partition_reference
,
shared
=
False
,
par
tition_parameter
_kw
=
None
,
filter_kw
=
None
):
if
par
tition_parameter
_kw
is
None
:
par
tition_parameter
_kw
=
{}
elif
not
isinstance
(
par
tition_parameter
_kw
,
dict
):
raise
ValueError
(
"Unexpected type of par
tition_parameter
_kw '%s'"
%
\
par
tition_parameter
_kw
)
shared
=
False
,
par
ameter_dict
_kw
=
None
,
filter_kw
=
None
):
if
par
ameter_dict
_kw
is
None
:
par
ameter_dict
_kw
=
{}
elif
not
isinstance
(
par
ameter_dict
_kw
,
dict
):
raise
ValueError
(
"Unexpected type of par
ameter_dict
_kw '%s'"
%
\
par
ameter_dict
_kw
)
if
filter_kw
is
None
:
filter_kw
=
{}
...
...
@@ -292,22 +293,22 @@ class ComputerPartition(SlapDocument):
raise
ValueError
(
"Unexpected type of filter_kw '%s'"
%
\
filter_kw
)
self
.
_connection_helper
.
POST
(
'/requestComputerPartition'
,
{
'computer_id'
:
self
.
_computer_id
,
json_parameter
=
json
.
dumps
({
'computer_id'
:
self
.
_computer_id
,
'computer_partition_id'
:
self
.
_partition_id
,
'software_release'
:
software_release
,
'software_type'
:
software_type
,
'partition_reference'
:
partition_reference
,
'shared_xml'
:
xml_marshaller
.
dumps
(
shared
),
'partition_parameter_xml'
:
xml_marshaller
.
dumps
(
partition_parameter_kw
),
'filter_xml'
:
xml_marshaller
.
dumps
(
filter_kw
),
})
xml
=
self
.
_connection_helper
.
response
.
read
()
software_instance
=
xml_marshaller
.
loads
(
xml
)
'shared'
:
json
.
dumps
(
shared
),
'parameter_dict'
:
json
.
dumps
(
parameter_dict_kw
),
'filter_json'
:
json
.
dumps
(
filter_kw
),
})
self
.
_connection_helper
.
POST
(
'/partition'
,
json_parameter
,
content_type
=
"application/json"
)
json_document
=
self
.
_connection_helper
.
response
.
read
()
software_instance
=
json
.
loads
(
json_document
)
computer_partition
=
ComputerPartition
(
software_instance
.
slap_computer_id
.
encode
(
'UTF-8'
),
software_instance
.
slap_computer_partition_id
.
encode
(
'UTF-8'
))
software_instance
[
'slap_computer_id'
]
.
encode
(
'UTF-8'
),
software_instance
[
'slap_computer_partition_id'
]
.
encode
(
'UTF-8'
))
return
computer_partition
def
building
(
self
):
...
...
@@ -367,10 +368,9 @@ class ComputerPartition(SlapDocument):
return
self
.
_software_release_document
def
setConnectionDict
(
self
,
connection_dict
):
self
.
_connection_helper
.
POST
(
'/setComputerPartitionConnectionXml'
,
{
'computer_id'
:
self
.
_computer_id
,
'computer_partition_id'
:
self
.
_partition_id
,
'connection_xml'
:
xml_marshaller
.
dumps
(
connection_dict
)})
self
.
_connection_helper
.
POST
(
'/%s/partition/%s'
%
(
self
.
_computer_id
,
self
.
_partition_id
),
json
.
dumps
(
connection_dict
),
'application/json'
)
@
_syncComputerPartitionInformation
def
getConnectionParameter
(
self
,
key
):
...
...
@@ -388,7 +388,7 @@ class ComputerPartition(SlapDocument):
self
.
_connection_helper
.
GET
(
'/getComputerPartitionCertificate?computer_id=%s&'
'computer_partition_id=%s'
%
(
self
.
_computer_id
,
self
.
_partition_id
))
return
xml_marshaller
.
loads
(
self
.
_connection_helper
.
response
.
read
())
return
json
.
loads
(
self
.
_connection_helper
.
response
.
read
())
# def lazyMethod(func):
# """
...
...
@@ -419,8 +419,21 @@ your machine and that the server is available. The original error was:"
self
.
master_ca_file
=
master_ca_file
def
getComputerInformation
(
self
,
computer_id
):
self
.
GET
(
'/getComputerInformation?computer_id=%s'
%
computer_id
)
return
xml_marshaller
.
loads
(
self
.
response
.
read
())
self
.
GET
(
'/%s'
%
computer_id
)
dict_computer
=
json
.
loads
(
self
.
response
.
read
())
# Build the computer object from our dict
# XXX-Cedric : would it be better to use dict_computer.get('couscous')?
computer
=
Computer
(
dict_computer
[
'computer_id'
])
computer
.
_software_release_list
=
[]
for
sr
in
dict_computer
[
'software_release_list'
]:
computer
.
_software_release_list
.
append
(
SoftwareRelease
(
software_release
=
sr
[
'software_release'
],
computer_guid
=
dict_computer
[
'computer_id'
]))
computer
.
_computer_partition_list
=
[]
for
partition
in
dict_computer
[
'computer_partition_list'
]:
computer
.
_computer_partition_list
.
append
(
partitiondict2partition
(
partition
))
return
computer
def
connect
(
self
):
connection_dict
=
dict
(
...
...
@@ -455,11 +468,14 @@ your machine and that the server is available. The original error was:"
def
POST
(
self
,
path
,
parameter_dict
,
content_type
=
"application/x-www-form-urlencoded"
):
# XXX-Cedric : we should change content_type to be json by default
try
:
self
.
connect
()
header_dict
=
{
'Content-type'
:
content_type
}
if
content_type
!=
'application/json'
:
parameter_dict
=
urllib
.
urlencode
(
parameter_dict
)
self
.
connection
.
request
(
"POST"
,
self
.
path
+
path
,
urllib
.
urlencode
(
parameter_dict
)
,
header_dict
)
parameter_dict
,
header_dict
)
except
socket
.
error
,
e
:
raise
socket
.
error
(
self
.
error_message_connect_fail
+
str
(
e
))
self
.
response
=
self
.
connection
.
getresponse
()
...
...
@@ -537,11 +553,12 @@ class slap:
Registers connected representation of computer partition and
returns Computer Partition class object
"""
self
.
_connection_helper
.
GET
(
'/registerComputerPartition?'
\
'computer_reference=%s&computer_partition_reference=%s'
%
(
# XXX-Cedric : we have a problem when computer_guid or partition_id have
# space. Should we forbid spaces? What about special chars?
self
.
_connection_helper
.
GET
(
'/%s/partition/%s'
%
(
computer_guid
,
partition_id
))
xml
=
self
.
_connection_helper
.
response
.
read
()
return
xml_marshaller
.
loads
(
xml
)
json_document
=
self
.
_connection_helper
.
response
.
read
()
return
partitiondict2partition
(
json
.
loads
(
json_document
)
)
def
registerOpenOrder
(
self
):
return
OpenOrder
()
...
...
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