1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 # and others. All rights reserved.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
17 from keystoneclient.exceptions import NotFound
18 from snaps.openstack.utils import keystone_utils
20 __author__ = 'spisarski'
22 logger = logging.getLogger('create_image')
25 class OpenStackProject:
27 Class responsible for creating a project/project in OpenStack
30 def __init__(self, os_creds, project_settings):
33 :param os_creds: The OpenStack connection credentials
34 :param project_settings: The project's settings
37 self.__os_creds = os_creds
38 self.project_settings = project_settings
41 self.__keystone = None
43 def create(self, cleanup=False):
45 Creates the image in OpenStack if it does not already exist
46 :param cleanup: Denotes whether or not this is being called for cleanup
47 :return: The OpenStack Image object
49 self.__keystone = keystone_utils.keystone_client(self.__os_creds)
50 self.__project = keystone_utils.get_project(
51 keystone=self.__keystone, project_name=self.project_settings.name)
54 'Found project with name - ' + self.project_settings.name)
56 self.__project = keystone_utils.create_project(
57 self.__keystone, self.project_settings)
59 logger.info('Did not create image due to cleanup mode')
65 Cleanse environment of all artifacts
70 keystone_utils.delete_project(self.__keystone, self.__project)
77 keystone_utils.delete_role(self.__keystone, self.__role)
82 def get_project(self):
84 Returns the OpenStack project object populated on create()
89 def assoc_user(self, user):
91 The user object to associate with the project
92 :param user: the OpenStack User domain object to associate with project
96 self.__role = keystone_utils.create_role(
97 self.__keystone, self.project_settings.name + '-role')
99 keystone_utils.grant_user_role_to_project(self.__keystone, self.__role,
100 user, self.__project)
103 class ProjectSettings:
105 Class to hold the configuration settings required for creating OpenStack
109 def __init__(self, **kwargs):
113 :param name: the project's name (required)
114 :param domain: the project's domain name (default 'default'). Field is
116 :param description: the description (optional)
117 :param enabled: denotes whether or not the user is enabled
121 self.name = kwargs.get('name')
122 if kwargs.get('domain'):
123 self.domain = kwargs['domain']
125 self.domain = 'default'
127 self.description = kwargs.get('description')
128 if kwargs.get('enabled') is not None:
129 self.enabled = kwargs['enabled']
134 raise ProjectSettingsError(
135 "The attribute name is required for ProjectSettings")
138 class ProjectSettingsError(Exception):
140 Exception to be thrown when project settings attributes are incorrect