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
Lisa Casino
slapos.core
Commits
35ca1295
Commit
35ca1295
authored
Jul 06, 2017
by
Alain Takoudjou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
slapos_cloud: add constrain to check caucase web service configuration
parent
8ca07000
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
521 additions
and
10 deletions
+521
-10
master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.py
...entTemplateItem/portal_components/document.erp5.Person.py
+2
-2
master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.SoftwareInstance.py
...eItem/portal_components/document.erp5.SoftwareInstance.py
+2
-2
master/bt5/slapos_cloud/ExtensionTemplateItem/portal_components/extension.erp5.Caucase.py
...nTemplateItem/portal_components/extension.erp5.Caucase.py
+98
-0
master/bt5/slapos_cloud/ExtensionTemplateItem/portal_components/extension.erp5.Caucase.xml
...TemplateItem/portal_components/extension.erp5.Caucase.xml
+123
-0
master/bt5/slapos_cloud/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml
...eAllowedContentTypeTemplateItem/allowed_content_types.xml
+3
-3
master/bt5/slapos_cloud/PortalTypePropertySheetTemplateItem/property_sheet_list.xml
...rtalTypePropertySheetTemplateItem/property_sheet_list.xml
+1
-1
master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/CaucaseRESTClientAdapterCheckConstraint.xml
...operty_sheets/CaucaseRESTClientAdapterCheckConstraint.xml
+66
-0
master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/CaucaseRESTClientAdapterCheckConstraint/caucase_adapter_consistency_constraint_constraint.xml
...int/caucase_adapter_consistency_constraint_constraint.xml
+80
-0
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_checkCaucaseConsistency.py
..._web_service/CaucaseRESTClient_checkCaucaseConsistency.py
+24
-0
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_checkCaucaseConsistency.xml
...web_service/CaucaseRESTClient_checkCaucaseConsistency.xml
+62
-0
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_configureCaucase.xml
...s/erp5_web_service/CaucaseRESTClient_configureCaucase.xml
+28
-0
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_getSecureServiceUrl.xml
...rp5_web_service/CaucaseRESTClient_getSecureServiceUrl.xml
+28
-0
master/bt5/slapos_cloud/bt/template_extension_id_list
master/bt5/slapos_cloud/bt/template_extension_id_list
+2
-1
master/bt5/slapos_cloud/bt/template_property_sheet_id_list
master/bt5/slapos_cloud/bt/template_property_sheet_id_list
+2
-1
No files found.
master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.py
View file @
35ca1295
...
...
@@ -20,7 +20,7 @@ class Person(ERP5Person):
def
getPersonCertificateList
(
self
):
return
[
x
for
x
in
self
.
contentValues
(
portal_type
=
"Certificate
Access ID
"
)
self
.
contentValues
(
portal_type
=
"Certificate
Login
"
)
if
x
.
getValidationState
()
==
'validated'
]
security
.
declarePublic
(
'signCertificate'
)
...
...
@@ -39,7 +39,7 @@ class Person(ERP5Person):
# link to the user
certificate_id
=
self
.
newContent
(
portal_type
=
"Certificate
Access ID
"
,
portal_type
=
"Certificate
Login
"
,
reference
=
crt_id
,
url_string
=
url
)
...
...
master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.SoftwareInstance.py
View file @
35ca1295
...
...
@@ -71,7 +71,7 @@ class SoftwareInstance(Item):
def
_getInstanceCertificate
(
self
):
certificate_id_list
=
[
x
for
x
in
self
.
contentValues
(
portal_type
=
"Certificate
Access ID
"
)
self
.
contentValues
(
portal_type
=
"Certificate
Login
"
)
if
x
.
getValidationState
()
==
'validated'
]
if
certificate_id_list
:
...
...
@@ -112,7 +112,7 @@ class SoftwareInstance(Item):
# link to the Instance
certificate_id
=
self
.
newContent
(
portal_type
=
"Certificate
Access ID
"
,
portal_type
=
"Certificate
Login
"
,
reference
=
crt_id
,
url_string
=
url
)
...
...
master/bt5/slapos_cloud/ExtensionTemplateItem/portal_components/extension.erp5.Caucase.py
0 → 100644
View file @
35ca1295
###############################################################################
#
# Copyright (c) 2002-2011 Nexedi SA 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 General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
urlparse
import
urlparse
,
urljoin
import
ssl
import
string
import
random
import
urllib2
import
urllib
def
generatePassword
():
return
''
.
join
(
random
.
choice
(
string
.
ascii_uppercase
+
string
.
ascii_lowercase
+
string
.
digits
)
for
_
in
range
(
16
))
def
getCaucaseUrl
(
promise_url
):
parse_url
=
urlparse
(
promise_url
)
if
parse_url
.
scheme
==
'http'
:
if
parse_url
.
port
:
# Always consider caucase https port is http port + 1
https_port
=
parse_url
.
port
+
1
port_index
=
parse_url
.
netloc
.
rindex
(
'%s'
%
parse_url
.
port
)
return
(
parse_url
.
hostname
,
'https://%s%s/%s'
%
(
parse_url
.
netloc
[:
port_index
],
https_port
,
parse_url
.
path
))
else
:
return
(
parse_url
.
hostname
,
'https://%s%s'
%
(
parse_url
.
netloc
,
parse_url
.
path
))
else
:
return
parse_url
.
hostname
,
promise_url
def
getCaucaseServiceUrl
(
self
,
promise_url
):
return
getCaucaseUrl
(
promise_url
)
def
configureCaucase
(
self
,
promise_url
):
if
not
promise_url
:
return
ca_service
=
self
.
getPortalObject
().
portal_web_services
.
caucase_adapter
hostname
,
caucase_url
=
getCaucaseUrl
(
promise_url
)
# XXX - we should create a valid ssl context from caucase
context
=
ssl
.
_create_unverified_context
()
response
=
urllib2
.
urlopen
(
caucase_url
,
context
=
context
)
if
response
.
getcode
()
!=
200
:
raise
ValueError
(
'Server responded with status=%r, url=%r, body=%r'
%
(
response
.
getcode
(),
caucase_url
,
response
.
read
(),
))
if
response
.
geturl
().
endswith
(
'admin/configure'
):
# no password set, we where redirected to set password page
# set a new password
password
=
generatePassword
()
passwd_url
=
urljoin
(
caucase_url
,
'/admin/setpassword'
)
request_dict
=
{
'password'
:
password
}
request
=
urllib2
.
Request
(
passwd_url
,
urllib
.
urlencode
(
request_dict
))
response
=
urllib2
.
urlopen
(
request
,
context
=
context
)
if
response
.
getcode
()
!=
200
:
raise
ValueError
(
'Server responded with status=%r, url=%r, body=%r'
%
(
response
.
getcode
(),
passwd_url
,
response
.
read
(),
))
ca_service
.
edit
(
source_hostname
=
hostname
,
url_string
=
caucase_url
,
user_id
=
'admin'
,
password
=
password
)
else
:
ca_service
.
edit
(
source_hostname
=
hostname
,
url_string
=
caucase_url
)
if
ca_service
.
getValidationState
()
!=
'validated'
:
ca_service
.
validate
()
master/bt5/slapos_cloud/ExtensionTemplateItem/portal_components/extension.erp5.Caucase.xml
0 → 100644
View file @
35ca1295
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Extension Component"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
Caucase
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
extension.erp5.Caucase
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Extension Component
</string>
</value>
</item>
<item>
<key>
<string>
sid
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
text_content_error_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<string>
erp5
</string>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.patches.WorkflowTool"
/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
validate
</string>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
validated
</string>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml
View file @
35ca1295
<allowed_content_type_list>
<portal_type
id=
"Computer"
>
<item>
Certificate
Access ID
</item>
<item>
Certificate
Login
</item>
</portal_type>
<portal_type
id=
"Hosting Subscription Module"
>
<item>
Hosting Subscription
</item>
</portal_type>
<portal_type
id=
"Person"
>
<item>
Certificate
Access ID
</item>
<item>
Certificate
Login
</item>
</portal_type>
<portal_type
id=
"Software Installation Module"
>
<item>
Software Installation
</item>
</portal_type>
<portal_type
id=
"Software Instance"
>
<item>
Certificate
Access ID
</item>
<item>
Certificate
Login
</item>
</portal_type>
<portal_type
id=
"Software Instance Module"
>
<item>
Slave Instance
</item>
...
...
master/bt5/slapos_cloud/PortalTypePropertySheetTemplateItem/property_sheet_list.xml
View file @
35ca1295
...
...
@@ -7,7 +7,7 @@
<item>
RESTClientInterface
</item>
<item>
Url
</item>
</portal_type>
<portal_type
id=
"Certificate
Access ID
"
>
<portal_type
id=
"Certificate
Login
"
>
<item>
Reference
</item>
<item>
Url
</item>
</portal_type>
...
...
master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/CaucaseRESTClientAdapterCheckConstraint.xml
0 → 100644
View file @
35ca1295
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Property Sheet"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_count
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
_mt_index
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
_tree
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
CaucaseRESTClientAdapterCheckConstraint
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Property Sheet
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"Length"
module=
"BTrees.Length"
/>
</pickle>
<pickle>
<int>
0
</int>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"OOBTree"
module=
"BTrees.OOBTree"
/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"OOBTree"
module=
"BTrees.OOBTree"
/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/PropertySheetTemplateItem/portal_property_sheets/CaucaseRESTClientAdapterCheckConstraint/caucase_adapter_consistency_constraint_constraint.xml
0 → 100644
View file @
35ca1295
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Script Constraint"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_identity_criterion
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
_range_criterion
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
constraint_type/post_upgrade
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
caucase_adapter_consistency_constraint_constraint
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Script Constraint
</string>
</value>
</item>
<item>
<key>
<string>
script_id
</string>
</key>
<value>
<string>
CaucaseRESTClient_checkCaucaseConsistency
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_checkCaucaseConsistency.py
0 → 100644
View file @
35ca1295
portal
=
context
.
getPortalObject
()
error_list
=
[]
if
context
.
getId
()
!=
"caucase_adapter"
:
return
error_list
caucase_service
=
portal
.
portal_web_services
.
caucase_adapter
promise_caucase_url
=
portal
.
getPromiseParameter
(
'external_service'
,
'caucase_url'
)
if
promise_caucase_url
is
not
None
:
url_string
=
caucase_service
.
getUrlString
()
_
,
caucase_url
=
context
.
CaucaseRESTClient_getSecureServiceUrl
(
promise_caucase_url
)
if
not
url_string
or
not
caucase_service
.
getPassword
()
\
or
not
caucase_service
.
getUserId
():
error_list
.
append
(
"Caucase web service is not configured!"
)
elif
caucase_url
.
rstrip
(
'/'
)
!=
url_string
.
rstrip
(
'/'
):
# caucase URL was modified
error_list
.
append
(
"Caucase web service is not configured as Expected: %s"
%
"Expect as url_string: %s
\
n
Got %s"
%
(
caucase_url
,
url_string
))
if
len
(
error_list
)
>
0
and
fixit
:
context
.
CaucaseRESTClient_configureCaucase
(
promise_caucase_url
)
return
error_list
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_checkCaucaseConsistency.xml
0 → 100644
View file @
35ca1295
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
fixit=False, activate_kw={}, **kw
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
CaucaseRESTClient_checkCaucaseConsistency
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_configureCaucase.xml
0 → 100644
View file @
35ca1295
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ExternalMethod"
module=
"Products.ExternalMethod.ExternalMethod"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_function
</string>
</key>
<value>
<string>
configureCaucase
</string>
</value>
</item>
<item>
<key>
<string>
_module
</string>
</key>
<value>
<string>
Caucase
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
CaucaseRESTClient_configureCaucase
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Caucase REST Client Interface Configuration
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/SkinTemplateItem/portal_skins/erp5_web_service/CaucaseRESTClient_getSecureServiceUrl.xml
0 → 100644
View file @
35ca1295
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ExternalMethod"
module=
"Products.ExternalMethod.ExternalMethod"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_function
</string>
</key>
<value>
<string>
getCaucaseServiceUrl
</string>
</value>
</item>
<item>
<key>
<string>
_module
</string>
</key>
<value>
<string>
Caucase
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
CaucaseRESTClient_getSecureServiceUrl
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/bt/template_extension_id_list
View file @
35ca1295
extension.erp5.SlapOSCloud
extension.erp5.SlapOSSecurity
extension.erp5.Caucase
\ No newline at end of file
master/bt5/slapos_cloud/bt/template_property_sheet_id_list
View file @
35ca1295
...
...
@@ -12,3 +12,4 @@ SlaposAssignmentConstraint
SlaposEmailConstraint
SlaposComputerConstraint
RESTClientInterface
CaucaseRESTClientAdapterCheckConstraint
\ No newline at end of file
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