Skip to content

Commit ec6fbe1

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Federation Service Providers CRUD operations"
2 parents 1f33a1e + ba7ad20 commit ec6fbe1

4 files changed

Lines changed: 650 additions & 0 deletions

File tree

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
#
13+
14+
"""Service Provider action implementations"""
15+
16+
import logging
17+
import six
18+
import sys
19+
20+
from cliff import command
21+
from cliff import lister
22+
from cliff import show
23+
24+
from openstackclient.common import utils
25+
26+
27+
class CreateServiceProvider(show.ShowOne):
28+
"""Create new service provider"""
29+
30+
log = logging.getLogger(__name__ + '.CreateServiceProvider')
31+
32+
def get_parser(self, prog_name):
33+
parser = super(CreateServiceProvider, self).get_parser(prog_name)
34+
parser.add_argument(
35+
'service_provider_id',
36+
metavar='<service-provider-id>',
37+
help='New service provider ID (must be unique)'
38+
)
39+
parser.add_argument(
40+
'--auth-url',
41+
metavar='<auth-url>',
42+
required=True,
43+
help='Authentication URL of remote federated service provider',
44+
)
45+
parser.add_argument(
46+
'--description',
47+
metavar='<description>',
48+
help='New service provider description',
49+
)
50+
parser.add_argument(
51+
'--service-provider-url',
52+
metavar='<sp-url>',
53+
required=True,
54+
help='A service URL where SAML assertions are being sent',
55+
)
56+
57+
enable_service_provider = parser.add_mutually_exclusive_group()
58+
enable_service_provider.add_argument(
59+
'--enable',
60+
dest='enabled',
61+
action='store_true',
62+
default=True,
63+
help='Enable service provider (default)',
64+
)
65+
enable_service_provider.add_argument(
66+
'--disable',
67+
dest='enabled',
68+
action='store_false',
69+
help='Disable service provider',
70+
)
71+
72+
return parser
73+
74+
def take_action(self, parsed_args):
75+
self.log.debug('take_action(%s)', parsed_args)
76+
service_client = self.app.client_manager.identity
77+
sp = service_client.federation.service_providers.create(
78+
id=parsed_args.service_provider_id,
79+
auth_url=parsed_args.auth_url,
80+
description=parsed_args.description,
81+
enabled=parsed_args.enabled,
82+
sp_url=parsed_args.service_provider_url)
83+
84+
sp._info.pop('links', None)
85+
return zip(*sorted(six.iteritems(sp._info)))
86+
87+
88+
class DeleteServiceProvider(command.Command):
89+
"""Delete service provider"""
90+
91+
log = logging.getLogger(__name__ + '.DeleteServiceProvider')
92+
93+
def get_parser(self, prog_name):
94+
parser = super(DeleteServiceProvider, self).get_parser(prog_name)
95+
parser.add_argument(
96+
'service_provider',
97+
metavar='<service-provider-id>',
98+
help='Service provider ID to delete (ID)',
99+
)
100+
return parser
101+
102+
def take_action(self, parsed_args):
103+
self.log.debug('take_action(%s)', parsed_args)
104+
service_client = self.app.client_manager.identity
105+
service_client.federation.service_providers.delete(
106+
parsed_args.service_provider)
107+
return
108+
109+
110+
class ListServiceProvider(lister.Lister):
111+
"""List service providers"""
112+
113+
log = logging.getLogger(__name__ + '.ListServiceProvider')
114+
115+
def take_action(self, parsed_args):
116+
self.log.debug('take_action(%s)', parsed_args)
117+
service_client = self.app.client_manager.identity
118+
data = service_client.federation.service_providers.list()
119+
120+
column_headers = ('ID', 'Enabled', 'Description', 'Auth URL')
121+
return (column_headers,
122+
(utils.get_item_properties(
123+
s, column_headers,
124+
formatters={},
125+
) for s in data))
126+
127+
128+
class SetServiceProvider(command.Command):
129+
"""Set service provider properties"""
130+
131+
log = logging.getLogger(__name__ + '.SetServiceProvider')
132+
133+
def get_parser(self, prog_name):
134+
parser = super(SetServiceProvider, self).get_parser(prog_name)
135+
parser.add_argument(
136+
'service_provider',
137+
metavar='<service-provider-id>',
138+
help='Service provider ID to change (ID)',
139+
)
140+
parser.add_argument(
141+
'--auth-url',
142+
metavar='<auth-url>',
143+
help='Authentication URL of remote federated Service Provider',
144+
)
145+
146+
parser.add_argument(
147+
'--description',
148+
metavar='<description>',
149+
help='New service provider description',
150+
)
151+
parser.add_argument(
152+
'--service-provider-url',
153+
metavar='<sp-url>',
154+
help='A service URL where SAML assertions are being sent',
155+
)
156+
enable_service_provider = parser.add_mutually_exclusive_group()
157+
enable_service_provider.add_argument(
158+
'--enable',
159+
action='store_true',
160+
help='Enable service provider',
161+
)
162+
enable_service_provider.add_argument(
163+
'--disable',
164+
action='store_true',
165+
help='Disable service provider',
166+
)
167+
return parser
168+
169+
def take_action(self, parsed_args):
170+
self.log.debug('take_action(%s)', parsed_args)
171+
federation_client = self.app.client_manager.identity.federation
172+
173+
enabled = None
174+
if parsed_args.enable is True:
175+
enabled = True
176+
elif parsed_args.disable is True:
177+
enabled = False
178+
179+
if not any((enabled is not None, parsed_args.description,
180+
parsed_args.service_provider_url,
181+
parsed_args.auth_url)):
182+
sys.stdout.write("Service Provider not updated, no arguments "
183+
"present")
184+
return (None, None)
185+
186+
service_provider = federation_client.service_providers.update(
187+
parsed_args.service_provider, enabled=enabled,
188+
description=parsed_args.description,
189+
auth_url=parsed_args.auth_url,
190+
sp_url=parsed_args.service_provider_url)
191+
return zip(*sorted(six.iteritems(service_provider._info)))
192+
193+
194+
class ShowServiceProvider(show.ShowOne):
195+
"""Display service provider details"""
196+
197+
log = logging.getLogger(__name__ + '.ShowServiceProvider')
198+
199+
def get_parser(self, prog_name):
200+
parser = super(ShowServiceProvider, self).get_parser(prog_name)
201+
parser.add_argument(
202+
'service_provider',
203+
metavar='<service-provider-id>',
204+
help='Service provider ID to display (ID)',
205+
)
206+
return parser
207+
208+
def take_action(self, parsed_args):
209+
self.log.debug('take_action(%s)', parsed_args)
210+
service_client = self.app.client_manager.identity
211+
service_provider = utils.find_resource(
212+
service_client.federation.service_providers,
213+
parsed_args.service_provider)
214+
215+
service_provider._info.pop('links', None)
216+
return zip(*sorted(six.iteritems(service_provider._info)))

