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, Conflict
19 from snaps.config.project import ProjectConfig
20 from snaps.openstack.openstack_creator import OpenStackIdentityObject
21 from snaps.openstack.utils import keystone_utils, neutron_utils, nova_utils
23 __author__ = 'spisarski'
25 logger = logging.getLogger('create_image')
28 class OpenStackProject(OpenStackIdentityObject):
30 Class responsible for managing a project/project in OpenStack
33 def __init__(self, os_creds, project_settings):
36 :param os_creds: The OpenStack connection credentials
37 :param project_settings: The project's settings
40 super(self.__class__, self).__init__(os_creds)
42 self.project_settings = project_settings
45 self.__role_name = self.project_settings.name + '-role'
49 Loads the existing Project object if it exists
50 :return: The Project domain object
52 super(self.__class__, self).initialize()
54 self.__project = keystone_utils.get_project(
55 keystone=self._keystone, project_settings=self.project_settings)
60 Creates a Project/Tenant in OpenStack if it does not already exist
61 :return: The Project domain object
65 if not self.__project:
66 self.__project = keystone_utils.create_project(
67 self._keystone, self.project_settings)
68 for username in self.project_settings.users:
69 user = keystone_utils.get_user(self._keystone, username)
74 logger.warn('Unable to associate user %s due to %s',
81 Cleanse environment of all artifacts
85 # Delete security group 'default' if exists
86 neutron = neutron_utils.neutron_client(
87 self._os_creds, self._os_session)
89 default_sec_grp = neutron_utils.get_security_group(
90 neutron, self._keystone, sec_grp_name='default',
91 project_name=self.__project.name)
94 neutron_utils.delete_security_group(
95 neutron, default_sec_grp)
99 neutron.httpclient.session.session.close()
103 keystone_utils.delete_project(self._keystone, self.__project)
106 self.__project = None
110 keystone_utils.delete_role(self._keystone, self.__role)
113 self.__project = None
115 # Final role check in case init was done from an existing instance
116 role = keystone_utils.get_role_by_name(
117 self._keystone, self.__role_name)
119 keystone_utils.delete_role(self._keystone, role)
121 super(self.__class__, self).clean()
123 def get_project(self):
125 Returns the OpenStack project object populated on create()
128 return self.__project
130 def assoc_user(self, user):
132 The user object to associate with the project
133 :param user: the OpenStack User domain object to associate with project
137 self.__role = keystone_utils.get_role_by_name(
138 self._keystone, self.__role_name)
140 self.__role = keystone_utils.create_role(
141 self._keystone, self.__role_name)
143 keystone_utils.grant_user_role_to_project(self._keystone, self.__role,
144 user, self.__project)
146 def get_compute_quotas(self):
148 Returns the compute quotas as an instance of the ComputeQuotas class
151 nova = nova_utils.nova_client(self._os_creds, self._os_session)
154 return nova_utils.get_compute_quotas(nova, self.__project.id)
156 nova.client.session.session.close()
158 def get_network_quotas(self):
160 Returns the network quotas as an instance of the NetworkQuotas class
163 neutron = neutron_utils.neutron_client(
164 self._os_creds, self._os_session)
166 return neutron_utils.get_network_quotas(neutron, self.__project.id)
168 neutron.httpclient.session.session.close()
170 def update_compute_quotas(self, compute_quotas):
172 Updates the compute quotas for this project
173 :param compute_quotas: a ComputeQuotas object.
175 nova = nova_utils.nova_client(self._os_creds, self._os_session)
177 nova_utils.update_quotas(nova, self.__project.id, compute_quotas)
179 nova.client.session.session.close()
181 def update_network_quotas(self, network_quotas):
183 Updates the network quotas for this project
184 :param network_quotas: a NetworkQuotas object.
186 neutron = neutron_utils.neutron_client(
187 self._os_creds, self._os_session)
189 neutron_utils.update_quotas(
190 neutron, self.__project.id, network_quotas)
192 neutron.httpclient.session.session.close()
195 class ProjectSettings(ProjectConfig):
197 Class to hold the configuration settings required for creating OpenStack
202 def __init__(self, **kwargs):
203 from warnings import warn
204 warn('Use snaps.config.project.ProjectConfig instead',
206 super(self.__class__, self).__init__(**kwargs)