예제 #1
0
    def _execute(self):
        key_names = parseSequenceArguments( self.parameters, prefix = 'KeyName.' )

        filters = parseFilters( self.parameters )
        if not validateEc2Filters( filters, self.available_filters ):
            raise InvalidFilter

        key_pairs = []
        if key_names:
            for key_name in key_names:
                key_pairs.append( self.cluster_manager.user.key.get({'name':key_name}) )
        else:
            key_pairs = self.cluster_manager.user.key.get_list();

        result = []

        for key_pair in key_pairs:
            result.append({'key-name' : key_pair['name'],
                       'fingerprint' : key_pair['fingerprint']
                       })


        result = applyEc2Filters( result, filters )

        print 'result:',result
        return {
            'key_pairs': result
        }
예제 #2
0
    def _execute(self):

        public_ips = parseSequenceArguments(self.parameters, prefix='PublicIp.')

        filters = parseFilters(self.parameters)
        filters_ok = validateEc2Filters(filters, self.available_filters)
        if not filters_ok:
            raise InvalidFilter

        result = []

        addresses = self.cluster_manager.user.public_ip.get_list()
        if public_ips:
            addresses = [address for address in addresses if address['address'] in public_ips]
        for address in addresses:
            vm_id = None
            lease_id = address['lease_id']
            if lease_id:
                instances = self.cluster_manager.user.vm.get_list()
                for instance in instances:
                    for lease in instance['leases']:
                        if lease['lease_id'] == lease_id:
                            vm_id = instance['vm_id']
                            break
            result.append({
                'domain': 'standard',
                'instance-id': vm_id,
                'public-ip': address['address'],
            })

        result = applyEc2Filters(result , filters)

        return {'addresses': result}
예제 #3
0
파일: region.py 프로젝트: cc1-cloud/cc1
    def _execute(self):
        try:
            filters = parseFilters(self.parameters)

            endpoint = self.parameters['Endpoint']
        except KeyError:
            raise MissingParameter(parameter='Endpoint')

        cms = getClusterManagers(endpoint, self.cluster_manager)

        cms = applyEc2Filters(cms, filters)

        return cms
예제 #4
0
파일: image.py 프로젝트: cc1-cloud/cc1
    def _execute(self):
        GROUP_ACCESS = image_access['group']
        PRIVATE_ACCESS = image_access['private']
        PUBLIC_ACCESS = image_access['public']

        filters = parseFilters( self.parameters )
        if not validateEc2Filters( filters, self.available_filters ):
            raise InvalidFilter

        image_ids = []
        for param, value in self.parameters.iteritems():
            if param.startswith('ImageId'):
                image_id = parseID(value, Entity.image)
                if not image_id:
                    raise InvalidParameterValue
                image_ids.append( image_id )

        images = []
        for access in (PRIVATE_ACCESS, PUBLIC_ACCESS):

            access_images = self.cluster_manager.user.system_image.get_list({
                'access': access,
            })


            for image in access_images:
                if image_ids and str(image.get('image_id')) not in image_ids:
                    continue
                images.append({
                    'description': image.get('description').replace('<', ' '),
                    'image-id': image.get('image_id'),
                    'is_public': 'true' if access == PUBLIC_ACCESS else 'false',
                    'name': image['name'],
                    'owner_id': image.get('user_id'),
                    'platform': PLATFORM.get(image.get('platform')),
                    'state': STATE.get(image.get('state')),
                })

        # listowanie obrazów grupowych - one są zwracane w innej strukturze
        access_images = self.cluster_manager.user.system_image.get_list({'access': GROUP_ACCESS})


        for images_dict in access_images:
            for image in images_dict['images']:
                if image_ids and str(image.get('image_id')) not in image_ids:
                    continue
                images.append({
                    'description': image.get('description').replace('<', ' '),
                    'image-id': image.get('image_id'),
                    'is_public': 'true' if access == PUBLIC_ACCESS else 'false',
                    'name': image['name'],
                    'owner_id': image.get('user_id'),
                    'platform': PLATFORM.get(image.get('platform')),
                    'state': STATE.get(image.get('state')),
                })



        if filters.get('state'):
            for state in filters['state']:
                state = [k for k,v in STATE.iteritems() if v == STATE.get(state) ] # ?? wymaga testu
            del filters['state']

        images = applyEc2Filters(images, filters)
# filtry TODO:
# is-public

        return {'images': images}
