Skip to content

Commit abafc6e

Browse files
Jenkinsopenstack-gerrit
Jenkins
authored andcommitted
Merge "Add cluster to cert commands"
2 parents e974f5a + 8aed31a commit abafc6e

File tree

6 files changed

+106
-71
lines changed

6 files changed

+106
-71
lines changed

magnum/api/controllers/v1/certificate.py

+39-27
Original file line numberDiff line numberDiff line change
@@ -35,31 +35,35 @@ class Certificate(base.APIBase):
3535
certificate.
3636
"""
3737

38-
_bay_uuid = None
39-
"""uuid or logical name of bay"""
38+
_cluster_uuid = None
39+
"""uuid or logical name of cluster"""
4040

41-
_bay = None
41+
_cluster = None
4242

43-
def _get_bay_uuid(self):
44-
return self._bay_uuid
43+
def _get_cluster_uuid(self):
44+
return self._cluster_uuid
4545

46-
def _set_bay_uuid(self, value):
47-
if value and self._bay_uuid != value:
46+
def _set_cluster_uuid(self, value):
47+
if value and self._cluster_uuid != value:
4848
try:
49-
self._bay = api_utils.get_resource('Bay', value)
50-
self._bay_uuid = self._bay.uuid
49+
self._cluster = api_utils.get_resource('Bay', value)
50+
self._cluster_uuid = self._cluster.uuid
5151
except exception.ClusterNotFound as e:
5252
# Change error code because 404 (NotFound) is inappropriate
5353
# response for a POST request to create a Bay
5454
e.code = 400 # BadRequest
5555
raise
5656
elif value == wtypes.Unset:
57-
self._bay_uuid = wtypes.Unset
57+
self._cluster_uuid = wtypes.Unset
5858

59-
bay_uuid = wsme.wsproperty(wtypes.text, _get_bay_uuid,
60-
_set_bay_uuid, mandatory=True)
59+
bay_uuid = wsme.wsproperty(wtypes.text, _get_cluster_uuid,
60+
_set_cluster_uuid)
6161
"""The bay UUID or id"""
6262

63+
cluster_uuid = wsme.wsproperty(wtypes.text, _get_cluster_uuid,
64+
_set_cluster_uuid)
65+
"""The cluster UUID or id"""
66+
6367
links = wsme.wsattr([link.Link], readonly=True)
6468
"""A list containing a self link and associated certificate links"""
6569

@@ -80,15 +84,22 @@ def __init__(self, **kwargs):
8084
self.fields.append(field)
8185
setattr(self, field, kwargs.get(field, wtypes.Unset))
8286

83-
def get_bay(self):
84-
if not self._bay:
85-
self._bay = api_utils.get_resource('Bay', self.bay_uuid)
86-
return self._bay
87+
# set the attribute for cluster_uuid
88+
self.fields.append('cluster_uuid')
89+
if 'cluster_uuid' in kwargs.keys():
90+
setattr(self, 'cluster_uuid', kwargs.get('cluster_uuid',
91+
wtypes.Unset))
92+
93+
def get_cluster(self):
94+
if not self._cluster:
95+
self._cluster = api_utils.get_resource('Bay', self.cluster_uuid)
96+
return self._cluster
8797

8898
@staticmethod
8999
def _convert_with_links(certificate, url, expand=True):
90100
if not expand:
91-
certificate.unset_fields_except(['bay_uuid', 'csr', 'pem'])
101+
certificate.unset_fields_except(['bay_uuid', 'cluster_uuid',
102+
'csr', 'pem'])
92103

93104
certificate.links = [link.Link.make_link('self', url,
94105
'certificates',
@@ -108,6 +119,7 @@ def convert_with_links(cls, rpc_cert, expand=True):
108119
@classmethod
109120
def sample(cls, expand=True):
110121
sample = cls(bay_uuid='7ae81bb3-dec3-4289-8d6c-da80bd8001ae',
122+
cluster_uuid='7ae81bb3-dec3-4289-8d6c-da80bd8001ae',
111123
created_at=timeutils.utcnow(),
112124
csr='AAA....AAA')
113125
return cls._convert_with_links(sample, 'http://localhost:9511', expand)
@@ -124,17 +136,17 @@ def __init__(self):
124136
}
125137

126138
@expose.expose(Certificate, types.uuid_or_name)
127-
def get_one(self, bay_ident):
128-
"""Retrieve CA information about the given bay.
139+
def get_one(self, cluster_ident):
140+
"""Retrieve CA information about the given cluster.
129141
130-
:param bay_ident: UUID of a bay or
131-
logical name of the bay.
142+
:param cluster_ident: UUID of a cluster or
143+
logical name of the cluster.
132144
"""
133145
context = pecan.request.context
134-
bay = api_utils.get_resource('Bay', bay_ident)
135-
policy.enforce(context, 'certificate:get', bay,
146+
cluster = api_utils.get_resource('Bay', cluster_ident)
147+
policy.enforce(context, 'certificate:get', cluster,
136148
action='certificate:get')
137-
certificate = pecan.request.rpcapi.get_ca_certificate(bay)
149+
certificate = pecan.request.rpcapi.get_ca_certificate(cluster)
138150
return Certificate.convert_with_links(certificate)
139151

140152
@expose.expose(Certificate, body=Certificate, status_code=201)
@@ -144,14 +156,14 @@ def post(self, certificate):
144156
:param certificate: a certificate within the request body.
145157
"""
146158
context = pecan.request.context
147-
bay = certificate.get_bay()
148-
policy.enforce(context, 'certificate:create', bay,
159+
cluster = certificate.get_cluster()
160+
policy.enforce(context, 'certificate:create', cluster,
149161
action='certificate:create')
150162
certificate_dict = certificate.as_dict()
151163
certificate_dict['project_id'] = context.project_id
152164
certificate_dict['user_id'] = context.user_id
153165
cert_obj = objects.Certificate(context, **certificate_dict)
154166

155-
new_cert = pecan.request.rpcapi.sign_certificate(bay,
167+
new_cert = pecan.request.rpcapi.sign_certificate(cluster,
156168
cert_obj)
157169
return Certificate.convert_with_links(new_cert)

magnum/tests/functional/api/v1/clients/cert_client.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,25 @@ class CertClient(client.MagnumClient):
2020
url = "/certificates"
2121

2222
@classmethod
23-
def cert_uri(cls, bay_id):
24-
"""Construct bay uri
23+
def cert_uri(cls, cluster_id):
24+
"""Construct cluster uri
2525
26-
:param bay_id: bay uuid or name
26+
:param cluster_id: cluster uuid or name
2727
:returns: url string
2828
"""
2929

30-
return "{0}/{1}".format(cls.url, bay_id)
30+
return "{0}/{1}".format(cls.url, cluster_id)
3131

32-
def get_cert(self, bay_id, **kwargs):
33-
"""Makes GET /certificates/bay_id request and returns CertEntity
32+
def get_cert(self, cluster_id, **kwargs):
33+
"""Makes GET /certificates/cluster_id request and returns CertEntity
3434
3535
Abstracts REST call to return a single cert based on uuid or name
3636
37-
:param bay_id: bay uuid or name
38-
:returns: response object and BayCollection object
37+
:param cluster_id: cluster uuid or name
38+
:returns: response object and ClusterCollection object
3939
"""
4040

41-
resp, body = self.get(self.cert_uri(bay_id))
41+
resp, body = self.get(self.cert_uri(cluster_id))
4242
return self.deserialize(resp, body, cert_model.CertEntity)
4343

4444
def post_cert(self, model, **kwargs):

magnum/tests/functional/api/v1/test_cluster.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def test_create_list_sign_delete_clusters(self):
182182
resp, cert_model = self.cert_client.post_cert(cert_data_model)
183183
self.LOG.debug("cert resp: %s" % resp)
184184
self.assertEqual(201, resp.status)
185-
self.assertEqual(cert_model.bay_uuid, cluster_model.uuid)
185+
self.assertEqual(cert_model.cluster_uuid, cluster_model.uuid)
186186
self.assertIsNotNone(cert_model.pem)
187187
self.assertIn('-----BEGIN CERTIFICATE-----', cert_model.pem)
188188
self.assertIn('-----END CERTIFICATE-----', cert_model.pem)

magnum/tests/functional/common/datagen.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,11 @@ def bay_node_count_patch_data(node_count=2):
322322
return baypatch_model.BayPatchCollection.from_dict(data)
323323

324324

325-
def cert_data(bay_uuid, csr_data):
325+
def cert_data(cluster_uuid, csr_data):
326326
data = {
327-
"bay_uuid": bay_uuid,
328-
"csr": csr_data,
329-
}
327+
"cluster_uuid": cluster_uuid,
328+
"csr": csr_data}
329+
330330
model = cert_model.CertEntity.from_dict(data)
331331

332332
return model

magnum/tests/unit/api/controllers/v1/test_certificate.py

+51-29
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ class TestCertObject(base.TestCase):
2525
@mock.patch('magnum.api.utils.get_resource')
2626
def test_cert_init(self, mock_get_resource):
2727
cert_dict = api_utils.cert_post_data()
28-
mock_bay = mock.MagicMock()
29-
mock_bay.uuid = cert_dict['bay_uuid']
30-
mock_get_resource.return_value = mock_bay
28+
mock_cluster = mock.MagicMock()
29+
mock_cluster.uuid = cert_dict['cluster_uuid']
30+
mock_get_resource.return_value = mock_cluster
3131

3232
cert = api_cert.Certificate(**cert_dict)
3333

34-
self.assertEqual(cert_dict['bay_uuid'], cert.bay_uuid)
34+
self.assertEqual(cert_dict['cluster_uuid'], cert.cluster_uuid)
3535
self.assertEqual(cert_dict['csr'], cert.csr)
3636
self.assertEqual(cert_dict['pem'], cert.pem)
3737

@@ -40,7 +40,7 @@ class TestGetCertificate(api_base.FunctionalTest):
4040

4141
def setUp(self):
4242
super(TestGetCertificate, self).setUp()
43-
self.bay = obj_utils.create_test_bay(self.context)
43+
self.cluster = obj_utils.create_test_cluster(self.context)
4444

4545
conductor_api_patcher = mock.patch('magnum.conductor.api.API')
4646
self.conductor_api_class = conductor_api_patcher.start()
@@ -54,9 +54,11 @@ def test_get_one(self):
5454
mock_cert.as_dict.return_value = fake_cert
5555
self.conductor_api.get_ca_certificate.return_value = mock_cert
5656

57-
response = self.get_json('/certificates/%s' % self.bay.uuid)
57+
response = self.get_json('/certificates/%s' % self.cluster.uuid)
5858

59-
self.assertEqual(self.bay.uuid, response['bay_uuid'])
59+
self.assertEqual(self.cluster.uuid, response['cluster_uuid'])
60+
# check that bay is still valid as well
61+
self.assertEqual(self.cluster.uuid, response['bay_uuid'])
6062
self.assertEqual(fake_cert['csr'], response['csr'])
6163
self.assertEqual(fake_cert['pem'], response['pem'])
6264

@@ -66,9 +68,11 @@ def test_get_one_by_name(self):
6668
mock_cert.as_dict.return_value = fake_cert
6769
self.conductor_api.get_ca_certificate.return_value = mock_cert
6870

69-
response = self.get_json('/certificates/%s' % self.bay.name)
71+
response = self.get_json('/certificates/%s' % self.cluster.name)
7072

71-
self.assertEqual(self.bay.uuid, response['bay_uuid'])
73+
self.assertEqual(self.cluster.uuid, response['cluster_uuid'])
74+
# check that bay is still valid as well
75+
self.assertEqual(self.cluster.uuid, response['bay_uuid'])
7276
self.assertEqual(fake_cert['csr'], response['csr'])
7377
self.assertEqual(fake_cert['pem'], response['pem'])
7478

@@ -80,13 +84,13 @@ def test_get_one_by_name_not_found(self):
8084
self.assertEqual('application/json', response.content_type)
8185
self.assertTrue(response.json['errors'])
8286

83-
def test_get_one_by_name_multiple_bay(self):
84-
obj_utils.create_test_bay(self.context, name='test_bay',
85-
uuid=uuidutils.generate_uuid())
86-
obj_utils.create_test_bay(self.context, name='test_bay',
87-
uuid=uuidutils.generate_uuid())
87+
def test_get_one_by_name_multiple_cluster(self):
88+
obj_utils.create_test_cluster(self.context, name='test_cluster',
89+
uuid=uuidutils.generate_uuid())
90+
obj_utils.create_test_cluster(self.context, name='test_cluster',
91+
uuid=uuidutils.generate_uuid())
8892

89-
response = self.get_json('/certificates/test_bay',
93+
response = self.get_json('/certificates/test_cluster',
9094
expect_errors=True)
9195

9296
self.assertEqual(409, response.status_int)
@@ -99,11 +103,11 @@ def test_links(self):
99103
mock_cert.as_dict.return_value = fake_cert
100104
self.conductor_api.get_ca_certificate.return_value = mock_cert
101105

102-
response = self.get_json('/certificates/%s' % self.bay.uuid)
106+
response = self.get_json('/certificates/%s' % self.cluster.uuid)
103107

104108
self.assertIn('links', response.keys())
105109
self.assertEqual(2, len(response['links']))
106-
self.assertIn(self.bay.uuid, response['links'][0]['href'])
110+
self.assertIn(self.cluster.uuid, response['links'][0]['href'])
107111
for l in response['links']:
108112
bookmark = l['rel'] == 'bookmark'
109113
self.assertTrue(self.validate_link(l['href'], bookmark=bookmark))
@@ -113,7 +117,7 @@ class TestPost(api_base.FunctionalTest):
113117

114118
def setUp(self):
115119
super(TestPost, self).setUp()
116-
self.bay = obj_utils.create_test_bay(self.context)
120+
self.cluster = obj_utils.create_test_cluster(self.context)
117121

118122
conductor_api_patcher = mock.patch('magnum.conductor.api.API')
119123
self.conductor_api_class = conductor_api_patcher.start()
@@ -124,33 +128,51 @@ def setUp(self):
124128
self.conductor_api.sign_certificate.side_effect = self._fake_sign
125129

126130
@staticmethod
127-
def _fake_sign(bay, cert):
131+
def _fake_sign(cluster, cert):
128132
cert.pem = 'fake-pem'
129133
return cert
130134

131135
def test_create_cert(self, ):
132-
new_cert = api_utils.cert_post_data(bay_uuid=self.bay.uuid)
136+
new_cert = api_utils.cert_post_data(cluster_uuid=self.cluster.uuid)
133137
del new_cert['pem']
134138

135139
response = self.post_json('/certificates', new_cert)
136140
self.assertEqual('application/json', response.content_type)
137141
self.assertEqual(201, response.status_int)
138-
self.assertEqual(new_cert['bay_uuid'], response.json['bay_uuid'])
142+
self.assertEqual(new_cert['cluster_uuid'],
143+
response.json['cluster_uuid'])
144+
# verify bay_uuid is still valid as well
145+
self.assertEqual(new_cert['cluster_uuid'], response.json['bay_uuid'])
139146
self.assertEqual('fake-pem', response.json['pem'])
140147

148+
# Test that bay_uuid is still backward compatible
141149
def test_create_cert_by_bay_name(self, ):
142-
new_cert = api_utils.cert_post_data(bay_uuid=self.bay.name)
150+
new_cert = api_utils.cert_post_data(cluster_uuid=self.cluster.uuid)
151+
del new_cert['pem']
152+
new_cert['bay_uuid'] = new_cert['cluster_uuid']
153+
del new_cert['cluster_uuid']
154+
155+
response = self.post_json('/certificates', new_cert)
156+
self.assertEqual('application/json', response.content_type)
157+
self.assertEqual(201, response.status_int)
158+
self.assertEqual(self.cluster.uuid, response.json['cluster_uuid'])
159+
# verify bay_uuid is still valid as well
160+
self.assertEqual(self.cluster.uuid, response.json['bay_uuid'])
161+
self.assertEqual('fake-pem', response.json['pem'])
162+
163+
def test_create_cert_by_cluster_name(self, ):
164+
new_cert = api_utils.cert_post_data(cluster_uuid=self.cluster.name)
143165
del new_cert['pem']
144166

145167
response = self.post_json('/certificates', new_cert)
146168

147169
self.assertEqual('application/json', response.content_type)
148170
self.assertEqual(201, response.status_int)
149-
self.assertEqual(self.bay.uuid, response.json['bay_uuid'])
171+
self.assertEqual(self.cluster.uuid, response.json['cluster_uuid'])
150172
self.assertEqual('fake-pem', response.json['pem'])
151173

152-
def test_create_cert_bay_not_found(self, ):
153-
new_cert = api_utils.cert_post_data(bay_uuid='not_found')
174+
def test_create_cert_cluster_not_found(self, ):
175+
new_cert = api_utils.cert_post_data(cluster_uuid='not_found')
154176
del new_cert['pem']
155177

156178
response = self.post_json('/certificates', new_cert,
@@ -176,15 +198,15 @@ def _common_policy_check(self, rule, func, *arg, **kwarg):
176198
response.json['errors'][0]['detail'])
177199

178200
def test_policy_disallow_get_one(self):
179-
bay = obj_utils.create_test_bay(self.context)
201+
cluster = obj_utils.create_test_cluster(self.context)
180202
self._common_policy_check(
181203
"certificate:get", self.get_json,
182-
'/certificates/%s' % bay.uuid,
204+
'/certificates/%s' % cluster.uuid,
183205
expect_errors=True)
184206

185207
def test_policy_disallow_create(self):
186-
bay = obj_utils.create_test_bay(self.context)
187-
cert = api_utils.cert_post_data(bay_uuid=bay.uuid)
208+
cluster = obj_utils.create_test_cluster(self.context)
209+
cert = api_utils.cert_post_data(cluster_uuid=cluster.uuid)
188210
self._common_policy_check(
189211
"certificate:create", self.post_json, '/certificates', cert,
190212
expect_errors=True)

magnum/tests/unit/api/utils.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ def cluster_post_data(**kw):
6161

6262
def cert_post_data(**kw):
6363
return {
64-
'bay_uuid': kw.get('bay_uuid', '5d12f6fd-a196-4bf0-ae4c-1f639a523a52'),
64+
'cluster_uuid': kw.get('cluster_uuid',
65+
'5d12f6fd-a196-4bf0-ae4c-1f639a523a52'),
6566
'csr': kw.get('csr', 'fake-csr'),
6667
'pem': kw.get('pem', 'fake-pem')
6768
}

0 commit comments

Comments
 (0)