コード例 #1
0
ファイル: test_primary_name.py プロジェクト: jrha/aquilon
def teardown():
    sess.close()
    (ms, intrnl) = get_reqs()

    #TODO: move this general approach to test_dns???
    # generalize the entire approach and take a count on the way in and out
    qry = sess.query(ARecord).filter(
        ARecord.name.like(AREC_PREFIX + '%'))
    qry = qry.filter_by(dns_environment=intrnl)
    if qry.count() == 0:
        log.info('successful cascaded deletion of ARecords')
    else:
        log.error('ARecords left intact when they should be delete cascaded')
    for rec in qry.filter_by(dns_domain=ms).all():
        sess.delete(rec)
        commit(sess)
        log.debug('deleted ARecord %s' % rec.fqdn)

    dns_count_after = sess.query(DnsRecord).count()

    if dns_count_after != dns_count_b4:
        log.warning('%s record(s) left after teardown in %s, should be %s' % (
            dns_count_after, func_name(), dns_count_b4))

    del_machines(sess, MCHN_PREFIX)

    mchn_count_after = sess.query(Machine).count()
    if mchn_count_b4 != mchn_count_after:
        log.warning('%s machines left after %s, should be %s'%(
            mchn_count_after, func_name(), mchn_count_b4))
コード例 #2
0
ファイル: test_interface.py プロジェクト: ned21/aquilon
def test_create_machines_for_test_interface():
    np = Building.get_unique(sess, 'np')
    assert isinstance(np, Building), 'no building in %s' % func_name()

    hp = Vendor.get_unique(sess, 'hp')
    assert isinstance(hp, Vendor), 'no vendor in %s' % func_name()

    am = Model.get_unique(sess, name='bl45p', vendor=hp)
    assert isinstance(am, Model), 'no model in %s' % func_name()

    cpu = sess.query(Cpu).first()
    assert isinstance(cpu, Cpu), 'no cpu in %s' % func_name()

    for i in xrange(NUM_MACHINES):
        machine = Machine(label='%s%s' % (MACHINE_NAME_PREFIX, i),
                          location=np,
                          model=am,
                          cpu=cpu,
                          cpu_quantity=2,
                          memory=32768)
        create(sess, machine)

    machines = sess.query(Machine).filter(
        Machine.label.like(MACHINE_NAME_PREFIX + '%')).all()

    eq_(len(machines), NUM_MACHINES)
コード例 #3
0
def teardown():
    sess.close()
    (ms, intrnl) = get_reqs()

    #TODO: move this general approach to test_dns???
    # generalize the entire approach and take a count on the way in and out
    qry = sess.query(ARecord).filter(ARecord.name.like(AREC_PREFIX + '%'))
    qry = qry.filter_by(dns_environment=intrnl)
    if qry.count() == 0:
        log.info('successful cascaded deletion of ARecords')
    else:
        log.error('ARecords left intact when they should be delete cascaded')
    for rec in qry.filter_by(dns_domain=ms).all():
        sess.delete(rec)
        commit(sess)
        log.debug('deleted ARecord %s' % rec.fqdn)

    dns_count_after = sess.query(DnsRecord).count()

    if dns_count_after != dns_count_b4:
        log.warning('%s record(s) left after teardown in %s, should be %s' %
                    (dns_count_after, func_name(), dns_count_b4))

    del_machines(sess, MCHN_PREFIX)

    mchn_count_after = sess.query(Machine).count()
    if mchn_count_b4 != mchn_count_after:
        log.warning('%s machines left after %s, should be %s' %
                    (mchn_count_after, func_name(), mchn_count_b4))
コード例 #4
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def test_cluster_bound_svc():
    """ test the creation of a cluster bound service """
    si = add_service_instance(sess, SVC_NAME, INST_NAME)
    assert si, "no service instance in %s" % func_name()

    ec = Cluster.get_unique(sess, CLUSTER_NAME)
    cs = ClusterServiceBinding(cluster=ec, service_instance=si)
    create(sess, cs)

    assert cs, "no cluster bound service created by" % func_name()
    print cs
