Skip to content

Commit 57dac0b

Browse files
committed
Refactor network endpoint enablement checking
Move the network endpoint enablement checking from the 'server create' command to the common client manager. This allows future network commands to use either nova or neutron networking based on the cloud environment. This patch set also includes related unit test enhancements to the common client manager to trigger authentication on the tests. Change-Id: Ia37e81d4fb05a1e2fceb3e5d367bda769ab8e64b Related-Bug: #1519511 Related-to: blueprint neutron-client
1 parent 74a0b2a commit 57dac0b

4 files changed

Lines changed: 68 additions & 9 deletions

File tree

openstackclient/common/clientmanager.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,26 @@ def auth_ref(self):
191191
self._auth_ref = self.auth.get_auth_ref(self.session)
192192
return self._auth_ref
193193

194+
def is_network_endpoint_enabled(self):
195+
"""Check if the network endpoint is enabled"""
196+
# Trigger authentication necessary to determine if the network
197+
# endpoint is enabled.
198+
if self.auth_ref:
199+
service_catalog = self.auth_ref.service_catalog
200+
else:
201+
service_catalog = None
202+
# Assume that the network endpoint is enabled.
203+
network_endpoint_enabled = True
204+
if service_catalog:
205+
if 'network' in service_catalog.get_endpoints():
206+
LOG.debug("Network endpoint in service catalog")
207+
else:
208+
LOG.debug("No network endpoint in service catalog")
209+
network_endpoint_enabled = False
210+
else:
211+
LOG.debug("No service catalog, assuming network endpoint enabled")
212+
return network_endpoint_enabled
213+
194214
def get_endpoint_for_service_type(self, service_type, region_name=None,
195215
interface='public'):
196216
"""Return the endpoint URL for the service type."""

openstackclient/compute/v2/server.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,6 @@ class CreateServer(show.ShowOne):
257257

258258
log = logging.getLogger(__name__ + '.CreateServer')
259259

260-
def _is_neutron_enabled(self):
261-
service_catalog = self.app.client_manager.auth_ref.service_catalog
262-
return 'network' in service_catalog.get_endpoints()
263-
264260
def get_parser(self, prog_name):
265261
parser = super(CreateServer, self).get_parser(prog_name)
266262
parser.add_argument(
@@ -460,8 +456,6 @@ def take_action(self, parsed_args):
460456
block_device_mapping.update({dev_key: block_volume})
461457

462458
nics = []
463-
if parsed_args.nic:
464-
neutron_enabled = self._is_neutron_enabled()
465459
for nic_str in parsed_args.nic:
466460
nic_info = {"net-id": "", "v4-fixed-ip": "",
467461
"v6-fixed-ip": "", "port-id": ""}
@@ -471,7 +465,7 @@ def take_action(self, parsed_args):
471465
msg = _("either net-id or port-id should be specified "
472466
"but not both")
473467
raise exceptions.CommandError(msg)
474-
if neutron_enabled:
468+
if self.app.client_manager.is_network_endpoint_enabled():
475469
network_client = self.app.client_manager.network
476470
if nic_info["net-id"]:
477471
net = network_client.find_network(
@@ -489,7 +483,7 @@ def take_action(self, parsed_args):
489483
).id
490484
if nic_info["port-id"]:
491485
msg = _("can't create server with port specified "
492-
"since neutron not enabled")
486+
"since network endpoint not enabled")
493487
raise exceptions.CommandError(msg)
494488
nics.append(nic_info)
495489

openstackclient/tests/common/test_clientmanager.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ def setUp(self):
7777
self.requests = self.useFixture(fixture.Fixture())
7878
# fake v2password token retrieval
7979
self.stub_auth(json=fakes.TEST_RESPONSE_DICT)
80+
# fake token and token_endpoint retrieval
81+
self.stub_auth(json=fakes.TEST_RESPONSE_DICT,
82+
url='/'.join([fakes.AUTH_URL, 'v2.0/tokens']))
8083
# fake v3password token retrieval
8184
self.stub_auth(json=fakes.TEST_RESPONSE_DICT_V3,
8285
url='/'.join([fakes.AUTH_URL, 'auth/tokens']))
@@ -99,6 +102,7 @@ def test_client_manager_token_endpoint(self):
99102
verify=True
100103
)
101104
client_manager.setup_auth()
105+
client_manager.auth_ref
102106

103107
self.assertEqual(
104108
fakes.AUTH_URL,
@@ -114,6 +118,7 @@ def test_client_manager_token_endpoint(self):
114118
)
115119
self.assertFalse(client_manager._insecure)
116120
self.assertTrue(client_manager._verify)
121+
self.assertTrue(client_manager.is_network_endpoint_enabled())
117122

118123
def test_client_manager_token(self):
119124

