Пример #1
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
Пример #2
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