コード例 #5
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def test_cluster_bound_svc():
    """ test the creation of a cluster bound service """
    si = add_service_instance(sess, SVC_NAME, INST_NAME)
    assert si, 'no service instance in %s' % func_name()

    ec = Cluster.get_unique(sess, CLUSTER_NAME)
    cs = ClusterServiceBinding(cluster=ec, service_instance=si)
    create(sess, cs)

    assert cs, 'no cluster bound service created by' % func_name()
    print cs
コード例 #6
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def add_service_instance(sess, service_name, name):
    si = sess.query(ServiceInstance).filter_by(name=name).first()
    if not si:
        print "Creating %s instance %s " % (service_name, name)

        svc = sess.query(Service).filter_by(name=service_name).one()
        assert svc, "No %s service in %s" % (service_name, func_name())

        si = ServiceInstance(name=name, service=svc)
        create(sess, si)
        assert si, "no service instance created by %s" % func_name()
    return si
コード例 #7
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def test_add_aligned_service():
    svc = sess.query(Service).filter_by(name=SVC_NAME).first()
    assert svc, "No cluster management service in %s" % func_name()

    cas = ClusterAlignedService(cluster_type="esx", service=svc)
    create(sess, cas)
    assert cas, "no cluster aligned service created by %s" % func_name()
    print cas

    ec = sess.query(EsxCluster).first()
    print "%s has required services %s" % (ec.name, ec.required_services)
    assert ec.required_services
コード例 #8
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def test_add_aligned_service():
    svc = sess.query(Service).filter_by(name=SVC_NAME).first()
    assert svc, 'No cluster management service in %s' % func_name()

    cas = ClusterAlignedService(cluster_type='esx', service=svc)
    create(sess, cas)
    assert cas, 'no cluster aligned service created by %s' % func_name()
    print cas

    ec = sess.query(EsxCluster).first()
    print '%s has required services %s' % (ec.name, ec.required_services)
    assert ec.required_services
コード例 #9
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def add_service_instance(sess, service_name, name):
    si = sess.query(ServiceInstance).filter_by(name=name).first()
    if not si:
        print 'Creating %s instance %s ' % (service_name, name)

        svc = sess.query(Service).filter_by(name=service_name).one()
        assert svc, 'No %s service in %s' % (service_name, func_name())

        si = ServiceInstance(name=name, service=svc)
        create(sess, si)
        assert si, 'no service instance created by %s' % func_name()
    return si
コード例 #10
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def test_cascaded_delete2():
    """ deleting services deletes cluster aligned services """
    svc = sess.query(Service).filter_by(name=SVC_2).first()
    assert svc, "No throw away service in %s" % func_name()

    # add cas, delete the service, make sure the CAS disappears
    cas = ClusterAlignedService(cluster_type="esx", service=svc)
    create(sess, cas)
    assert cas, "No cluster aligned service in %s" % func_name()

    # FIX ME: put in tear_down()
    sess.delete(svc)
    commit(sess)
    sess.refresh(cas)
    sess.refresh(svc)
コード例 #11
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def test_cascaded_delete2():
    """ deleting services deletes cluster aligned services """
    svc = sess.query(Service).filter_by(name=SVC_2).first()
    assert svc, "No throw away service in %s" % func_name()

    #add cas, delete the service, make sure the CAS disappears
    cas = ClusterAlignedService(cluster_type='esx', service=svc)
    create(sess, cas)
    assert cas, "No cluster aligned service in %s" % func_name()

    #FIX ME: put in tear_down()
    sess.delete(svc)
    commit(sess)
    sess.refresh(cas)
    sess.refresh(svc)
コード例 #12
0
ファイル: test_ns_record.py プロジェクト: jrha/aquilon
def setup():
    dmn = DnsDomain(name=DNS_DOMAIN_NAME)
    create(sess, dmn)
    assert dmn, 'no dns domain in %s' % func_name()

    pi = Building.get_unique(sess, name='pi', compel=True)

    n = IPv4Network(TEST_NET)
    net = Network(name=TEST_NET_NAME, network=n, location=pi)
    create(sess, net)
    assert net, 'no network created by %s' % func_name()

    ip = IPv4Address(TEST_IP)
    arec = ARecord(name=AREC_NAME, dns_domain=dmn, ip=ip, network=net)
    create(sess, arec)
    assert arec, 'no ARecord created by %s' % func_name()
