Finish Magnum rework
- add coe service resource and proxy methods - add coe cluster certificates resource and methods - switch remaining cloud methods to use proxy - add coe docs Change-Id: I7532d03ad26785dccdcc37b19165c19246ebd6e1
This commit is contained in:
parent
b66c6cc847
commit
a27619cbf4
@ -96,6 +96,7 @@ control which services can be used.
|
|||||||
Block Storage v3 <proxies/block_storage_v3>
|
Block Storage v3 <proxies/block_storage_v3>
|
||||||
Clustering <proxies/clustering>
|
Clustering <proxies/clustering>
|
||||||
Compute <proxies/compute>
|
Compute <proxies/compute>
|
||||||
|
Container Infrastructure Management <proxies/container_infrastructure_management>
|
||||||
Database <proxies/database>
|
Database <proxies/database>
|
||||||
DNS <proxies/dns>
|
DNS <proxies/dns>
|
||||||
Identity v2 <proxies/identity_v2>
|
Identity v2 <proxies/identity_v2>
|
||||||
@ -133,6 +134,7 @@ The following services have exposed *Resource* classes.
|
|||||||
Block Storage <resources/block_storage/index>
|
Block Storage <resources/block_storage/index>
|
||||||
Clustering <resources/clustering/index>
|
Clustering <resources/clustering/index>
|
||||||
Compute <resources/compute/index>
|
Compute <resources/compute/index>
|
||||||
|
Container Infrastructure Management <resources/container_infrastructure_management/index>
|
||||||
Database <resources/database/index>
|
Database <resources/database/index>
|
||||||
DNS <resources/dns/index>
|
DNS <resources/dns/index>
|
||||||
Identity <resources/identity/index>
|
Identity <resources/identity/index>
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
Container Infrastructure Management
|
||||||
|
===================================
|
||||||
|
|
||||||
|
.. automodule:: openstack.container_infrastructure_management.v1._proxy
|
||||||
|
|
||||||
|
Cluster Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: create_cluster, delete_cluster, update_cluster, get_cluster,
|
||||||
|
find_cluster, clusters
|
||||||
|
|
||||||
|
Cluster Certificates Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: create_cluster_certificate, get_cluster_certificate
|
||||||
|
|
||||||
|
Cluster Templates Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: create_cluster_template, delete_cluster_template,
|
||||||
|
find_cluster_template,
|
||||||
|
get_cluster_template, cluster_templates, update_cluster_template
|
||||||
|
|
||||||
|
Service Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: services
|
@ -0,0 +1,12 @@
|
|||||||
|
openstack.container_infrastructure_management.v1.cluster
|
||||||
|
========================================================
|
||||||
|
|
||||||
|
.. automodule:: openstack.container_infrastructure_management.v1.cluster
|
||||||
|
|
||||||
|
The Cluster Class
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The ``Cluster`` class inherits from :class:`~openstack.resource.Resource`.
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1.cluster.Cluster
|
||||||
|
:members:
|
@ -0,0 +1,13 @@
|
|||||||
|
openstack.container_infrastructure_management.v1.cluster_certificate
|
||||||
|
====================================================================
|
||||||
|
|
||||||
|
.. automodule:: openstack.container_infrastructure_management.v1.cluster_certificate
|
||||||
|
|
||||||
|
The Cluster Certificate Class
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
The ``ClusterCertificate`` class inherits from
|
||||||
|
:class:`~openstack.resource.Resource`.
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1.cluster_certificate.ClusterCertificate
|
||||||
|
:members:
|
@ -0,0 +1,13 @@
|
|||||||
|
openstack.container_infrastructure_management.v1.cluster_template
|
||||||
|
=================================================================
|
||||||
|
|
||||||
|
.. automodule:: openstack.container_infrastructure_management.v1.cluster_template
|
||||||
|
|
||||||
|
The Cluster Template Class
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
The ``ClusterTemplate`` class inherits from
|
||||||
|
:class:`~openstack.resource.Resource`.
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1.cluster_template.ClusterTemplate
|
||||||
|
:members:
|
@ -0,0 +1,10 @@
|
|||||||
|
Container Infrastructure Management Resources
|
||||||
|
=============================================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
cluster
|
||||||
|
cluster_certificate
|
||||||
|
cluster_template
|
||||||
|
service
|
@ -0,0 +1,12 @@
|
|||||||
|
openstack.container_infrastructure_management.v1.service
|
||||||
|
========================================================
|
||||||
|
|
||||||
|
.. automodule:: openstack.container_infrastructure_management.v1.service
|
||||||
|
|
||||||
|
The Service Class
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The ``Service`` class inherits from :class:`~openstack.resource.Resource`.
|
||||||
|
|
||||||
|
.. autoclass:: openstack.container_infrastructure_management.v1.service.Service
|
||||||
|
:members:
|
@ -21,13 +21,6 @@ from openstack.cloud import exc
|
|||||||
|
|
||||||
class CoeCloudMixin:
|
class CoeCloudMixin:
|
||||||
|
|
||||||
@property
|
|
||||||
def _container_infra_client(self):
|
|
||||||
if 'container-infra' not in self._raw_clients:
|
|
||||||
self._raw_clients['container-infra'] = self._get_raw_client(
|
|
||||||
'container-infra')
|
|
||||||
return self._raw_clients['container-infra']
|
|
||||||
|
|
||||||
@_utils.cache_on_arguments()
|
@_utils.cache_on_arguments()
|
||||||
def list_coe_clusters(self):
|
def list_coe_clusters(self):
|
||||||
"""List COE (Container Orchestration Engine) cluster.
|
"""List COE (Container Orchestration Engine) cluster.
|
||||||
@ -157,13 +150,8 @@ class CoeCloudMixin:
|
|||||||
|
|
||||||
:returns: Details about the CA certificate for the given cluster.
|
:returns: Details about the CA certificate for the given cluster.
|
||||||
"""
|
"""
|
||||||
msg = ("Error fetching CA cert for the cluster {cluster_id}".format(
|
return self.container_infrastructure_management\
|
||||||
cluster_id=cluster_id))
|
.get_cluster_certificate(cluster_id)
|
||||||
url = "/certificates/{cluster_id}".format(cluster_id=cluster_id)
|
|
||||||
data = self._container_infra_client.get(url,
|
|
||||||
error_message=msg)
|
|
||||||
|
|
||||||
return self._get_and_munchify(key=None, data=data)
|
|
||||||
|
|
||||||
def sign_coe_cluster_certificate(self, cluster_id, csr):
|
def sign_coe_cluster_certificate(self, cluster_id, csr):
|
||||||
"""Sign client key and generate the CA certificate for a cluster
|
"""Sign client key and generate the CA certificate for a cluster
|
||||||
@ -177,17 +165,10 @@ class CoeCloudMixin:
|
|||||||
|
|
||||||
:raises: OpenStackCloudException on operation error.
|
:raises: OpenStackCloudException on operation error.
|
||||||
"""
|
"""
|
||||||
error_message = ("Error signing certs for cluster"
|
return self.container_infrastructure_management\
|
||||||
" {cluster_id}".format(cluster_id=cluster_id))
|
.create_cluster_certificate(
|
||||||
with _utils.shade_exceptions(error_message):
|
cluster_uuid=cluster_id,
|
||||||
body = {}
|
csr=csr)
|
||||||
body['cluster_uuid'] = cluster_id
|
|
||||||
body['csr'] = csr
|
|
||||||
|
|
||||||
certs = self._container_infra_client.post(
|
|
||||||
'/certificates', json=body)
|
|
||||||
|
|
||||||
return self._get_and_munchify(key=None, data=certs)
|
|
||||||
|
|
||||||
@_utils.cache_on_arguments()
|
@_utils.cache_on_arguments()
|
||||||
def list_cluster_templates(self, detail=False):
|
def list_cluster_templates(self, detail=False):
|
||||||
@ -325,153 +306,4 @@ class CoeCloudMixin:
|
|||||||
|
|
||||||
:raises: OpenStackCloudException on operation error.
|
:raises: OpenStackCloudException on operation error.
|
||||||
"""
|
"""
|
||||||
with _utils.shade_exceptions("Error fetching Magnum services list"):
|
return list(self.container_infrastructure_management.services())
|
||||||
data = self._container_infra_client.get('/mservices')
|
|
||||||
return self._normalize_magnum_services(
|
|
||||||
self._get_and_munchify('mservices', data))
|
|
||||||
|
|
||||||
def _normalize_coe_clusters(self, coe_clusters):
|
|
||||||
ret = []
|
|
||||||
for coe_cluster in coe_clusters:
|
|
||||||
ret.append(self._normalize_coe_cluster(coe_cluster))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _normalize_coe_cluster(self, coe_cluster):
|
|
||||||
"""Normalize Magnum COE cluster."""
|
|
||||||
|
|
||||||
# Only import munch when really necessary
|
|
||||||
import munch
|
|
||||||
|
|
||||||
coe_cluster = coe_cluster.copy()
|
|
||||||
|
|
||||||
# Discard noise
|
|
||||||
coe_cluster.pop('links', None)
|
|
||||||
|
|
||||||
c_id = coe_cluster.pop('uuid')
|
|
||||||
|
|
||||||
ret = munch.Munch(
|
|
||||||
id=c_id,
|
|
||||||
location=self._get_current_location(),
|
|
||||||
)
|
|
||||||
|
|
||||||
if not self.strict_mode:
|
|
||||||
ret['uuid'] = c_id
|
|
||||||
|
|
||||||
for key in (
|
|
||||||
'status',
|
|
||||||
'cluster_template_id',
|
|
||||||
'stack_id',
|
|
||||||
'keypair',
|
|
||||||
'master_count',
|
|
||||||
'create_timeout',
|
|
||||||
'node_count',
|
|
||||||
'name'):
|
|
||||||
if key in coe_cluster:
|
|
||||||
ret[key] = coe_cluster.pop(key)
|
|
||||||
|
|
||||||
ret['properties'] = coe_cluster
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _normalize_cluster_templates(self, cluster_templates):
|
|
||||||
ret = []
|
|
||||||
for cluster_template in cluster_templates:
|
|
||||||
ret.append(self._normalize_cluster_template(cluster_template))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _normalize_cluster_template(self, cluster_template):
|
|
||||||
"""Normalize Magnum cluster_templates."""
|
|
||||||
|
|
||||||
import munch
|
|
||||||
|
|
||||||
cluster_template = cluster_template.copy()
|
|
||||||
|
|
||||||
# Discard noise
|
|
||||||
cluster_template.pop('links', None)
|
|
||||||
cluster_template.pop('human_id', None)
|
|
||||||
# model_name is a magnumclient-ism
|
|
||||||
cluster_template.pop('model_name', None)
|
|
||||||
|
|
||||||
ct_id = cluster_template.pop('uuid')
|
|
||||||
|
|
||||||
ret = munch.Munch(
|
|
||||||
id=ct_id,
|
|
||||||
location=self._get_current_location(),
|
|
||||||
)
|
|
||||||
ret['is_public'] = cluster_template.pop('public')
|
|
||||||
ret['is_registry_enabled'] = cluster_template.pop('registry_enabled')
|
|
||||||
ret['is_tls_disabled'] = cluster_template.pop('tls_disabled')
|
|
||||||
# pop floating_ip_enabled since we want to hide it in a future patch
|
|
||||||
fip_enabled = cluster_template.pop('floating_ip_enabled', None)
|
|
||||||
if not self.strict_mode:
|
|
||||||
ret['uuid'] = ct_id
|
|
||||||
if fip_enabled is not None:
|
|
||||||
ret['floating_ip_enabled'] = fip_enabled
|
|
||||||
ret['public'] = ret['is_public']
|
|
||||||
ret['registry_enabled'] = ret['is_registry_enabled']
|
|
||||||
ret['tls_disabled'] = ret['is_tls_disabled']
|
|
||||||
|
|
||||||
# Optional keys
|
|
||||||
for (key, default) in (
|
|
||||||
('fixed_network', None),
|
|
||||||
('fixed_subnet', None),
|
|
||||||
('http_proxy', None),
|
|
||||||
('https_proxy', None),
|
|
||||||
('labels', {}),
|
|
||||||
('master_flavor_id', None),
|
|
||||||
('no_proxy', None)):
|
|
||||||
if key in cluster_template:
|
|
||||||
ret[key] = cluster_template.pop(key, default)
|
|
||||||
|
|
||||||
for key in (
|
|
||||||
'apiserver_port',
|
|
||||||
'cluster_distro',
|
|
||||||
'coe',
|
|
||||||
'created_at',
|
|
||||||
'dns_nameserver',
|
|
||||||
'docker_volume_size',
|
|
||||||
'external_network_id',
|
|
||||||
'flavor_id',
|
|
||||||
'image_id',
|
|
||||||
'insecure_registry',
|
|
||||||
'keypair_id',
|
|
||||||
'name',
|
|
||||||
'network_driver',
|
|
||||||
'server_type',
|
|
||||||
'updated_at',
|
|
||||||
'volume_driver'):
|
|
||||||
ret[key] = cluster_template.pop(key)
|
|
||||||
|
|
||||||
ret['properties'] = cluster_template
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _normalize_magnum_services(self, magnum_services):
|
|
||||||
ret = []
|
|
||||||
for magnum_service in magnum_services:
|
|
||||||
ret.append(self._normalize_magnum_service(magnum_service))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _normalize_magnum_service(self, magnum_service):
|
|
||||||
"""Normalize Magnum magnum_services."""
|
|
||||||
import munch
|
|
||||||
magnum_service = magnum_service.copy()
|
|
||||||
|
|
||||||
# Discard noise
|
|
||||||
magnum_service.pop('links', None)
|
|
||||||
magnum_service.pop('human_id', None)
|
|
||||||
# model_name is a magnumclient-ism
|
|
||||||
magnum_service.pop('model_name', None)
|
|
||||||
|
|
||||||
ret = munch.Munch(location=self._get_current_location())
|
|
||||||
|
|
||||||
for key in (
|
|
||||||
'binary',
|
|
||||||
'created_at',
|
|
||||||
'disabled_reason',
|
|
||||||
'host',
|
|
||||||
'id',
|
|
||||||
'report_count',
|
|
||||||
'state',
|
|
||||||
'updated_at'):
|
|
||||||
ret[key] = magnum_service.pop(key)
|
|
||||||
ret['properties'] = magnum_service
|
|
||||||
return ret
|
|
||||||
|
@ -13,9 +13,15 @@
|
|||||||
from openstack.container_infrastructure_management.v1 import (
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
cluster as _cluster
|
cluster as _cluster
|
||||||
)
|
)
|
||||||
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
|
cluster_certificate as _cluster_cert
|
||||||
|
)
|
||||||
from openstack.container_infrastructure_management.v1 import (
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
cluster_template as _cluster_template
|
cluster_template as _cluster_template
|
||||||
)
|
)
|
||||||
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
|
service as _service
|
||||||
|
)
|
||||||
from openstack import proxy
|
from openstack import proxy
|
||||||
|
|
||||||
|
|
||||||
@ -24,6 +30,7 @@ class Proxy(proxy.Proxy):
|
|||||||
_resource_registry = {
|
_resource_registry = {
|
||||||
"cluster": _cluster.Cluster,
|
"cluster": _cluster.Cluster,
|
||||||
"cluster_template": _cluster_template.ClusterTemplate,
|
"cluster_template": _cluster_template.ClusterTemplate,
|
||||||
|
"service": _service.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
def create_cluster(self, **attrs):
|
def create_cluster(self, **attrs):
|
||||||
@ -207,3 +214,41 @@ class Proxy(proxy.Proxy):
|
|||||||
return self._update(
|
return self._update(
|
||||||
_cluster_template.ClusterTemplate, cluster_template, **attrs
|
_cluster_template.ClusterTemplate, cluster_template, **attrs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ============== Cluster Certificates ==============
|
||||||
|
def create_cluster_certificate(self, **attrs):
|
||||||
|
"""Create a new cluster_certificate from CSR
|
||||||
|
|
||||||
|
:param dict attrs: Keyword arguments which will be used to create a
|
||||||
|
:class:`~openstack.container_infrastructure_management.v1.cluster_certificate.ClusterCertificate`,
|
||||||
|
comprised of the properties on the ClusterCertificate class.
|
||||||
|
:returns: The results of cluster_certificate creation
|
||||||
|
:rtype:
|
||||||
|
:class:`~openstack.container_infrastructure_management.v1.cluster_certificate.ClusterCertificate`
|
||||||
|
"""
|
||||||
|
return self._create(_cluster_cert.ClusterCertificate, **attrs)
|
||||||
|
|
||||||
|
def get_cluster_certificate(self, cluster_certificate):
|
||||||
|
"""Get a single cluster_certificate
|
||||||
|
|
||||||
|
:param cluster_certificate: The value can be the ID of a
|
||||||
|
cluster_certificate or a
|
||||||
|
:class:`~openstack.container_infrastructure_management.v1.cluster_certificate.ClusterCertificate`
|
||||||
|
instance.
|
||||||
|
|
||||||
|
:returns: One
|
||||||
|
:class:`~openstack.container_infrastructure_management.v1.cluster_certificate.ClusterCertificate`
|
||||||
|
:raises: :class:`~openstack.exceptions.ResourceNotFound`
|
||||||
|
when no resource can be found.
|
||||||
|
"""
|
||||||
|
return self._get(_cluster_cert.ClusterCertificate, cluster_certificate)
|
||||||
|
|
||||||
|
# ============== Services ==============
|
||||||
|
def services(self):
|
||||||
|
"""Return a generator of services
|
||||||
|
|
||||||
|
:returns: A generator of service objects
|
||||||
|
:rtype:
|
||||||
|
:class:`~openstack.container_infrastructure_management.v1.service.Service`
|
||||||
|
"""
|
||||||
|
return self._list(_service.Service)
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack import resource
|
||||||
|
|
||||||
|
|
||||||
|
class ClusterCertificate(resource.Resource):
|
||||||
|
|
||||||
|
base_path = '/certificates'
|
||||||
|
|
||||||
|
# capabilities
|
||||||
|
allow_create = True
|
||||||
|
allow_list = False
|
||||||
|
allow_fetch = True
|
||||||
|
|
||||||
|
#: The UUID of the bay.
|
||||||
|
bay_uuid = resource.Body('bay_uuid')
|
||||||
|
#: The UUID of the cluster.
|
||||||
|
cluster_uuid = resource.Body('cluster_uuid', alternate_id=True)
|
||||||
|
#: Certificate Signing Request (CSR) for authenticating client key.
|
||||||
|
csr = resource.Body('csr')
|
||||||
|
#: CA certificate for the bay/cluster.
|
||||||
|
pem = resource.Body('pem')
|
38
openstack/container_infrastructure_management/v1/service.py
Normal file
38
openstack/container_infrastructure_management/v1/service.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack import resource
|
||||||
|
|
||||||
|
|
||||||
|
class Service(resource.Resource):
|
||||||
|
|
||||||
|
resources_key = 'mservices'
|
||||||
|
base_path = '/mservices'
|
||||||
|
|
||||||
|
# capabilities
|
||||||
|
allow_list = True
|
||||||
|
|
||||||
|
#: The name of the binary form of the Magnum service.
|
||||||
|
binary = resource.Body('binary')
|
||||||
|
#: The date and time when the resource was created.
|
||||||
|
created_at = resource.Body('created_at')
|
||||||
|
#: The disable reason of the service, null if the service is enabled or
|
||||||
|
#: disabled without reason provided.
|
||||||
|
disabled_reason = resource.Body('disabled_reason')
|
||||||
|
#: The host for the service.
|
||||||
|
host = resource.Body('host')
|
||||||
|
#: The total number of report.
|
||||||
|
report_count = resource.Body('report_count')
|
||||||
|
#: The current state of Magnum services.
|
||||||
|
state = resource.Body('state')
|
||||||
|
#: The date and time when the resource was updated.
|
||||||
|
updated_at = resource.Body('updated_at')
|
@ -11,18 +11,19 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
import munch
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
|
cluster_certificate
|
||||||
|
)
|
||||||
from openstack.tests.unit import base
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
coe_cluster_ca_obj = munch.Munch(
|
coe_cluster_ca_obj = dict(
|
||||||
cluster_uuid="43e305ce-3a5f-412a-8a14-087834c34c8c",
|
cluster_uuid="43e305ce-3a5f-412a-8a14-087834c34c8c",
|
||||||
pem="-----BEGIN CERTIFICATE-----\nMIIDAO\n-----END CERTIFICATE-----\n",
|
pem="-----BEGIN CERTIFICATE-----\nMIIDAO\n-----END CERTIFICATE-----\n",
|
||||||
bay_uuid="43e305ce-3a5f-412a-8a14-087834c34c8c",
|
bay_uuid="43e305ce-3a5f-412a-8a14-087834c34c8c",
|
||||||
links=[]
|
links=[]
|
||||||
)
|
)
|
||||||
|
|
||||||
coe_cluster_signed_cert_obj = munch.Munch(
|
coe_cluster_signed_cert_obj = dict(
|
||||||
cluster_uuid='43e305ce-3a5f-412a-8a14-087834c34c8c',
|
cluster_uuid='43e305ce-3a5f-412a-8a14-087834c34c8c',
|
||||||
pem='-----BEGIN CERTIFICATE-----\nMIIDAO\n-----END CERTIFICATE-----',
|
pem='-----BEGIN CERTIFICATE-----\nMIIDAO\n-----END CERTIFICATE-----',
|
||||||
bay_uuid='43e305ce-3a5f-412a-8a14-087834c34c8c',
|
bay_uuid='43e305ce-3a5f-412a-8a14-087834c34c8c',
|
||||||
@ -33,6 +34,12 @@ coe_cluster_signed_cert_obj = munch.Munch(
|
|||||||
|
|
||||||
|
|
||||||
class TestCOEClusters(base.TestCase):
|
class TestCOEClusters(base.TestCase):
|
||||||
|
def _compare_cluster_certs(self, exp, real):
|
||||||
|
self.assertDictEqual(
|
||||||
|
cluster_certificate.ClusterCertificate(
|
||||||
|
**exp).to_dict(computed=False),
|
||||||
|
real.to_dict(computed=False),
|
||||||
|
)
|
||||||
|
|
||||||
def get_mock_url(
|
def get_mock_url(
|
||||||
self,
|
self,
|
||||||
@ -47,12 +54,12 @@ class TestCOEClusters(base.TestCase):
|
|||||||
method='GET',
|
method='GET',
|
||||||
uri=self.get_mock_url(
|
uri=self.get_mock_url(
|
||||||
resource='certificates',
|
resource='certificates',
|
||||||
append=[coe_cluster_ca_obj.cluster_uuid]),
|
append=[coe_cluster_ca_obj['cluster_uuid']]),
|
||||||
json=coe_cluster_ca_obj)
|
json=coe_cluster_ca_obj)
|
||||||
])
|
])
|
||||||
ca_cert = self.cloud.get_coe_cluster_certificate(
|
ca_cert = self.cloud.get_coe_cluster_certificate(
|
||||||
coe_cluster_ca_obj.cluster_uuid)
|
coe_cluster_ca_obj['cluster_uuid'])
|
||||||
self.assertEqual(
|
self._compare_cluster_certs(
|
||||||
coe_cluster_ca_obj,
|
coe_cluster_ca_obj,
|
||||||
ca_cert)
|
ca_cert)
|
||||||
self.assert_calls()
|
self.assert_calls()
|
||||||
@ -61,10 +68,10 @@ class TestCOEClusters(base.TestCase):
|
|||||||
self.register_uris([dict(
|
self.register_uris([dict(
|
||||||
method='POST',
|
method='POST',
|
||||||
uri=self.get_mock_url(resource='certificates'),
|
uri=self.get_mock_url(resource='certificates'),
|
||||||
json={"cluster_uuid": coe_cluster_signed_cert_obj.cluster_uuid,
|
json={"cluster_uuid": coe_cluster_signed_cert_obj['cluster_uuid'],
|
||||||
"csr": coe_cluster_signed_cert_obj.csr}
|
"csr": coe_cluster_signed_cert_obj['csr']}
|
||||||
)])
|
)])
|
||||||
self.cloud.sign_coe_cluster_certificate(
|
self.cloud.sign_coe_cluster_certificate(
|
||||||
coe_cluster_signed_cert_obj.cluster_uuid,
|
coe_cluster_signed_cert_obj['cluster_uuid'],
|
||||||
coe_cluster_signed_cert_obj.csr)
|
coe_cluster_signed_cert_obj['csr'])
|
||||||
self.assert_calls()
|
self.assert_calls()
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from openstack.container_infrastructure_management.v1 import service
|
||||||
from openstack.tests.unit import base
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
|
|
||||||
@ -18,7 +19,6 @@ magnum_service_obj = dict(
|
|||||||
created_at='2015-08-27T09:49:58-05:00',
|
created_at='2015-08-27T09:49:58-05:00',
|
||||||
disabled_reason=None,
|
disabled_reason=None,
|
||||||
host='fake-host',
|
host='fake-host',
|
||||||
human_id=None,
|
|
||||||
id=1,
|
id=1,
|
||||||
report_count=1,
|
report_count=1,
|
||||||
state='up',
|
state='up',
|
||||||
@ -37,6 +37,7 @@ class TestMagnumServices(base.TestCase):
|
|||||||
json=dict(mservices=[magnum_service_obj]))])
|
json=dict(mservices=[magnum_service_obj]))])
|
||||||
mservices_list = self.cloud.list_magnum_services()
|
mservices_list = self.cloud.list_magnum_services()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
mservices_list[0],
|
mservices_list[0].to_dict(computed=False),
|
||||||
self.cloud._normalize_magnum_service(magnum_service_obj))
|
service.Service(**magnum_service_obj).to_dict(computed=False),
|
||||||
|
)
|
||||||
self.assert_calls()
|
self.assert_calls()
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
|
cluster_certificate
|
||||||
|
)
|
||||||
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
|
EXAMPLE = {
|
||||||
|
"cluster_uuid": "0b4b766f-1500-44b3-9804-5a6e12fe6df4",
|
||||||
|
"pem": "-----BEGIN CERTIFICATE-----\nMIICzDCCAbSgAwIBAgIQOOkVcEN7TNa9E80G",
|
||||||
|
"bay_uuid": "0b4b766f-1500-44b3-9804-5a6e12fe6df4",
|
||||||
|
"csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIIEfzCCAmcCAQAwFDESMBAGA1UE"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TestClusterCertificate(base.TestCase):
|
||||||
|
def test_basic(self):
|
||||||
|
sot = cluster_certificate.ClusterCertificate()
|
||||||
|
self.assertIsNone(sot.resource_key)
|
||||||
|
self.assertEqual('/certificates', sot.base_path)
|
||||||
|
self.assertTrue(sot.allow_create)
|
||||||
|
self.assertTrue(sot.allow_fetch)
|
||||||
|
self.assertFalse(sot.allow_commit)
|
||||||
|
self.assertFalse(sot.allow_delete)
|
||||||
|
self.assertFalse(sot.allow_list)
|
||||||
|
|
||||||
|
def test_make_it(self):
|
||||||
|
sot = cluster_certificate.ClusterCertificate(**EXAMPLE)
|
||||||
|
|
||||||
|
self.assertEqual(EXAMPLE['cluster_uuid'], sot.cluster_uuid)
|
||||||
|
self.assertEqual(EXAMPLE['bay_uuid'], sot.bay_uuid)
|
||||||
|
self.assertEqual(EXAMPLE['csr'], sot.csr)
|
||||||
|
self.assertEqual(EXAMPLE['pem'], sot.pem)
|
@ -10,9 +10,13 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from openstack.container_infrastructure_management.v1 import (
|
||||||
|
cluster_certificate
|
||||||
|
)
|
||||||
from openstack.container_infrastructure_management.v1 import _proxy
|
from openstack.container_infrastructure_management.v1 import _proxy
|
||||||
from openstack.container_infrastructure_management.v1 import cluster
|
from openstack.container_infrastructure_management.v1 import cluster
|
||||||
from openstack.container_infrastructure_management.v1 import cluster_template
|
from openstack.container_infrastructure_management.v1 import cluster_template
|
||||||
|
from openstack.container_infrastructure_management.v1 import service
|
||||||
from openstack.tests.unit import test_proxy_base
|
from openstack.tests.unit import test_proxy_base
|
||||||
|
|
||||||
|
|
||||||
@ -52,6 +56,20 @@ class TestCluster(TestMagnumProxy):
|
|||||||
self.verify_delete(self.proxy.delete_cluster, cluster.Cluster, True)
|
self.verify_delete(self.proxy.delete_cluster, cluster.Cluster, True)
|
||||||
|
|
||||||
|
|
||||||
|
class TestClusterCertificate(TestMagnumProxy):
|
||||||
|
def test_cluster_certificate_get(self):
|
||||||
|
self.verify_get(
|
||||||
|
self.proxy.get_cluster_certificate,
|
||||||
|
cluster_certificate.ClusterCertificate
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_cluster_certificate_create_attrs(self):
|
||||||
|
self.verify_create(
|
||||||
|
self.proxy.create_cluster_certificate,
|
||||||
|
cluster_certificate.ClusterCertificate,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestClusterTemplate(TestMagnumProxy):
|
class TestClusterTemplate(TestMagnumProxy):
|
||||||
def test_cluster_template_get(self):
|
def test_cluster_template_get(self):
|
||||||
self.verify_get(
|
self.verify_get(
|
||||||
@ -93,3 +111,14 @@ class TestClusterTemplate(TestMagnumProxy):
|
|||||||
cluster_template.ClusterTemplate,
|
cluster_template.ClusterTemplate,
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestService(TestMagnumProxy):
|
||||||
|
|
||||||
|
def test_services(self):
|
||||||
|
self.verify_list(
|
||||||
|
self.proxy.services,
|
||||||
|
service.Service,
|
||||||
|
method_kwargs={},
|
||||||
|
expected_kwargs={},
|
||||||
|
)
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack.container_infrastructure_management.v1 import service
|
||||||
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
|
EXAMPLE = {
|
||||||
|
"binary": "magnum-conductor",
|
||||||
|
"created_at": "2016-08-23T10:52:13+00:00",
|
||||||
|
"state": "up",
|
||||||
|
"report_count": 2179,
|
||||||
|
"updated_at": "2016-08-25T01:13:16+00:00",
|
||||||
|
"host": "magnum-manager",
|
||||||
|
"disabled_reason": None,
|
||||||
|
"id": 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TestService(base.TestCase):
|
||||||
|
def test_basic(self):
|
||||||
|
sot = service.Service()
|
||||||
|
self.assertIsNone(sot.resource_key)
|
||||||
|
self.assertEqual('mservices', sot.resources_key)
|
||||||
|
self.assertEqual('/mservices', sot.base_path)
|
||||||
|
self.assertFalse(sot.allow_create)
|
||||||
|
self.assertFalse(sot.allow_fetch)
|
||||||
|
self.assertFalse(sot.allow_commit)
|
||||||
|
self.assertFalse(sot.allow_delete)
|
||||||
|
self.assertTrue(sot.allow_list)
|
||||||
|
|
||||||
|
def test_make_it(self):
|
||||||
|
sot = service.Service(**EXAMPLE)
|
||||||
|
|
||||||
|
self.assertEqual(EXAMPLE['binary'], sot.binary)
|
||||||
|
self.assertEqual(EXAMPLE['created_at'], sot.created_at)
|
||||||
|
self.assertEqual(EXAMPLE['disabled_reason'], sot.disabled_reason)
|
||||||
|
self.assertEqual(EXAMPLE['host'], sot.host)
|
||||||
|
self.assertEqual(EXAMPLE['report_count'], sot.report_count)
|
||||||
|
self.assertEqual(EXAMPLE['state'], sot.state)
|
||||||
|
self.assertEqual(EXAMPLE['updated_at'], sot.updated_at)
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Convert container_infrastructure_management cloud operations to rely fully
|
||||||
|
on service proxy with all resource classes created.
|
Loading…
Reference in New Issue
Block a user