예제 #5
0
class DescribeVolumes(Action):

    translation_filters = {'size' : 'size',
                           'volume-id' : 'volumeId',
                           'status' : 'status'}

    available_filters = ['size', 'volume-id', 'status']

    def _execute(self):
        volume_ids = []
        try:
            for param, value in self.parameters.iteritems():
                if param.startswith('VolumeId'):
                    volume_ids.append(value)
        except ValueError:
            raise InvalidParameterValue

        if volume_ids:
            volume_ids = parseIDs(volume_ids, Entity.volume)
            if not volume_ids:
                raise InvalidParameterValue

        volumes = []

        filters = parseFilters(self.parameters)
        if not validateEc2Filters(filters, self.available_filters):
            raise InvalidFilter


        # if extra arguments weren't given
        clm_volumes = []
        if not volume_ids:
            clm_volumes += self.cluster_manager.user.storage_image.get_list()

        # and if they were
        else:
            try:
                for volume_id in volume_ids:
                    clm_volumes.append(self.cluster_manager.user.storage_image.get_by_id({'storage_image_id':volume_id}))
            except CLMException, error:
                if error.status == 'image_get':
                    raise InvalidVolume.NotFound
                else:
                    raise UndefinedError

        for clm_volume in clm_volumes:
            create_time = clm_volume['creation_date']
            volume = {
                'attachTime': None,
                'createTime': parseClmDate(create_time),
                'size': clm_volume['size'] / SIZE_RATIO,
                'status': get_volume_status(clm_volume['state']),
                'volume-id': clm_volume['storage_image_id'],
            }
            volumes.append(volume)


        if filters.get('size'):
            for size in filters['size']:
                size = str(int(size) / SIZE_RATIO)

        if filters.get('status'):
            for state in filters['status']:
                state = [k for k, v in STATE.iteritems() if v == STATE.get(state) ]  # ?? wymaga testu


# attachment.attach-time - sprawdź
# attachment.delete-on-termination - ?
# attachment.device - nie
# attachment.instance-id - tak
# attachment.status - tak
# availability-zone- ?
# create-time - chyba tak
# size - TEST
# snapshot-id - nie
# status - tak TEST

# creating | available | in-use | deleting | deleted | error

# tag-key- ?
# volume-id - tak TEST
# volume-type - nie

        volumes = applyEc2Filters(volumes, filters)

        return {
            'volumes': volumes,
        }
예제 #6
0
class DescribeInstances(Action):
    available_filters = ['image-id', 'instance-id', 'reservation-id']

    def _execute(self):

        filters = parseFilters(self.parameters)
        if not validateEc2Filters(filters, self.available_filters):
            raise InvalidFilter

        clm_instances = []

        counter = 1
        while True:  # first we parse arguments provided in request
            instance_id = self.parameters.get('InstanceId.' + str(counter),
                                              None)

            if instance_id is None:  # if there no such argument then break
                break

            instance_id = parseID(instance_id, Entity.instance)
            if instance_id is None:
                raise InvalidParameterValue

            counter += 1
            try:
                instance = int(instance_id)
            except ValueError:
                raise InvalidParameterValue

            clm_instances.append({'vm_id': instance})

        # if we didn't provide specific IDs then use a whole list of user's VMs
        if not clm_instances:
            clm_instances = self.cluster_manager.user.vm.get_list()

        ec2_instances = []
        try:
            for clm_instance in clm_instances:
                clm_instance = self.cluster_manager.user.vm.get_by_id(
                    {'vm_id': clm_instance['vm_id']})
                if clm_instance['state'] == vm_states['closed']:
                    raise InvalidInstanceID.NotFound(
                        image_id=clm_instance['vm_id'])

                privateIpAddress = None
                if clm_instance['leases']:
                    privateIpAddress = clm_instance['leases'][0].get('address')

                ec2_instance = {
                    'image-id': clm_instance['image_id'],
                    'instance-id': clm_instance['vm_id'],
                    'instanceState': {
                        'code': CLM_STATES[clm_instance['state']][0],
                        'name': CLM_STATES[clm_instance['state']][1]
                    },  # TODO odpowiednia data!
                    'launchTime': parseClmDate(clm_instance['start_time']),
                    'template_name': clm_instance['template_name'],
                    'ownerId': clm_instance['user_id'],
                    'placement': {
                        'availabilityZone': self.cluster_manager.name
                    },
                    'privateIpAddress': privateIpAddress,
                    'reservation-id': clm_instance['reservation_id'],
                }

                public_ip = clm_instance['leases'][0]['public_ip']
                ec2_instance['ipAddress'] = public_ip.get(
                    'ip') if public_ip else None
                ec2_instances.append(ec2_instance)
        except CLMException, error:
            if error.status == 'vm_get' or error.status == 'user_permission':
                raise InvalidInstanceID.NotFound(
                    image_id=clm_instance['vm_id'])

        owner_id = None
        if ec2_instances:
            owner_id = ec2_instances[0]['ownerId']