コード例 #13
0
ファイル: test_interface.py プロジェクト: jrha/aquilon
def test_create_iface():
    machine = sess.query(Machine).first()

    iface = Interface(hardware_entity=machine, name='eth0', mac=random_mac(),
                      bootable=True, interface_type='public')
    create(sess, iface)
    assert isinstance(iface, Interface), 'no iface created @ %s' % func_name()
コード例 #14
0
ファイル: test_ns_record.py プロジェクト: ned21/aquilon
def setup():
    dmn = DnsDomain(name=DNS_DOMAIN_NAME)
    create(sess, dmn)
    assert dmn, 'no dns domain in %s' % func_name()

    pi = Building.get_unique(sess, name='pi', compel=True)

    n = IPv4Network(TEST_NET)
    net = Network(name=TEST_NET_NAME, network=n, location=pi)
    create(sess, net)
    assert net, 'no network created by %s' % func_name()

    ip = IPv4Address(TEST_IP)
    arec = ARecord(name=AREC_NAME, dns_domain=dmn, ip=ip, network=net)
    create(sess, arec)
    assert arec, 'no ARecord created by %s' % func_name()
コード例 #15
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def test_create_cluster():
    # TODO: make this a reusable function in test_cluster and import
    np = sess.query(Building).filter_by(name="np").one()
    dmn = sess.query(Domain).first()
    assert dmn, "No domain found in %s" % func_name()
    per = (
        sess.query(Personality)
        .select_from(join(Archetype, Personality))
        .filter(and_(Archetype.name == "windows", Personality.name == "generic"))
        .one()
    )

    ec = EsxCluster(name=CLUSTER_NAME, location_constraint=np, personality=per, domain=dmn)

    create(sess, ec)

    assert ec, "No EsxCluster created by %s" % func_name()
    print ec
コード例 #16
0
def test_no_duplicate_primary_name_entries():
    """ Ensures that a primary name can not be duplicated """

    a_rcrd = sess.query(ARecord).filter_by(ip=IP_ADDRS[0]).first()
    assert a_rcrd, 'No a_record in %s' % func_name()

    mchn = add_machine(sess, MCHN_PREFIX + str(unique_number.next()))
    assert mchn, 'no machine created in %s' % func_name()

    try:
        pna = PrimaryNameAssociation(hardware_entity=mchn, a_record=a_rcrd)
        #a_record_id=a_rcrd.dns_record_id)
        sess.add(pna)
        sess.commit()
        print 'should fail but %r ' % pna
    except Exception, e:
        sess.rollback()
        raise e
コード例 #17
0
ファイル: test_primary_name.py プロジェクト: jrha/aquilon
def test_no_duplicate_primary_name_entries():
    """ Ensures that a primary name can not be duplicated """

    a_rcrd = sess.query(ARecord).filter_by(ip=IP_ADDRS[0]).first()
    assert a_rcrd, 'No a_record in %s' % func_name()

    mchn = add_machine(sess, MCHN_PREFIX + str(unique_number.next()))
    assert mchn, 'no machine created in %s' % func_name()

    try:
        pna = PrimaryNameAssociation(hardware_entity=mchn, a_record=a_rcrd)
                                     #a_record_id=a_rcrd.dns_record_id)
        sess.add(pna)
        sess.commit()
        print 'should fail but %r ' % pna
    except Exception, e:
        sess.rollback()
        raise e
コード例 #18
0
ファイル: test_interface.py プロジェクト: ned21/aquilon
def test_create_iface():
    machine = sess.query(Machine).first()

    iface = Interface(hardware_entity=machine,
                      name='eth0',
                      mac=random_mac(),
                      bootable=True,
                      interface_type='public')
    create(sess, iface)
    assert isinstance(iface, Interface), 'no iface created @ %s' % func_name()
