Example #1
0
    def list(self, instanceid=None, days=None):
        repositories.setup_database_engine_and_factory()
        repo = repositories.get_vmexpire_repository()
        res = repo.get_all_by(instance_id=instanceid, project_id=None)
        headers = [
            'id', 'expire', 'instance.name', 'instance.id', 'project.id',
            'user.id', 'notif', 'notif.last'
        ]
        limit = None
        if days:
            try:
                dt = datetime.datetime.now() + datetime.timedelta(
                    days=int(days))
                limit = time.mktime(dt.timetuple())
            except Exception as e:
                print(str(e))
                return
        pt = prettytable.PrettyTable(headers)
        for instance in res:
            if limit and instance.expire > limit:
                continue

            pt.add_row([
                instance.id,
                datetime.datetime.fromtimestamp(instance.expire),
                instance.instance_name, instance.instance_id,
                instance.project_id, instance.user_id, instance.notified,
                instance.notified_last
            ])
        if six.PY3:
            print(encodeutils.safe_encode(pt.get_string()).decode())
        else:
            print(encodeutils.safe_encode(pt.get_string()))
Example #2
0
 def tearDown(self):
     super(WhenTestingVmExpiresResource, self).tearDown()
     repo = repositories.get_vmexpire_repository()
     repo.delete_all_entities()
     repositories.commit()
     exclude_repo = repositories.get_vmexclude_repository()
     exclude_repo.delete_all_entities()
     repositories.commit()
Example #3
0
 def remove(self, expirationid):
     if not expirationid:
         print("Missing id paramerer")
         return
     repositories.setup_database_engine_and_factory()
     repo = repositories.get_vmexpire_repository()
     repo.delete_entity_by_id(entity_id=expirationid)
     repositories.commit()
     print("VM expiration successfully removed!")
Example #4
0
 def extend(self, expirationid):
     if not expirationid:
         print("Missing id parameter")
         return
     repositories.setup_database_engine_and_factory()
     repo = repositories.get_vmexpire_repository()
     repo.extend_vm(entity_id=expirationid)
     repositories.commit()
     print("VM expiration successfully extended!")
Example #5
0
    def add(self, instanceid):
        if not instanceid:
            print("Missing id parameter")
            return
        repositories.setup_database_engine_and_factory()
        repo = repositories.get_vmexpire_repository()
        instance = repo.add_vm(instanceid)
        if not instance:
            print("Failure to add VM expiration, check logs")
            return

        repositories.commit()
        print("VM expiration successfully generated!")
Example #6
0
def create_vmexpire(instance=None, session=None):
    expire = models.VmExpire()
    expire.project_id = instance.project_id
    expire.instance_id = instance.instance_id
    expire.instance_name = instance.instance_name
    expire.user_id = instance.user_id
    expire.expire = time.mktime(
        datetime.datetime.now().timetuple()) + 2 * 3600 * 24
    expire.notified = False
    expire.notified_last = False
    container_repo = repositories.get_vmexpire_repository()
    container_repo.create_from(expire, session=session)
    return expire
Example #7
0
 def test_vm_create(self, mock_get, mock_post, mock_get_project_domain):
     create_msg = {
         'nova_object.data': {
             'uuid': '1-2-3-4-5',
             'display_name': '12345',
             'tenant_id': '12345project',
             'user_id': '12345user'
         }
     }
     self.task.info(None, 'mock', 'instance.create.end', create_msg, None)
     repo = repositories.get_vmexpire_repository()
     expire = repo.get_by_instance(create_msg['nova_object.data']['uuid'])
     self.assertEqual(expire.instance_id,
                      create_msg['nova_object.data']['uuid'])
     self.assertTrue(expire.expire > 0)
Example #8
0
def check(started_at):
    token = get_identity_token()
    conf_cleaner = config.CONF.cleaner
    LOG.debug("check instances")
    repo = repositories.get_vmexpire_repository()
    now = int(time.mktime(datetime.datetime.now().timetuple()))
    check_time = now + (conf_cleaner.notify_before_days * 3600 * 24)
    last_check_time = now + (conf_cleaner.notify_before_days_last * 3600 * 24)
    entities = repo.get_entities(expiration_filter=check_time)
    for entity in entities:
        if entity.expire < check_time and not entity.notified:
            # notify
            LOG.debug("First expiration notification %s" % (entity.id))
            res = send_email(entity, token, delete=False)
            if res:
                entity.notified = True
                try:
                    entity.save()
                    repositories.commit()
                except Exception as e:
                    LOG.exception("expiration save error: " + str(e))
                    repositories.rollback()
        elif entity.expire < last_check_time and not entity.notified_last:
            # notify_last
            LOG.debug("Last expiration notification %s" % (entity.id))
            res = send_email(entity, token, delete=False)
            if res:
                entity.notified_last = True
                try:
                    entity.save()
                    repositories.commit()
                except Exception as e:
                    LOG.exception("expiration save error: " + str(e))
                    repositories.rollback()
        elif entity.expire < now:
            # delete
            LOG.debug("Delete VM %s" % (entity.id))
            res = delete_vm(entity.instance_id, entity.project_id, token)
            if res:
                try:
                    repo.delete_entity_by_id(entity_id=entity.id)
                    repositories.commit()
                except Exception as e:
                    LOG.exception("expiration deletion error: " + str(e))
                    repositories.rollback()
                send_email(entity, token, delete=True)
