Delete 'default' security group associated to new projects.
[snaps.git] / snaps / openstack / create_project.py
1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 #                    and others.  All rights reserved.
3 #
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:
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
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.
15 import logging
16
17 from keystoneclient.exceptions import NotFound
18 from snaps.openstack.utils import keystone_utils, neutron_utils
19
20 __author__ = 'spisarski'
21
22 logger = logging.getLogger('create_image')
23
24
25 class OpenStackProject:
26     """
27     Class responsible for creating a project/project in OpenStack
28     """
29
30     def __init__(self, os_creds, project_settings):
31         """
32         Constructor
33         :param os_creds: The OpenStack connection credentials
34         :param project_settings: The project's settings
35         :return:
36         """
37         self.__os_creds = os_creds
38         self.project_settings = project_settings
39         self.__project = None
40         self.__role = None
41         self.__keystone = None
42
43     def create(self, cleanup=False):
44         """
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
48         """
49         self.__keystone = keystone_utils.keystone_client(self.__os_creds)
50         self.__project = keystone_utils.get_project(
51             keystone=self.__keystone, project_settings=self.project_settings)
52         if self.__project:
53             logger.info(
54                 'Found project with name - ' + self.project_settings.name)
55         elif not cleanup:
56             self.__project = keystone_utils.create_project(
57                 self.__keystone, self.project_settings)
58         else:
59             logger.info('Did not create image due to cleanup mode')
60
61         return self.__project
62
63     def clean(self):
64         """
65         Cleanse environment of all artifacts
66         :return: void
67         """
68         if self.__project:
69             # Delete security group 'default' if exists
70             neutron = neutron_utils.neutron_client(self.__os_creds)
71             default_sec_grp = neutron_utils.get_security_group(
72                 neutron, 'default',
73                 tenant_id=self.__project.id)
74             if default_sec_grp:
75                 try:
76                     neutron_utils.delete_security_group(
77                         neutron, default_sec_grp)
78                 except:
79                     pass
80
81             # Delete Project
82             try:
83                 keystone_utils.delete_project(self.__keystone, self.__project)
84             except NotFound:
85                 pass
86             self.__project = None
87
88         if self.__role:
89             try:
90                 keystone_utils.delete_role(self.__keystone, self.__role)
91             except NotFound:
92                 pass
93             self.__project = None
94
95     def get_project(self):
96         """
97         Returns the OpenStack project object populated on create()
98         :return:
99         """
100         return self.__project
101
102     def assoc_user(self, user):
103         """
104         The user object to associate with the project
105         :param user: the OpenStack User domain object to associate with project
106         :return:
107         """
108         if not self.__role:
109             self.__role = keystone_utils.create_role(
110                 self.__keystone, self.project_settings.name + '-role')
111
112         keystone_utils.grant_user_role_to_project(self.__keystone, self.__role,
113                                                   user, self.__project)
114
115
116 class ProjectSettings:
117     """
118     Class to hold the configuration settings required for creating OpenStack
119     project objects
120     """
121
122     def __init__(self, **kwargs):
123
124         """
125         Constructor
126         :param name: the project's name (required)
127         :param domain or domain_name: the project's domain name
128                                       (default = 'Default').
129                                       Field is used for v3 clients
130         :param description: the description (optional)
131         :param enabled: denotes whether or not the user is enabled
132                         (default True)
133         """
134
135         self.name = kwargs.get('name')
136         self.domain_name = kwargs.get(
137             'domain', kwargs.get('domain', 'Default'))
138
139         self.description = kwargs.get('description')
140         if kwargs.get('enabled') is not None:
141             self.enabled = kwargs['enabled']
142         else:
143             self.enabled = True
144
145         if not self.name:
146             raise ProjectSettingsError(
147                 "The attribute name is required for ProjectSettings")
148
149
150 class ProjectSettingsError(Exception):
151     """
152     Exception to be thrown when project settings attributes are incorrect
153     """