コード例 #19
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def test_create_cluster():
    #TODO: make this a reusable function in test_cluster and import
    np = sess.query(Building).filter_by(name='np').one()
    dmn = sess.query(Domain).first()
    assert dmn, 'No domain found in %s' % func_name()
    per = sess.query(Personality).select_from(join(
        Archetype, Personality)).filter(
            and_(Archetype.name == 'windows',
                 Personality.name == 'generic')).one()

    ec = EsxCluster(name=CLUSTER_NAME,
                    location_constraint=np,
                    personality=per,
                    domain=dmn)

    create(sess, ec)

    assert ec, "No EsxCluster created by %s" % func_name()
    print ec
コード例 #20
0
ファイル: test_primary_name.py プロジェクト: jrha/aquilon
def add_arecord(ip):
    """ adding a valid ARecord """
    (ms, intrnl) = get_reqs()
    a_rcrd = ARecord(name=AREC_PREFIX + str(unique_number.next()),
                     dns_domain=ms, dns_environment=intrnl,
                     ip=ip, comments='comment here', session=sess)
    create(sess, a_rcrd)

    assert a_rcrd, 'no a_record created by %s' % func_name()
    sess.refresh(a_rcrd)

    return a_rcrd
コード例 #21
0
ファイル: test_interface.py プロジェクト: jrha/aquilon
def test_fail_upd_mgmt_iface_to_null_mac():
    machine = sess.query(Machine).first()

    iface = Interface(hardware_entity=machine, name='ipmi', mac=random_mac(),
                      bootable=True, interface_type='management')
    create(sess, iface)
    assert isinstance(iface, Interface), 'no iface created @ %s' % func_name()

    iface.mac = None
    commit(sess)

    assert iface.mac is not None, 'set a management iface to null mac_addr'
コード例 #22
0
ファイル: test_interface.py プロジェクト: jrha/aquilon
def test_fail_upd_bootable_iface_to_null_mac():
    machine = sess.query(Machine).first()

    iface = Interface(hardware_entity=machine, name='eth1', mac=random_mac(),
                      bootable=True, interface_type='public')
    create(sess, iface)
    assert isinstance(iface, Interface), 'no iface created @ %s' % func_name()

    iface.mac = None
    commit(sess)

    assert iface.mac is not None, 'able to set a bootable interface to null'
コード例 #23
0
ファイル: test_host.py プロジェクト: jrha/aquilon
def test_create_machines_for_test_host():
    np = Building.get_unique(sess, 'np')
    assert isinstance(np,Building), 'no building in %s' % func_name()

    hp = Vendor.get_unique(sess, 'hp')
    assert isinstance(hp, Vendor), 'no vendor in %s' % func_name()

    am = Model.get_unique(sess, name='bl45p', vendor=hp)
    assert isinstance(am, Model), 'no model in %s' % func_name()

    cpu = sess.query(Cpu).first()
    assert isinstance(cpu, Cpu), 'no cpu in %s' % func_name()

    for i in xrange(NUM_MACHINES):
        machine = Machine(label='%s%s'% (MACHINE_NAME_PREFIX, i), location=np,
                          model=am, cpu=cpu, cpu_quantity=2, memory=32768)
        create(sess, machine)

    machines = sess.query(Machine).filter(
        Machine.label.like(MACHINE_NAME_PREFIX+'%')).all()

    eq_(len(machines), NUM_MACHINES)
コード例 #24
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def test_cascaded_delete_1():
    """ test that deleting service bindings don't delete services """

    print 'Creating throw away service'
    svc = add_service(sess, SVC_2)

    assert svc, 'service not created by %s' % func_name()
    print 'added throw away service %s' % (svc)

    #make it a cluster aligned svc
    cas = ClusterAlignedService(cluster_type='esx', service=svc)
    create(sess, cas)
    assert cas, "No cluster aligned service in %s" % func_name()
    """
        delete the cas, see if the service is still there. sess.refresh(obj)
        will throw 'InvalidRequestError: Instance xxx is not persistent within
        this Session' if it's been deleted
    """
    sess.delete(cas)
    commit(sess)
    sess.refresh(svc)
    assert svc, "Service deleted when deleting the cluster aligned service"
    print "still have %s after deleting cluster aligned svc" % svc
