def volume(self): """Return the volume object for the issue Returns: `EBSVolume` """ return EBSVolume.get(self.get_property('volume_id').value)
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)
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
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
def get(self, volume_id): vol = EBSVolume.get(volume_id) return self.make_response({ 'volume': vol }, HTTP.OK)