cc1  v2.1
CC1 source code docs
 All Classes Namespaces Files Functions Variables Pages
address.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 # @COPYRIGHT_begin
3 #
4 # Copyright [2010-2014] Institute of Nuclear Physics PAN, Krakow, Poland
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 # @COPYRIGHT_end
19 from ec2.base.action import Action, CLMException
20 from ec2.error import InsufficientAddressCapacity, MissingParameter, \
21  UndefinedError, InvalidInstanceID, InvalidAddress, InvalidIPAddress, \
22  InternalError, InvalidParameterValue, InvalidFilter
23 from ec2.helpers.entities import Entity
24 from ec2.helpers.filters import applyEc2Filters, validateEc2Filters
25 from ec2.helpers.parse import parseSequenceArguments, parseFilters, \
26  parseID
27 
28 """@package src.ec2.address
29 
30 EC2 actions for IP addresses
31 
32 @author: Oleksandr Gituliar <oleksandr@gituliar.org>
33 @author Łukasz Chrząszcz <l.chrzaszcz@gmail.com>
34 @copyright: Copyright (c) 2012 IFJ PAN <http://www.ifj.edu.pl/>
35 """
36 
37 
38 class AllocateAddress(Action):
39  def _execute(self):
40  try:
41  address = self.cluster_manager.user.public_ip.request()
42  except CLMException, error:
43  if error.status == 'public_lease_limit':
44  raise InsufficientAddressCapacity()
45  if error.status == 'public_lease_request':
46  raise InternalError
47  raise UndefinedError
48  return {'publicIp': address}
49 
50 
51 class AssociateAddress(Action):
52  def _execute(self):
53  try:
54  instance_id = parseID(self.parameters['InstanceId'], Entity.instance)
55  if not instance_id:
56  raise InvalidParameterValue
57  instance_id = int(instance_id)
58 
59  public_ip = self.parameters['PublicIp']
60  except KeyError, error:
61  raise MissingParameter(parameter=error.args[0])
62  except ValueError, error:
63  raise InvalidInstanceID.Malformed(image_id=instance_id)
64 
65  addresses = self.cluster_manager.user.public_ip.get_list()
66  for address in addresses + [None]:
67  if address and address['address'] == public_ip:
68  break
69  if not address:
70  raise InvalidAddress.NotFound
71 
72  lease_id = None
73  instances = self.cluster_manager.user.vm.get_list()
74  for instance in instances:
75  if instance['vm_id'] == instance_id:
76  print instance['leases'][0]
77  lease_id = instance['leases'][0]['lease_id']
78  if not lease_id:
79  raise InvalidInstanceID.NotFound(image_id=instance_id)
80 
81  try:
82  self.cluster_manager.user.public_ip.assign(
83  {'lease_id': lease_id, 'public_ip_id': address['public_ip_id']}
84  )
85  except CLMException, error:
86  if error.status == 'public_lease_assigned':
87  raise InvalidIPAddress.InUse
88  print 'NIE PRZECHWYCONY WYJATEK', error.status
89  raise UndefinedError
90 
91  return None
92 
93 
94 class DescribeAddresses(Action):
95 
96  available_filters = ['instance-id', 'public-ip']
97 
98  def _execute(self):
99 
100  public_ips = parseSequenceArguments(self.parameters, prefix='PublicIp.')
101 
102  filters = parseFilters(self.parameters)
103  filters_ok = validateEc2Filters(filters, self.available_filters)
104  if not filters_ok:
105  raise InvalidFilter
106 
107  result = []
108 
109  addresses = self.cluster_manager.user.public_ip.get_list()
110  if public_ips:
111  addresses = [address for address in addresses if address['address'] in public_ips]
112  for address in addresses:
113  vm_id = None
114  lease_id = address['lease_id']
115  if lease_id:
116  instances = self.cluster_manager.user.vm.get_list()
117  for instance in instances:
118  for lease in instance['leases']:
119  if lease['lease_id'] == lease_id:
120  vm_id = instance['vm_id']
121  break
122  result.append({
123  'domain': 'standard',
124  'instance-id': vm_id,
125  'public-ip': address['address'],
126  })
127 
128  result = applyEc2Filters(result , filters)
129 
130  return {'addresses': result}
131 
132 
133 class DisassociateAddress(Action):
134  def _execute(self):
135  try:
136  public_ip = self.parameters['PublicIp']
137  except KeyError, error:
138  raise MissingParameter(parameter=error.args[0])
139 
140  addresses = self.cluster_manager.user.public_ip.get_list()
141  lease_id = None
142  for address in addresses:
143  if address['address'] == public_ip:
144  lease_id = address['lease_id']
145  break
146  if lease_id:
147  self.cluster_manager.user.public_ip.unassign({'lease_id':lease_id})
148 
149  return None
150 
151 
152 class ReleaseAddress(Action):
153  def _execute(self):
154  try:
155  public_ip = unicode(self.parameters['PublicIp'])
156  except KeyError:
157  raise MissingParameter(parameter='PublicIp')
158  print type(public_ip)
159 
160 
161  addresses = self.cluster_manager.user.public_ip.get_list()
162 
163  return_address = {}
164  return_address['address'] = -1
165  for address in addresses :
166  if address.get('address') == public_ip:
167  return_address = address
168 
169  if return_address['address'] == -1:
170  raise InvalidAddress.NotFound
171 
172  try:
173  self.cluster_manager.user.public_ip.release({'public_ip_id': return_address['public_ip_id']})
174  except CLMException, error:
175  if error.status == 'user_get':
176  raise error
177  if error.status == 'public_lease_assigned':
178  raise InvalidIPAddress.InUse
179  raise UndefinedError
180 
181  return None
182