コード例 #25
0
ファイル: test_interface.py プロジェクト: ned21/aquilon
def test_fail_upd_bootable_iface_to_null_mac():
    machine = sess.query(Machine).first()

    iface = Interface(hardware_entity=machine,
                      name='eth1',
                      mac=random_mac(),
                      bootable=True,
                      interface_type='public')
    create(sess, iface)
    assert isinstance(iface, Interface), 'no iface created @ %s' % func_name()

    iface.mac = None
    commit(sess)

    assert iface.mac is not None, 'able to set a bootable interface to null'
コード例 #26
0
ファイル: test_interface.py プロジェクト: ned21/aquilon
def test_fail_upd_mgmt_iface_to_null_mac():
    machine = sess.query(Machine).first()

    iface = Interface(hardware_entity=machine,
                      name='ipmi',
                      mac=random_mac(),
                      bootable=True,
                      interface_type='management')
    create(sess, iface)
    assert isinstance(iface, Interface), 'no iface created @ %s' % func_name()

    iface.mac = None
    commit(sess)

    assert iface.mac is not None, 'set a management iface to null mac_addr'
コード例 #27
0
def add_arecord(ip):
    """ adding a valid ARecord """
    (ms, intrnl) = get_reqs()
    a_rcrd = ARecord(name=AREC_PREFIX + str(unique_number.next()),
                     dns_domain=ms,
                     dns_environment=intrnl,
                     ip=ip,
                     comments='comment here',
                     session=sess)
    create(sess, a_rcrd)

    assert a_rcrd, 'no a_record created by %s' % func_name()
    sess.refresh(a_rcrd)

    return a_rcrd
コード例 #28
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def test_cascaded_delete_1():
    """ test that deleting service bindings don't delete services """

    print "Creating throw away service"
    svc = add_service(sess, SVC_2)

    assert svc, "service not created by %s" % func_name()
    print "added throw away service %s" % (svc)

    # make it a cluster aligned svc
    cas = ClusterAlignedService(cluster_type="esx", service=svc)
    create(sess, cas)
    assert cas, "No cluster aligned service in %s" % func_name()

    """
        delete the cas, see if the service is still there. sess.refresh(obj)
        will throw 'InvalidRequestError: Instance xxx is not persistent within
        this Session' if it's been deleted
    """
    sess.delete(cas)
    commit(sess)
    sess.refresh(svc)
    assert svc, "Service deleted when deleting the cluster aligned service"
    print "still have %s after deleting cluster aligned svc" % svc
コード例 #29
0
def test_primary_name_cascaded_deletion():
    """ Ensure desired cascade behavior happens """

    #sess.expunge_all()
    #db.engine.echo = True
    logging.getLogger('sqlalchemy.orm').setLevel(logging.DEBUG)

    pna_count_b4 = sess.query(PrimaryNameAssociation).count()
    log.info('count before pna delete is %s' % pna_count_b4)

    mchn = sess.query(Machine).filter(Machine.label.like(MCHN_PREFIX +
                                                         '%')).first()
    assert mchn, 'no machine found in %s' % func_name()

    #logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

    try:
        sess.delete(mchn)
        sess.commit()
    except Exception, e:
        sess.close()
        raise e
コード例 #30
0
ファイル: test_primary_name.py プロジェクト: jrha/aquilon
def test_primary_name_cascaded_deletion():
    """ Ensure desired cascade behavior happens """

    #sess.expunge_all()
    #db.engine.echo = True
    logging.getLogger('sqlalchemy.orm').setLevel(logging.DEBUG)

    pna_count_b4 = sess.query(PrimaryNameAssociation).count()
    log.info('count before pna delete is %s' % pna_count_b4)


    mchn = sess.query(Machine).filter(
    Machine.label.like(MCHN_PREFIX + '%')).first()
    assert mchn, 'no machine found in %s' % func_name()

    #logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)


    try:
        sess.delete(mchn)
        sess.commit()
    except Exception, e:
        sess.close()
        raise e
コード例 #31
0
def setup():
    dmn = DnsDomain.get_unique(sess, DNS_DOMAIN_NAME, compel=True)
    assert isinstance(dmn, DnsDomain), 'No ms.com domain in %s' % func_name()

    intrnl = DnsEnvironment.get_unique(sess, DNS_ENV, compel=True)
    assert isinstance(dmn, DnsDomain), 'No internal env in %s' % func_name()
