cc1  v2.1
CC1 source code docs
 All Classes Namespaces Files Functions Variables Pages
universal.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 MissingParameter, InvalidAMIID, InvalidParameterValue, \
21  InvalidInstanceID, InvalidVolumeID, InvalidVolume, InvalidFilter, InvalidID, \
22  UnknownParameter
23 from ec2.helpers.entities import Entity
24 from ec2.helpers.filters import validateEc2Filters
25 from ec2.helpers.parse import parseFilters, parseSequenceArguments, parseID
26 from ec2.helpers.query import get_instance_tags, get_volume_tags, \
27  get_volume_name_tag, get_instance_name_tag
28 
29 """@package src.ec2.universal
30 EC2 actions common for more than one resource
31 
32 @copyright Copyright (c) 2014 Institute of Nuclear Physics PAS <http://www.ifj.edu.pl/>
33 @author Łukasz Chrząszcz <l.chrzaszcz@gmail.com>
34 """
35 
36 class CreateTags(Action):
37  def _execute(self):
38  resource_ids = []
39  tags = []
40  # try:
41  for param, value in self.parameters.iteritems():
42  if param.startswith('ResourceId'):
43  resource_ids.append(value)
44  elif param.startswith('Tag.') and param.endswith('Key'):
45  tag_value = self.parameters.get('Tag.' + param[4:-4] + '.Value')
46  if value != 'Name':
47  raise InvalidParameterValue
48  if not tag_value:
49  raise MissingParameter(parameter='Tag.' + param[4:-4] + '.Value')
50  tags.append({'Name': tag_value})
51  # except KeyError:
52  # raise MissingParameter(parameter='ImageId') # TODO
53  # except ValueError:
54  # raise InvalidAMIID.Malformed
55 
56  for resource in resource_ids:
57  if resource.startswith('vol-'):
58  for tag in tags:
59  try:
60  volume = self.cluster_manager.user.storage_image.get_by_id({'storage_image_id':resource[4:]})
61  except CLMException,error :
62  raise InvalidVolume.NotFound
63 
64  self.cluster_manager.user.storage_image.edit({'storage_image_id':resource[4:],
65  'name' : tag['Name'],
66  'description' : volume['description'],
67  'disk_controller' : volume['disk_controller']})
68  elif resource.startswith('i-'):
69  for tag in tags:
70  try:
71  instance = self.cluster_manager.user.vm.get_by_id({'vm_id': resource[2:]})
72  except CLMException, error:
73  raise InvalidInstanceID.NotFound(image_id=resource)
74 
75  self.cluster_manager.user.vm.edit({'vm_id': resource[2:],
76  'name' : tag['Name'],
77  'description' : instance['description']})
78  else:
79  raise InvalidParameterValue
80 
81  # we don't return anything, in this point the only value might be True and it's coded within template
82 
83 
84 
85 class DescribeTags(Action):
86 
87  available_filters = ['key', 'resource-id', 'resoure-type', 'value']
88 
89  def _execute(self):
90  if self.parameters.get('MaxResults'):
91  raise UnknownParameter(parameter='MaxResults')
92 
93  if self.parameters.get('NextToken'):
94  raise UnknownParameter(parameter='NextToken')
95 
96  filters = parseFilters(self.parameters)
97  if not validateEc2Filters(filters, self.available_filters):
98  raise InvalidFilter
99 
100  tags = []
101 
102  if filters:
103  INSTANCES = False
104  VOLUMES = False
105 
106  if filters.get('key'):
107  for key in filters['key']:
108  if key != 'Name':
109  raise InvalidFilter #TODO
110  del filters['key']
111 
112  if filters.get('resource-id'):
113  for filter in filters['resource-id']:
114  if filter.startswith('vol-') and (not filters.get('resource-type') or filters.get('resource-type') == 'volume'):
115  tags.append(get_volume_name_tag(self.cluster_manager, filter[4:]))
116  elif filter.startswith('i-') and (not filters.get('resource-type') or filters.get('resource-type') == 'instance'):
117  tags.append(get_instance_name_tag(self.cluster_manager, filter[2:]))
118  elif filters.get('resource-type'):
119  for filter in filters['resource-type']:
120  if filter == 'instance':
121  tags.append(get_instance_tags(self.cluster_manager))
122  elif filter == 'volume':
123  tags.append(get_volume_tags(self.cluster_manager))
124  del filters['resource-type']
125  else:
126  tags = get_instance_tags(self.cluster_manager) + get_volume_tags(self.cluster_manager)
127 
128  if filters.get('value'):
129  tags = [tag for tag in tags if tag['value'] in filters['value']]
130 
131  else: # jeżeli nie podano zadnych filtrów to zwracamy wszystkie
132  tags = get_instance_tags(self.cluster_manager) + get_volume_tags(self.cluster_manager)
133 
134  return {'tags':tags}
135 
136 class DeleteTags(Action):
137  def _execute(self):
138  resourceIds = parseSequenceArguments(self.parameters, 'ResourceId.')
139  tagNames = parseSequenceArguments(self.parameters, 'Tag.', '.Key')
140  tagValue = self.parameters.get('Tag.0.Value')
141 
142  if not resourceIds:
143  raise MissingParameter(parameter='ResourceId.X')
144 
145  if not tagNames:
146  raise MissingParameter(parameter='Tag.X.Key')
147 
148  if len(tagNames) != 1:
149  raise InvalidFilter
150 
151  if tagNames[0] != 'Name':
152  raise InvalidFilter
153 
154  #if not tagValue:
155  # raise MissingParameter(parameter='Tag.0.Value')
156 
157  # here we have only one tag called Name
158  for resource in resourceIds:
159 
160  if resource.startswith('i-'):
161  instance_id = parseID(resource, Entity.instance)
162  if not instance_id:
163  raise InvalidInstanceID.Malformed
164  try:
165  instance = self.cluster_manager.user.vm.get_by_id({'vm_id':instance_id})
166  except CLMException, error:
167  raise InvalidInstanceID.NotFound(image_id=instance_id)
168 
169  if tagValue and tagValue != instance['name']:
170  continue
171  self.cluster_manager.user.vm.edit({'vm_id': instance_id, 'name': 'i-' + instance_id, 'description': instance['description']})
172 
173  elif resource.startswith('vol-'):
174  volume_id = parseID(resource, Entity.volume)
175  if not volume_id:
176  raise InvalidVolumeID.Malformed
177 
178  try:
179  volume = self.cluster_manager.user.storage_image.get_by_id({'storage_image_id':volume_id})
180  except CLMException, error:
181  raise InvalidVolume.NotFound()
182 
183  if tagValue and tagValue != volume['name']:
184  continue
185 
186  self.cluster_manager.user.storage_image.edit({'storage_image_id' : volume_id,
187  'name' : 'vol-' + volume_id,
188  'description':volume['description'],
189  'disk_controller':volume['disk_controller']})
190 
191  else:
192  raise InvalidID
193 
194  return
195