Esempio n. 1
0
    def volume(self):
        """Return the volume object for the issue

        Returns:
            `EBSVolume`
        """
        return EBSVolume.get(self.get_property('volume_id').value)
Esempio n. 2
0
    def get(self):
        self.reqparse.add_argument('page', type=int, default=1)
        self.reqparse.add_argument('count', type=int, default=100, choices=[25, 50, 100])
        self.reqparse.add_argument('accounts', type=str, default=None, action='append')
        self.reqparse.add_argument('regions', type=str, default=None, action='append')
        self.reqparse.add_argument('state', type=str, default=None)
        self.reqparse.add_argument('type', type=str, default=None, action='append')

        args = self.reqparse.parse_args()
        query = {
            'limit': args['count'],
            'page': args['page'],
            'properties': {}
        }
        if args['accounts']:
            query['accounts'] = args['accounts']

        if args['regions']:
            query['locations'] = args['regions']

        if args['state'] and len(args['state']) > 0:
            query['properties']['state'] = args['state']

        if args['type']:
            query['properties']['volume_type'] = args['type']

        total, volumes = EBSVolume.search(**query)
        volume_count = len(volumes)
        volume_types = sorted(('gp2', 'io1', 'st1', 'sc1', 'standard'))
        response = {
            'message': None,
            'volumeCount': total,
            'volumeTypes': volume_types,
            'volumes': volumes
        }

        if volume_count == 0:
            return self.make_response({
                'message': 'No volumes found matching criteria',
                'volumeCount': total,
                'volumeTypes': volume_types,
                'volumes': []
            }, HTTP.NOT_FOUND)

        return self.make_response(response)
Esempio n. 3
0
    def get_unattached_volumes(self):
        """Build a list of all volumes missing tags and not ignored. Returns a `dict` keyed by the issue_id with the
        volume as the value

        Returns:
            :obj:`dict` of `str`: `EBSVolume`
        """
        volumes = {}
        ignored_tags = dbconfig.get('ignore_tags', self.ns)
        for volume in EBSVolume.get_all().values():
            issue_id = get_resource_id('evai', volume.id)

            if len(volume.attachments) == 0:
                if len(
                        list(
                            filter(
                                set(ignored_tags).__contains__,
                                [tag.key for tag in volume.tags]))):
                    continue

                volumes[issue_id] = volume

        return volumes
Esempio n. 4
0
    def update_volumes(self):
        """Update list of EBS Volumes for the account / region

        Returns:
            `None`
        """
        self.log.debug('Updating EBSVolumes for {}/{}'.format(
            self.account.account_name, self.region))
        ec2 = self.session.resource('ec2', region_name=self.region)

        try:
            existing_volumes = EBSVolume.get_all(self.account, self.region)
            volumes = {x.id: x for x in ec2.volumes.all()}

            for data in list(volumes.values()):
                if data.id in existing_volumes:
                    vol = existing_volumes[data.id]
                    if vol.update(data):
                        self.log.debug(
                            'Changed detected for EBSVolume {}/{}/{}'.format(
                                self.account.account_name, self.region,
                                vol.resource.resource_id))

                else:
                    properties = {
                        'create_time':
                        data.create_time,
                        'encrypted':
                        data.encrypted,
                        'iops':
                        data.iops or 0,
                        'kms_key_id':
                        data.kms_key_id,
                        'size':
                        data.size,
                        'state':
                        data.state,
                        'snapshot_id':
                        data.snapshot_id,
                        'volume_type':
                        data.volume_type,
                        'attachments':
                        sorted([x['InstanceId'] for x in data.attachments])
                    }
                    tags = {t['Key']: t['Value'] for t in data.tags or {}}
                    vol = EBSVolume.create(data.id,
                                           account_id=self.account.account_id,
                                           location=self.region,
                                           properties=properties,
                                           tags=tags)

                    self.log.debug('Added new EBSVolume {}/{}/{}'.format(
                        self.account.account_name, self.region,
                        vol.resource.resource_id))
            db.session.commit()

            vk = set(list(volumes.keys()))
            evk = set(list(existing_volumes.keys()))
            try:
                for volumeID in evk - vk:
                    db.session.delete(existing_volumes[volumeID].resource)
                    self.log.debug('Deleted EBSVolume {}/{}/{}'.format(
                        volumeID, self.account.account_name, self.region))

                db.session.commit()
            except:
                self.log.exception('Failed removing deleted volumes')
                db.session.rollback()
        finally:
            del ec2
Esempio n. 5
0
    def get(self, volume_id):
        vol = EBSVolume.get(volume_id)

        return self.make_response({
            'volume': vol
        }, HTTP.OK)