コード例 #32
0
ファイル: test_utils.py プロジェクト: jrha/aquilon
def test_func_name():
    eq_(utils.func_name(), 'test_utils.test_func_name()')

    print '\ntests.aqdb.utils.func_name returns %s' % utils.func_name()
コード例 #33
0
#FIXME: import server.depends from utils.load_server_classpath()
import ms.version
ms.version.addpkg('ipaddr', '2.1.9')
from ipaddr import IPv4Address as IPAddr

from nose.tools import eq_

NUM_MACHINES = 2
DNAME = 'ms.com'
DNSENV = 'internal'
SHORT_NAME_PREFIX = 'aqdb-test-host-'
MACHINE_NAME_PREFIX = 'test_machine_'

sess = DbFactory().Session()
assert sess, 'No session in %s' % func_name()

#TODO: factor out assert_type(obj, cls, func_name) the isinstance calls
STATUS = Status.get_unique(sess, 'ready')
assert isinstance(STATUS, Status), 'No ready status @ %s' % func_name()

DOMAIN = Domain.get_unique(sess, 'ny-prod')
assert isinstance(DOMAIN, Domain), 'no ny-prod domain @ %s' % func_name()

ARCH = Archetype.get_unique(sess, 'aquilon')
assert isinstance(ARCH, Archetype), 'No archetype @ %s' % func_name()

OS = OperatingSystem.get_unique(sess,
                                name='linux',
                                version='5.0.1-x86_64',
                                archetype=ARCH)
コード例 #34
0
ファイル: test_service.py プロジェクト: ned21/aquilon
def test_add_service():
    svc = sess.query(Service).filter_by(name=SVC_NAME).first()
    if not svc:
        svc = add_service(sess, SVC_NAME)
        assert svc, 'service not created by %s' % func_name()
        print svc
コード例 #35
0
ファイル: test_service.py プロジェクト: stdweird/aquilon
def test_add_service():
    svc = sess.query(Service).filter_by(name=SVC_NAME).first()
    if not svc:
        svc = add_service(sess, SVC_NAME)
        assert svc, "service not created by %s" % func_name()
        print svc
コード例 #36
0
ファイル: test_primary_name.py プロジェクト: jrha/aquilon
def setup():
    dmn = DnsDomain.get_unique(sess, DNS_DOMAIN_NAME, compel=True)
    assert isinstance(dmn, DnsDomain), 'No ms.com domain in %s' % func_name()

    intrnl = DnsEnvironment.get_unique(sess, DNS_ENV, compel=True)
    assert isinstance(dmn, DnsDomain), 'No internal env in %s' % func_name()
コード例 #37
0
ファイル: test_host.py プロジェクト: jrha/aquilon
#FIXME: import server.depends from utils.load_server_classpath()
import ms.version
ms.version.addpkg('ipaddr', '2.1.9')
from ipaddr import IPv4Address as IPAddr

from nose.tools import eq_

NUM_MACHINES = 2
DNAME = 'ms.com'
DNSENV = 'internal'
SHORT_NAME_PREFIX = 'aqdb-test-host-'
MACHINE_NAME_PREFIX = 'test_machine_'

sess = DbFactory().Session()
assert sess, 'No session in %s' % func_name()

#TODO: factor out assert_type(obj, cls, func_name) the isinstance calls
STATUS = Status.get_unique(sess, 'ready')
assert isinstance(STATUS, Status), 'No ready status @ %s' % func_name()

DOMAIN = Domain.get_unique(sess, 'ny-prod')
assert isinstance(DOMAIN, Domain), 'no ny-prod domain @ %s' % func_name()

ARCH = Archetype.get_unique(sess, 'aquilon')
assert isinstance(ARCH, Archetype), 'No archetype @ %s' % func_name()

OS = OperatingSystem.get_unique(sess, name='linux', version='5.0.1-x86_64',
                                archetype=ARCH)
assert isinstance(OS, OperatingSystem), 'No os @ %s' % func_name()