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
19 from snaps.openstack.utils import keystone_utils, neutron_utils, nova_utils
21 __author__ = 'spisarski'
23 logger = logging.getLogger('create_image')
26 class OpenStackProject:
28 Class responsible for creating a project/project in OpenStack
31 def __init__(self, os_creds, project_settings):
34 :param os_creds: The OpenStack connection credentials
35 :param project_settings: The project's settings
38 self.__os_creds = os_creds
39 self.project_settings = project_settings
42 self.__keystone = None
44 def create(self, cleanup=False):
46 Creates the image in OpenStack if it does not already exist
47 :param cleanup: Denotes whether or not this is being called for cleanup
48 :return: The OpenStack Image object
50 self.__keystone = keystone_utils.keystone_client(self.__os_creds)
51 self.__project = keystone_utils.get_project(
52 keystone=self.__keystone, project_settings=self.project_settings)
55 'Found project with name - ' + self.project_settings.name)
57 self.__project = keystone_utils.create_project(
58 self.__keystone, self.project_settings)
60 logger.info('Did not create image due to cleanup mode')
66 Cleanse environment of all artifacts
70 # Delete security group 'default' if exists
71 neutron = neutron_utils.neutron_client(self.__os_creds)
72 default_sec_grp = neutron_utils.get_security_group(
73 neutron, sec_grp_name='default',
74 project_id=self.__project.id)
77 neutron_utils.delete_security_group(
78 neutron, default_sec_grp)
84 keystone_utils.delete_project(self.__keystone, self.__project)
91 keystone_utils.delete_role(self.__keystone, self.__role)
96 def get_project(self):
98 Returns the OpenStack project object populated on create()
101 return self.__project
103 def assoc_user(self, user):
105 The user object to associate with the project
106 :param user: the OpenStack User domain object to associate with project
110 self.__role = keystone_utils.create_role(
111 self.__keystone, self.project_settings.name + '-role')
113 keystone_utils.grant_user_role_to_project(self.__keystone, self.__role,
114 user, self.__project)
116 def get_compute_quotas(self):
118 Returns the compute quotas as an instance of the ComputeQuotas class
121 nova = nova_utils.nova_client(self.__os_creds)
122 return nova_utils.get_compute_quotas(nova, self.__project.id)
124 def get_network_quotas(self):
126 Returns the network quotas as an instance of the NetworkQuotas class
129 neutron = neutron_utils.neutron_client(self.__os_creds)
130 return neutron_utils.get_network_quotas(neutron, self.__project.id)
132 def update_compute_quotas(self, compute_quotas):
134 Updates the compute quotas for this project
135 :param compute_quotas: a ComputeQuotas object.
137 nova = nova_utils.nova_client(self.__os_creds)
138 nova_utils.update_quotas(nova, self.__project.id, compute_quotas)
140 def update_network_quotas(self, network_quotas):
142 Updates the network quotas for this project
143 :param network_quotas: a NetworkQuotas object.
145 neutron = neutron_utils.neutron_client(self.__os_creds)
146 neutron_utils.update_quotas(neutron, self.__project.id, network_quotas)
149 class ProjectSettings:
151 Class to hold the configuration settings required for creating OpenStack
155 def __init__(self, **kwargs):
159 :param name: the project's name (required)
160 :param domain or domain_name: the project's domain name
161 (default = 'Default').
162 Field is used for v3 clients
163 :param description: the description (optional)
164 :param enabled: denotes whether or not the user is enabled
168 self.name = kwargs.get('name')
169 self.domain_name = kwargs.get(
170 'domain', kwargs.get('domain', 'Default'))
172 self.description = kwargs.get('description')
173 if kwargs.get('enabled') is not None:
174 self.enabled = kwargs['enabled']
179 raise ProjectSettingsError(
180 "The attribute name is required for ProjectSettings")
183 class ProjectSettingsError(Exception):
185 Exception to be thrown when project settings attributes are incorrect