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.
18 from neutronclient.common.exceptions import NetworkNotFoundClient, Unauthorized
20 from snaps.config.network import NetworkConfig, SubnetConfig, PortConfig
21 from snaps.openstack.openstack_creator import OpenStackNetworkObject
22 from snaps.openstack.utils import neutron_utils, keystone_utils
24 __author__ = 'spisarski'
26 logger = logging.getLogger('OpenStackNetwork')
29 class OpenStackNetwork(OpenStackNetworkObject):
31 Class responsible for managing a network in OpenStack
34 def __init__(self, os_creds, network_settings):
36 Constructor - all parameters are required
37 :param os_creds: The credentials to connect with OpenStack
38 :param network_settings: The settings used to create a network
40 super(self.__class__, self).__init__(os_creds)
42 self.network_settings = network_settings
44 # Attributes instantiated on create()
49 Loads the existing OpenStack network/subnet
50 :return: The Network domain object or None
52 super(self.__class__, self).initialize()
55 keystone = keystone_utils.keystone_client(self._os_creds)
56 self.__network = neutron_utils.get_network(
57 self._neutron, keystone,
58 network_settings=self.network_settings,
59 project_name=self._os_creds.project_name)
60 except Unauthorized as e:
61 logger.warn('Unable to lookup network with name %s - %s',
62 self.network_settings.name, e)
68 Responsible for creating not only the network but then a private
69 subnet, router, and an interface to the router.
70 :return: the Network domain object
74 if not self.__network:
75 self.__network = neutron_utils.create_network(
76 self._neutron, self._os_creds, self.network_settings)
78 'Network [%s] created successfully' % self.__network.id)
84 Removes and deletes all items created in reverse order.
88 neutron_utils.delete_network(self._neutron, self.__network)
89 except NetworkNotFoundClient:
93 def get_network(self):
95 Returns the created OpenStack network object
96 :return: the OpenStack network object
101 class NetworkSettings(NetworkConfig):
103 Class to hold the configuration settings required for creating OpenStack
108 def __init__(self, **kwargs):
109 from warnings import warn
110 warn('Use snaps.config.network.NetworkConfig instead',
112 super(self.__class__, self).__init__(**kwargs)
115 class IPv6Mode(enum.Enum):
118 deprecated - use snaps.config.network.IPv6Mode
121 stateful = 'dhcpv6-stateful'
122 stateless = 'dhcpv6-stateless'
125 class SubnetSettings(SubnetConfig):
127 Class to hold the configuration settings required for creating OpenStack
132 def __init__(self, **kwargs):
133 from warnings import warn
134 warn('Use snaps.config.network.SubnetConfig instead',
136 super(self.__class__, self).__init__(**kwargs)
139 class PortSettings(PortConfig):
141 Class to hold the configuration settings required for creating OpenStack
146 def __init__(self, **kwargs):
147 from warnings import warn
148 warn('Use snaps.config.network.PortConfig instead',
150 super(self.__class__, self).__init__(**kwargs)