
* Renaming from StackTask to Adjutant. * Cull unused or old elements of code originally from heatclient. * Remove old cli as deprecation is redundant with the rename as well. Rename is now a blank slate for the cli and the cli is entirely OSC based. Change-Id: Ic548bdd0f5dadfe537ffe5e1eed7725358c13fce
129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
# Copyright (C) 2016 Catalyst IT Ltd
|
|
#
|
|
# 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.
|
|
|
|
import six
|
|
from six.moves.urllib import parse
|
|
|
|
from adjutantclient.common import base
|
|
|
|
|
|
class User(base.Resource):
|
|
def __repr__(self):
|
|
return "<User %s>" % self._info
|
|
|
|
def invite(self, **fields):
|
|
return self.manager.create(self.identifier, **fields)
|
|
|
|
def get(self):
|
|
# set_loaded() first ... so if we have to bail, we know we tried.
|
|
self._loaded = True
|
|
if not hasattr(self.manager, 'get'):
|
|
return
|
|
|
|
new = self.manager.get(self.identifier)
|
|
if new:
|
|
self._add_details(new._info)
|
|
|
|
@property
|
|
def identifier(self):
|
|
return '%s/%s' % (self.stack_name, self.id)
|
|
|
|
|
|
class UserManager(base.ManagerWithFind):
|
|
resource_class = User
|
|
|
|
def get(self, user):
|
|
return self._get("/openstack/users/%s" % base.getid(user))
|
|
|
|
def list(self, **kwargs):
|
|
"""Get a list of users.
|
|
|
|
:param limit: maximum number of users to return
|
|
:param marker: begin returning users that appear later in the user
|
|
list than that represented by this user id
|
|
:rtype: list of :class:`User`
|
|
"""
|
|
def paginate(params):
|
|
'''Paginate users, even if more than API limit.'''
|
|
current_limit = int(params.get('limit') or 0)
|
|
url = 'openstack/users?%s' % parse.urlencode(params, True)
|
|
users = self._list(url, 'users')
|
|
for user in users:
|
|
yield user
|
|
|
|
num_users = len(users)
|
|
remaining_limit = current_limit - num_users
|
|
if remaining_limit > 0 and num_users > 0:
|
|
params['limit'] = remaining_limit
|
|
params['marker'] = user.id
|
|
for stack in paginate(params):
|
|
yield stack
|
|
|
|
params = {}
|
|
# if 'filters' in kwargs:
|
|
# filters = kwargs.pop('filters')
|
|
# params.update(filters)
|
|
|
|
for key, value in six.iteritems(kwargs):
|
|
if value:
|
|
params[key] = value
|
|
|
|
return paginate(params)
|
|
|
|
def invite(self, username, email, role_list):
|
|
""" Invite a user to the current project. """
|
|
|
|
fields = {
|
|
'username': username,
|
|
'email': email,
|
|
'roles': role_list
|
|
}
|
|
return self.client.post('openstack/users', data=fields)
|
|
|
|
def cancel(self, user_id):
|
|
"""
|
|
Cancel a user invite task.
|
|
"""
|
|
url = 'openstack/users/%s' % user_id
|
|
return self._delete(url)
|
|
|
|
def revoke(self, user_id):
|
|
"""
|
|
revoke all user roles on project.
|
|
"""
|
|
# NOTE(adriant): This doesn't work yet.
|
|
# Uses the same endpoint as cancel, but doesn't
|
|
# yet actually revoke all roles if an actual user
|
|
# rather than an invite.
|
|
return self.cancel(user_id)
|
|
|
|
def password_forgot(self, email, username=None):
|
|
"""Forgot password email submission."""
|
|
params = {"email": email}
|
|
if username:
|
|
params['username'] = username
|
|
|
|
return self.client.post("openstack/users/password-reset",
|
|
data=params)
|
|
|
|
def password_force_reset(self, email):
|
|
"""
|
|
Force a password reset for a user.
|
|
|
|
This is an admin only function.
|
|
"""
|
|
params = {"email": email}
|
|
return self.client.post(
|
|
"openstack/users/password-set", data=params)
|