blob: 551207500552535e6d7fda662ac6572e9a63bf46 [file] [log] [blame]
Yair Fried1fc32a12014-08-04 09:11:30 +03001# Copyright 2013 Hewlett-Packard Development Company, L.P.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# 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, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
16import abc
17
18import six
19
20
21class AttributeDict(dict):
Ken'ichi Ohmichib2790842015-11-17 11:46:13 +000022 """Provide attribute access (dict.key) to dictionary values."""
Yair Fried1fc32a12014-08-04 09:11:30 +030023
24 def __getattr__(self, name):
25 """Allow attribute access for all keys in the dict."""
26 if name in self:
27 return self[name]
28 return super(AttributeDict, self).__getattribute__(name)
29
30
31@six.add_metaclass(abc.ABCMeta)
32class DeletableResource(AttributeDict):
Ken'ichi Ohmichib2790842015-11-17 11:46:13 +000033 """Support deletion of neutron resources (networks, subnets)
Yair Fried1fc32a12014-08-04 09:11:30 +030034
Ken'ichi Ohmichib2790842015-11-17 11:46:13 +000035 via a delete() method, as is supported by keystone and nova resources.
Yair Fried1fc32a12014-08-04 09:11:30 +030036 """
37
38 def __init__(self, *args, **kwargs):
39 self.client = kwargs.pop('client', None)
John Warren3961acd2015-10-02 14:38:53 -040040 self.network_client = kwargs.pop('network_client', None)
John Warren94d8faf2015-09-15 12:22:24 -040041 self.networks_client = kwargs.pop('networks_client', None)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000042 self.routers_client = kwargs.pop('routers_client', None)
John Warren3961acd2015-10-02 14:38:53 -040043 self.subnets_client = kwargs.pop('subnets_client', None)
John Warren49c0fe52015-10-22 12:35:54 -040044 self.ports_client = kwargs.pop('ports_client', None)
Yair Fried1fc32a12014-08-04 09:11:30 +030045 super(DeletableResource, self).__init__(*args, **kwargs)
46
47 def __str__(self):
48 return '<%s id="%s" name="%s">' % (self.__class__.__name__,
49 self.id, self.name)
50
51 @abc.abstractmethod
52 def delete(self):
53 return
54
Miguel Lavalle02ba8cd2014-09-01 19:23:22 -050055 @abc.abstractmethod
Yair Fried45f92952014-06-26 05:19:19 +030056 def refresh(self):
Miguel Lavalle02ba8cd2014-09-01 19:23:22 -050057 return
58
Yair Fried1fc32a12014-08-04 09:11:30 +030059 def __hash__(self):
60 return hash(self.id)
61
Miguel Lavalle02ba8cd2014-09-01 19:23:22 -050062 def wait_for_status(self, status):
63 if not hasattr(self, 'status'):
64 return
65
Yair Fried45f92952014-06-26 05:19:19 +030066 def helper_get():
67 self.refresh()
68 return self
69
70 return self.client.wait_for_resource_status(helper_get, status)
Miguel Lavalle02ba8cd2014-09-01 19:23:22 -050071
Yair Fried1fc32a12014-08-04 09:11:30 +030072
73class DeletableNetwork(DeletableResource):
74
75 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -040076 self.networks_client.delete_network(self.id)
Yair Fried1fc32a12014-08-04 09:11:30 +030077
78
79class DeletableSubnet(DeletableResource):
80
81 def __init__(self, *args, **kwargs):
82 super(DeletableSubnet, self).__init__(*args, **kwargs)
83 self._router_ids = set()
84
85 def update(self, *args, **kwargs):
John Warren3961acd2015-10-02 14:38:53 -040086 result = self.subnets_client.update_subnet(self.id,
87 *args,
88 **kwargs)
Yair Fried413bf2d2014-11-19 17:07:11 +020089 return super(DeletableSubnet, self).update(**result['subnet'])
Yair Fried1fc32a12014-08-04 09:11:30 +030090
91 def add_to_router(self, router_id):
92 self._router_ids.add(router_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000093 self.routers_client.add_router_interface(router_id,
piyush11078694aca952015-12-17 12:54:44 +053094 subnet_id=self.id)
Yair Fried1fc32a12014-08-04 09:11:30 +030095
96 def delete(self):
97 for router_id in self._router_ids.copy():
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000098 self.routers_client.remove_router_interface(router_id,
piyush11078694aca952015-12-17 12:54:44 +053099 subnet_id=self.id)
Yair Fried1fc32a12014-08-04 09:11:30 +0300100 self._router_ids.remove(router_id)
John Warren3961acd2015-10-02 14:38:53 -0400101 self.subnets_client.delete_subnet(self.id)
Yair Fried1fc32a12014-08-04 09:11:30 +0300102
103
104class DeletableRouter(DeletableResource):
105
106 def set_gateway(self, network_id):
107 return self.update(external_gateway_info=dict(network_id=network_id))
108
109 def unset_gateway(self):
110 return self.update(external_gateway_info=dict())
111
112 def update(self, *args, **kwargs):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000113 result = self.routers_client.update_router(self.id,
114 *args,
115 **kwargs)
Yair Fried1fc32a12014-08-04 09:11:30 +0300116 return super(DeletableRouter, self).update(**result['router'])
117
118 def delete(self):
119 self.unset_gateway()
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000120 self.routers_client.delete_router(self.id)
Yair Fried1fc32a12014-08-04 09:11:30 +0300121
122
123class DeletableFloatingIp(DeletableResource):
124
Yair Fried45f92952014-06-26 05:19:19 +0300125 def refresh(self, *args, **kwargs):
David Kranz34e88122014-12-11 15:24:05 -0500126 result = self.client.show_floatingip(self.id,
127 *args,
128 **kwargs)
Yair Fried45f92952014-06-26 05:19:19 +0300129 super(DeletableFloatingIp, self).update(**result['floatingip'])
130
Yair Fried1fc32a12014-08-04 09:11:30 +0300131 def update(self, *args, **kwargs):
David Kranz34e88122014-12-11 15:24:05 -0500132 result = self.client.update_floatingip(self.id,
133 *args,
134 **kwargs)
Yair Fried1fc32a12014-08-04 09:11:30 +0300135 super(DeletableFloatingIp, self).update(**result['floatingip'])
136
137 def __repr__(self):
138 return '<%s addr="%s">' % (self.__class__.__name__,
139 self.floating_ip_address)
140
141 def __str__(self):
142 return '<"FloatingIP" addr="%s" id="%s">' % (self.floating_ip_address,
143 self.id)
144
145 def delete(self):
146 self.client.delete_floatingip(self.id)
147
148
149class DeletablePort(DeletableResource):
150
151 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400152 self.ports_client.delete_port(self.id)
Yair Fried1fc32a12014-08-04 09:11:30 +0300153
154
155class DeletableSecurityGroup(DeletableResource):
156
157 def delete(self):
158 self.client.delete_security_group(self.id)
159
160
161class DeletableSecurityGroupRule(DeletableResource):
162
163 def __repr__(self):
164 return '<%s id="%s">' % (self.__class__.__name__, self.id)
165
166 def delete(self):
167 self.client.delete_security_group_rule(self.id)
168
169
170class DeletablePool(DeletableResource):
171
172 def delete(self):
173 self.client.delete_pool(self.id)
174
175
176class DeletableMember(DeletableResource):
177
178 def delete(self):
179 self.client.delete_member(self.id)
180
181
182class DeletableVip(DeletableResource):
183
184 def delete(self):
185 self.client.delete_vip(self.id)
Miguel Lavalle02ba8cd2014-09-01 19:23:22 -0500186
Yair Fried45f92952014-06-26 05:19:19 +0300187 def refresh(self):
David Kranz34e88122014-12-11 15:24:05 -0500188 result = self.client.show_vip(self.id)
189 super(DeletableVip, self).update(**result['vip'])