‎openstackclient/tests/identity/v3/fakes.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,20 @@
255255
mapping_id = 'test_mapping'
256256
mapping_id_updated = 'prod_mapping'
257257

258+
sp_id = 'BETA'
259+
sp_description = 'Service Provider to burst into'
260+
service_provider_url = 'https://beta.example.com/Shibboleth.sso/POST/SAML'
261+
sp_auth_url = ('https://beta.example.com/v3/OS-FEDERATION/identity_providers/'
262+
'idp/protocol/saml2/auth')
263+
264+
SERVICE_PROVIDER = {
265+
'id': sp_id,
266+
'enabled': True,
267+
'description': sp_description,
268+
'sp_url': service_provider_url,
269+
'auth_url': sp_auth_url
270+
}
271+
258272
PROTOCOL_ID_MAPPING = {
259273
'id': protocol_id,
260274
'mapping': mapping_id
@@ -392,6 +406,8 @@ def __init__(self, **kwargs):
392406
self.projects.resource_class = fakes.FakeResource(None, {})
393407
self.domains = mock.Mock()
394408
self.domains.resource_class = fakes.FakeResource(None, {})
409+
self.service_providers = mock.Mock()
410+
self.service_providers.resource_class = fakes.FakeResource(None, {})
395411

396412

397413
class FakeFederatedClient(FakeIdentityv3Client):

0 commit comments

Comments
 (0)