# availability-zone - rozważyć
# block-device-mapping.attach-time - ?
# block-device-mapping.delete-on-termination - ?
# block-device-mapping.device-name - ?
# block-device-mapping.status - ?
# block-device-mapping.volume-id - ?
# client-token - ?
# dns-name - ?

# image-id - wspieramy - OK
# instance-id - wspieramy - OK
# instance-lifecycle - ?
# instance-state-code - możemy wspierać
# instance-state-name - będziemy wspierać
# instance-type - będziemy wspierać

# ip-address - będziemy wspierać
# key-name - ?
# launch-index - ?
# launch-time - możemy
# monitoring-state - ?
# placement-group-name - ?
# platform - możemy?
# private-ip-address - przydałoby się
# product-code - ?
# product-code.type - ?

# reason - ?

# reservation-id - ??

# tag-key - ?
# tag-value - ?
# virtualization-type - chyba mamy tlyko jeden typ
# vpc-id - ?
# hypervisor - ? chyba tylko 1

# association.public-ip - nie wiem?

        reservation_filter = None
        if filters and filters.get('reservation-id'):
            reservation_filter = {'reservation-id': filters['reservation-id']}
            del filters['reservation-id']

        ec2_instances = applyEc2Filters(ec2_instances, filters)

        reservationsIds = []
        for ec2_instance in ec2_instances:
            reservationId = int(ec2_instance['reservation-id'])
            if reservationId not in reservationsIds:
                reservationsIds.append(reservationId)

        reservations = []
        for reservation in reservationsIds:
            reservations.append({
                'reservation-id':
                reservation,
                'ownerId':
                owner_id,
                'instances': [
                    instance for instance in ec2_instances
                    if instance['reservation-id'] == reservation
                ]
            })

        if reservation_filter:
            reservations = applyEc2Filters(reservations, reservation_filter)

        return {'reservations': reservations}
예제 #7
0
    def _execute(self):
        GROUP_ACCESS = image_access['group']
        PRIVATE_ACCESS = image_access['private']
        PUBLIC_ACCESS = image_access['public']

        filters = parseFilters(self.parameters)
        if not validateEc2Filters(filters, self.available_filters):
            raise InvalidFilter

        image_ids = []
        for param, value in self.parameters.iteritems():
            if param.startswith('ImageId'):
                image_id = parseID(value, Entity.image)
                if not image_id:
                    raise InvalidParameterValue
                image_ids.append(image_id)

        images = []
        for access in (PRIVATE_ACCESS, PUBLIC_ACCESS):

            access_images = self.cluster_manager.user.system_image.get_list({
                'access':
                access,
            })

            for image in access_images:
                if image_ids and str(image.get('image_id')) not in image_ids:
                    continue
                images.append({
                    'description':
                    image.get('description').replace('<', ' '),
                    'image-id':
                    image.get('image_id'),
                    'is_public':
                    'true' if access == PUBLIC_ACCESS else 'false',
                    'name':
                    image['name'],
                    'owner_id':
                    image.get('user_id'),
                    'platform':
                    PLATFORM.get(image.get('platform')),
                    'state':
                    STATE.get(image.get('state')),
                })

        # listowanie obrazów grupowych - one są zwracane w innej strukturze
        access_images = self.cluster_manager.user.system_image.get_list(
            {'access': GROUP_ACCESS})

        for images_dict in access_images:
            for image in images_dict['images']:
                if image_ids and str(image.get('image_id')) not in image_ids:
                    continue
                images.append({
                    'description':
                    image.get('description').replace('<', ' '),
                    'image-id':
                    image.get('image_id'),
                    'is_public':
                    'true' if access == PUBLIC_ACCESS else 'false',
                    'name':
                    image['name'],
                    'owner_id':
                    image.get('user_id'),
                    'platform':
                    PLATFORM.get(image.get('platform')),
                    'state':
                    STATE.get(image.get('state')),
                })

        if filters.get('state'):
            for state in filters['state']:
                state = [
                    k for k, v in STATE.iteritems() if v == STATE.get(state)
                ]  # ?? wymaga testu
            del filters['state']

        images = applyEc2Filters(images, filters)
        # filtry TODO:
        # is-public

        return {'images': images}