21
21
from nova import context
22
22
from nova import db
23
23
from nova import exception
24
from nova import flags
25
24
from nova.network import model as network_model
26
25
from nova.openstack.common import log as logging
27
from nova import utils
26
from nova.openstack.common import timeutils
27
from nova.openstack.common import uuidutils
31
29
LOG = logging.getLogger(__name__)
130
128
def id_to_ec2_inst_id(instance_id):
131
129
"""Get or create an ec2 instance ID (i-[base 16 number]) from uuid."""
132
if utils.is_uuid_like(instance_id):
130
if uuidutils.is_uuid_like(instance_id):
133
131
ctxt = context.get_admin_context()
134
132
int_id = get_int_id_from_instance_uuid(ctxt, instance_id)
135
133
return id_to_ec2_id(int_id)
150
148
def id_to_ec2_snap_id(snapshot_id):
151
149
"""Get or create an ec2 volume ID (vol-[base 16 number]) from uuid."""
152
if utils.is_uuid_like(snapshot_id):
150
if uuidutils.is_uuid_like(snapshot_id):
153
151
ctxt = context.get_admin_context()
154
152
int_id = get_int_id_from_snapshot_uuid(ctxt, snapshot_id)
155
153
return id_to_ec2_id(int_id, 'snap-%08x')
160
158
def id_to_ec2_vol_id(volume_id):
161
159
"""Get or create an ec2 volume ID (vol-[base 16 number]) from uuid."""
162
if utils.is_uuid_like(volume_id):
160
if uuidutils.is_uuid_like(volume_id):
163
161
ctxt = context.get_admin_context()
164
162
int_id = get_int_id_from_volume_uuid(ctxt, volume_id)
165
163
return id_to_ec2_id(int_id, 'vol-%08x')
176
174
return get_volume_uuid_from_int_id(ctxt, int_id)
177
def is_ec2_timestamp_expired(request, expires=None):
178
"""Checks the timestamp or expiry time included in a EC2 request
179
and returns true if the request is expired
182
timestamp = request.get('Timestamp')
183
expiry_time = request.get('Expires')
185
if timestamp and expiry_time:
186
msg = _("Request must include either Timestamp or Expires,"
187
" but cannot contain both")
189
raise exception.InvalidRequest(msg)
191
query_time = timeutils.parse_strtime(expiry_time,
192
"%Y-%m-%dT%H:%M:%SZ")
193
return timeutils.is_older_than(query_time, -1)
195
query_time = timeutils.parse_strtime(timestamp,
196
"%Y-%m-%dT%H:%M:%SZ")
198
# Check if the difference between the timestamp in the request
199
# and the time on our servers is larger than 5 minutes, the
200
# request is too old (or too new).
201
if query_time and expires:
202
return timeutils.is_older_than(query_time, expires) or \
203
timeutils.is_newer_than(query_time, expires)
206
LOG.audit(_("Timestamp is invalid."))
179
210
def get_int_id_from_instance_uuid(context, instance_uuid):
180
211
if instance_uuid is None:
220
251
return db.get_snapshot_uuid_by_ec2_id(context, int_id)
223
def ec2_instance_id_to_uuid(context, ec2_id):
224
int_id = ec2_id_to_id(ec2_id)
225
return db.instance_get(context, int_id)['uuid']
227
254
_c2u = re.compile('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))')