@@ -131,6 +136,7 @@ def test_client_manager_token(self):
131136
verify=True
132137
)
133138
client_manager.setup_auth()
139+
client_manager.auth_ref
134140

135141
self.assertEqual(
136142
fakes.AUTH_URL,
@@ -150,6 +156,7 @@ def test_client_manager_token(self):
150156
)
151157
self.assertFalse(client_manager._insecure)
152158
self.assertTrue(client_manager._verify)
159+
self.assertTrue(client_manager.is_network_endpoint_enabled())
153160

154161
def test_client_manager_password(self):
155162

@@ -166,6 +173,7 @@ def test_client_manager_password(self):
166173
verify=False,
167174
)
168175
client_manager.setup_auth()
176+
client_manager.auth_ref
169177

170178
self.assertEqual(
171179
fakes.AUTH_URL,
@@ -195,6 +203,28 @@ def test_client_manager_password(self):
195203
dir(SERVICE_CATALOG),
196204
dir(client_manager.auth_ref.service_catalog),
197205
)
206+
self.assertTrue(client_manager.is_network_endpoint_enabled())
207+
208+
def test_client_manager_network_endpoint_disabled(self):
209+
210+
client_manager = clientmanager.ClientManager(
211+
cli_options=FakeOptions(
212+
auth=dict(
213+
auth_url=fakes.AUTH_URL,
214+
username=fakes.USERNAME,
215+
password=fakes.PASSWORD,
216+
project_name=fakes.PROJECT_NAME,
217+
),
218+
auth_type='v3password',
219+
),
220+
api_version={"identity": "3"},
221+
verify=False,
222+
)
223+
client_manager.setup_auth()
224+
client_manager.auth_ref
225+
226+
# v3 fake doesn't have network endpoint.
227+
self.assertFalse(client_manager.is_network_endpoint_enabled())
198228

199229
def stub_auth(self, json=None, url=None, verb=None, **kwargs):
200230
subject_token = fakes.AUTH_TOKEN
@@ -229,10 +259,12 @@ def test_client_manager_password_verify_ca(self):
229259
verify='cafile',
230260
)
231261
client_manager.setup_auth()
262+
client_manager.auth_ref
232263

233264
self.assertFalse(client_manager._insecure)
234265
self.assertTrue(client_manager._verify)
235266
self.assertEqual('cafile', client_manager._cacert)
267+
self.assertTrue(client_manager.is_network_endpoint_enabled())
236268

237269
def _select_auth_plugin(self, auth_params, api_version, auth_plugin_name):
238270
auth_params['auth_type'] = auth_plugin_name
@@ -243,6 +275,7 @@ def _select_auth_plugin(self, auth_params, api_version, auth_plugin_name):
243275
verify=True
244276
)
245277
client_manager.setup_auth()
278+
client_manager.auth_ref
246279

247280
self.assertEqual(
248281
auth_plugin_name,

openstackclient/tests/fakes.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@
3434
TEST_RESPONSE_DICT = fixture.V2Token(token_id=AUTH_TOKEN,
3535
user_name=USERNAME)
3636
_s = TEST_RESPONSE_DICT.add_service('identity', name='keystone')
37-
_s.add_endpoint(AUTH_URL + '/v2.0')
37+
_s.add_endpoint(AUTH_URL + ':5000/v2.0')
38+
_s = TEST_RESPONSE_DICT.add_service('network', name='neutron')
39+
_s.add_endpoint(AUTH_URL + ':9696')
40+
_s = TEST_RESPONSE_DICT.add_service('compute', name='nova')
41+
_s.add_endpoint(AUTH_URL + ':8774/v2')
42+
_s = TEST_RESPONSE_DICT.add_service('image', name='glance')
43+
_s.add_endpoint(AUTH_URL + ':9292')
44+
_s = TEST_RESPONSE_DICT.add_service('object', name='swift')
45+
_s.add_endpoint(AUTH_URL + ':8080/v1')
3846

3947
TEST_RESPONSE_DICT_V3 = fixture.V3Token(user_name=USERNAME)
4048
TEST_RESPONSE_DICT_V3.set_project_scope()
@@ -103,6 +111,7 @@ def __init__(self):
103111
self.session = None
104112
self.auth_ref = None
105113
self.auth_plugin_name = None
114+
self.network_endpoint_enabled = True
106115

107116
def get_configuration(self):
108117
return {
@@ -115,6 +124,9 @@ def get_configuration(self):
115124
'identity_api_version': VERSION,
116125
}
117126

127+
def is_network_endpoint_enabled(self):
128+
return self.network_endpoint_enabled
129+
118130

119131
class FakeModule(object):
120132
def __init__(self, name, version):

0 commit comments

Comments
 (0)