Example #9
0
 def test_vm_exclude_user(self, mock_get, mock_post,
                          mock_get_project_domain):
     create_msg = {
         'nova_object.data': {
             'uuid': '1-2-3-4-5',
             'display_name': '12345',
             'tenant_id': '12345project',
             'user_id': '12345user'
         }
     }
     entity = create_vmexclude_model('12345user', 2)
     create_vmexclude(entity)
     self.task.info(None, 'mock', 'instance.create.end', create_msg, None)
     repo = repositories.get_vmexpire_repository()
     try:
         repo.get_by_instance(create_msg['nova_object.data']['uuid'])
     except Exception as e:
         logging.info('instance not found: ' + str(e))
     else:
         self.self.fail('domain is excluded, should not have been created')
Example #10
0
 def test_vm_delete(self):
     self.test_vm_create()
     delete_msg = {
         'nova_object.data': {
             'uuid': '1-2-3-4-5',
             'display_name': '12345',
             'tenant_id': '12345project',
             'user_id': '12345user'
         }
     }
     self.task.info(None, 'mock', 'instance.delete.end', delete_msg, None)
     repo = repositories.get_vmexpire_repository()
     found = False
     try:
         expire = repo.get_by_instance(
             delete_msg['nova_object.data']['uuid'])
         if expire:
             found = True
     except Exception as e:
         logging.exception(e)
         found = False
     self.assertFalse(found)
Example #11
0
    def info(self, ctxt, publisher_id, event_type, payload, metadata):
        if event_type == 'instance.create.end':
            LOG.debug(event_type + ':' + payload['nova_object.data']['uuid'])
            repo = repositories.get_vmexpire_repository()
            instance = None
            instance_uuid = str(payload['nova_object.data']['uuid'])
            try:
                instance = repo.get_by_instance(instance_uuid)
            except Exception:
                LOG.debug("Fine, instance does not already exists")
            if instance:
                LOG.warn("InstanceAlreadyExists:" + instance_uuid +
                         ", deleting first")
                repo.delete_entity_by_id(entity_id=instance.id)
            entity = models.VmExpire()
            entity.instance_id = instance_uuid
            if payload['nova_object.data']['display_name']:
                display_name = payload['nova_object.data']['display_name']
                entity.instance_name = display_name
            else:
                entity.instance_name = instance_uuid
            entity.project_id = payload['nova_object.data']['tenant_id']
            entity.user_id = payload['nova_object.data']['user_id']
            entity.expire = int(
                time.mktime(datetime.datetime.now().timetuple()) +
                (CONF.max_vm_duration * 3600 * 24))
            entity.notified = False
            entity.notified_last = False

            project_domain = None
            try:
                project_domain = get_project_domain(entity.project_id)
            except Exception:
                LOG.exception('Failed to get domain for project')

            exclude_repo = repositories.get_vmexclude_repository()
            if project_domain:
                exclude_id = exclude_repo.get_exclude_by_id(project_domain)
                if exclude_id:
                    LOG.debug('domain %s is excluded, skipping' %
                              (project_domain))
                    return
            exclude_id = exclude_repo.get_exclude_by_id(entity.project_id)
            if exclude_id:
                LOG.debug('project %s is excluded, skipping' %
                          (entity.project_id))
                return
            exclude_id = exclude_repo.get_exclude_by_id(entity.user_id)
            if exclude_id:
                LOG.debug('user %s is excluded, skipping' % (entity.user_id))
                return

            instance = repo.create_from(entity)
            LOG.debug("NewInstanceExpiration:" + instance_uuid)
        elif event_type == 'instance.delete.end':
            instance_uuid = str(payload['nova_object.data']['uuid'])
            LOG.debug(event_type + ':' + instance_uuid)
            repo = repositories.get_vmexpire_repository()
            try:
                instance = repo.get_by_instance(instance_uuid)
                repo.delete_entity_by_id(entity_id=instance.id)
                LOG.debug("Delete id:" + instance.id)
            except Exception:
                LOG.warn('Failed to delete: ' + instance_uuid)

        LOG.debug(publisher_id)
        LOG.debug(event_type)
        LOG.debug(str(metadata))
        LOG.debug(json.dumps(payload, indent=4))
Example #12
0
def create_vmexpire(entity):
    repo = repositories.get_vmexpire_repository()
    instance = repo.create_from(entity)
    repositories.commit()
    return instance
Example #13
0
 def tearDown(self):
     super(WhenTestingVmExpiresResource, self).tearDown()
     repo = repositories.get_vmexpire_repository()
     repo.delete_all_entities()
     repositories.commit()
     repositories.CONF.max_vm_total_duration = self.max_vm_total_duration
Example #14
0
 def __init__(self, project_id):
     self.project_id = str(project_id)
     self.vmexpire_repo = repo.get_vmexpire_repository()
Example #15
0
def get_vmexpire(entity_id):
    repo = repositories.get_vmexpire_repository()
    instance = repo.get(entity_id=entity_id)
    return instance