def test_container_release_cores(test_db): a = App.get_or_create('app', 'http://git.hunantv.com/group/app.git') v = a.add_version(random_sha1()) p = Pod.create('pod', 'pod', 10, -1) host = Host.create(p, random_ipv4(), random_string(), random_uuid(), 200, 0) for core in host.cores: assert core.host_id == host.id assert core.remain == 10 containers = [] cores = sorted(host.cores, key=operator.attrgetter('label')) for fcores, pcores in zip(chunked(cores[:100], 10), chunked(cores[100:], 10)): used_cores = {'full': fcores, 'part': pcores} host.occupy_cores(used_cores, 5) c = Container.create(random_sha1(), host, v, random_string(), 'entrypoint', used_cores, 'env', nshare=5) containers.append(c) cores = sorted(host.cores, key=operator.attrgetter('label')) for fcores, pcores in zip(chunked(cores[:100], 10), chunked(cores[100:], 10)): for core in fcores: assert core.remain == 0 for core in pcores: assert core.remain == 5 for c in containers: c.delete() cores = sorted(host.cores, key=operator.attrgetter('label')) for fcores, pcores in zip(chunked(cores[:100], 10), chunked(cores[100:], 10)): for core in fcores: assert core.remain == 10 for core in pcores: assert core.remain == 10
def test_container_transform(test_db): a = App.get_or_create('app', 'http://git.hunantv.com/group/app.git', '') assert a is not None v = a.add_version(random_sha1()) v2 = a.add_version(random_sha1()) assert v is not None assert v.app.id == a.id assert v.name == a.name assert len(v.containers.all()) == 0 assert len(v.tasks.all()) == 0 g = Group.create('group', 'group') p = Pod.create('pod', 'pod') assert p.assigned_to_group(g) hosts = [Host.create(p, random_ipv4(), random_string(prefix='host'), random_uuid(), 4, 4096) for i in range(6)] for host in hosts[:3]: host.assigned_to_group(g) assert g.get_max_containers(p, 3, 0) == 3 host_cores = g.get_free_cores(p, 3, 3, 0) assert len(host_cores) == 3 containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores) / count for i in range(count): cid = random_sha1() used_cores = {'full': cores['full'][i*cores_per_container:(i+1)*cores_per_container]} c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env') assert c is not None containers.append(c) host.occupy_cores(cores, 0) for host in g.private_hosts.all(): assert len(host.get_free_cores()[0]) == 1 assert len(host.containers.all()) == 1 assert host.count == 1 assert len(containers) == 3 assert len(v.containers.all()) == 3 cids = [c.container_id for c in containers] for c in containers: host = c.host cid = c.container_id c.transform(v2, random_sha1(), random_string()) assert c.container_id != cid new_cids = [c.container_id for c in containers] assert new_cids != cids
def test_create_app(client, test_db, monkeypatch): monkeypatch.setattr('eru.models.appconfig.config_backend', FakeEtcd()) appyaml = ''' appname: "test_app" entrypoints: web: cmd: "python app.py --port 5000" ports: - 5000/tcp daemon: cmd: "python daemon.py --interval 5" service: cmd: "go run service.go" build: "pip install -r ./req.txt" ''' data = { 'version': random_sha1(), 'git': 'http://git.huanntv.com/test_app.git', 'token': random_string(random_size=10), 'appyaml': yaml.load(appyaml), } rv = client.post('/api/app/register/', data=json.dumps(data), content_type='application/json') r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'r'] == 0 assert r[u'msg'] == u'ok' rv = client.get('/api/app/test_app/') r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'name'] == u'test_app' assert r[u'git'] == data['git'] assert r[u'token'] == data['token'] assert r[u'group_id'] is None rv = client.get('/api/app/random_app_name/') r = json.loads(rv.data) assert rv.status_code == 404 assert r[u'error'] == 'App random_app_name not found' rv = client.get('/api/app/{0}/{1}/'.format('test_app', data['version'])) r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'name'] == u'test_app' assert r[u'sha'] == data['version'] assert r[u'appconfig']['appname'] == u'test_app' assert len(r[u'appconfig']['entrypoints']) == 3 assert r[u'appconfig']['entrypoints']['web']['cmd'] == u'python app.py --port 5000' assert r[u'appconfig']['entrypoints']['web']['ports'] == ['5000/tcp'] assert r[u'appconfig']['entrypoints']['daemon']['cmd'] == u'python daemon.py --interval 5' assert r[u'appconfig']['entrypoints']['service']['cmd'] == u'go run service.go' assert r[u'appconfig']['build'] == u'pip install -r ./req.txt' # 短 version 试试 rv = client.get('/api/app/{0}/{1}/'.format('test_app', data['version'][:7])) r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'name'] == u'test_app' assert r[u'sha'] == data['version']
def test_app_env(client, test_db, monkeypatch): monkeypatch.setattr('eru.models.appconfig.config_backend', FakeEtcd()) appyaml = ''' appname: "test_app" entrypoints: web: cmd: "python app.py --port 5000" ports: - 5000/tcp daemon: cmd: "python daemon.py --interval 5" service: cmd: "go run service.go" build: "pip install -r ./req.txt" ''' data = { 'version': random_sha1(), 'git': 'http://git.huanntv.com/test_app.git', 'token': random_string(random_size=10), 'appyaml': yaml.load(appyaml), } client.post('/api/app/register/', data=json.dumps(data), content_type='application/json') rv = client.get('/api/app/test_app/') assert rv.status_code == 200 url = '/api/app/{0}/env/'.format('test_app') envdata = { 'env': 'prod', 'TEST_APP_REDIS': 'test_app_redis', 'TEST_APP_MYSQL': 'test_app_mysqldsn', } rv = client.put(url, data=json.dumps(envdata), content_type='application/json') r = json.loads(rv.data) assert rv.status_code == 200 rv = client.get(url+'?env=prod') r = json.loads(rv.data) assert rv.status_code == 200 assert r['TEST_APP_REDIS'] == 'test_app_redis' assert r['TEST_APP_MYSQL'] == 'test_app_mysqldsn' # 没有 env 应该挂 envdata.pop('env') rv = client.put(url, data=json.dumps(envdata), content_type='application/json') r = json.loads(rv.data) assert rv.status_code == 400 assert r[u'error'].startswith('env must be') rv = client.get(url) r = json.loads(rv.data) assert rv.status_code == 400 assert r[u'error'].startswith('env must be in querystring') # 错误的 env 返回空的 rv = client.get(url+'?env=xxx') r = json.loads(rv.data) assert rv.status_code == 200
def create_test_suite(): appyaml = { 'appname': 'app', 'entrypoints': { 'web': { 'cmd': 'python app.py', 'ports': ['5000/tcp'], }, 'daemon': { 'cmd': 'python daemon.py', }, 'service': { 'cmd': 'python service.py' }, }, 'build': 'pip install -r ./requirements.txt', } app = App.get_or_create('app', 'http://git.hunantv.com/group/app.git') version = app.add_version(random_sha1()) appconfig = version.appconfig appconfig.update(**appyaml) appconfig.save() pod = Pod.create('pod', 'pod') hosts = [ Host.create(pod, random_ipv4(), random_string(prefix='host'), random_uuid(), 4, 4096) for i in range(4) ] containers = [] for (host, count), cores in centralized_schedule(pod, 4, 4, 0).iteritems(): cores_per_container = len(cores) / count for i in range(count): cid = random_sha1() used_cores = { 'full': cores['full'][i * cores_per_container:(i + 1) * cores_per_container] } c = Container.create(cid, host, version, random_string(), 'web', used_cores, 'env') containers.append(c) host.occupy_cores(cores, 0) return app, version, pod, hosts, containers
def create_test_suite(): appyaml = { 'appname': 'app', 'entrypoints': { 'web': { 'cmd': 'python app.py', 'ports': ['5000/tcp'], }, 'daemon': { 'cmd': 'python daemon.py', }, 'service': { 'cmd': 'python service.py' }, }, 'build': 'pip install -r ./requirements.txt', } app = App.get_or_create('app', 'http://git.hunantv.com/group/app.git', 'token') version = app.add_version(random_sha1()) appconfig = version.appconfig appconfig.update(**appyaml) appconfig.save() group = Group.create('group', 'group') pod = Pod.create('pod', 'pod') pod.assigned_to_group(group) hosts = [Host.create(pod, random_ipv4(), random_string(prefix='host'), random_uuid(), 4, 4096) for i in range(4)] for host in hosts: host.assigned_to_group(group) containers = [] for (host, count), cores in group.get_free_cores(pod, 4, 4, 0).iteritems(): cores_per_container = len(cores) / count for i in range(count): cid = random_sha1() used_cores = cores['full'][i*cores_per_container:(i+1)*cores_per_container] c = Container.create(cid, host, version, random_string(), 'entrypoint', used_cores, 'env') containers.append(c) host.occupy_cores(cores, 0) return app, version, group, pod, hosts, containers
def test_container(test_db): a = App.get_or_create('app', 'http://git.hunantv.com/group/app.git', '') assert a is not None assert a.id == a.user_id v = a.add_version(random_sha1()) assert v is not None assert v.app.id == a.id assert v.name == a.name assert len(v.containers.all()) == 0 assert len(v.tasks.all()) == 0 g = Group.create('group', 'group') p = Pod.create('pod', 'pod', 10, -1) assert p.assigned_to_group(g) hosts = [Host.create(p, random_ipv4(), random_string(prefix='host'), random_uuid(), 4, 4096) for i in range(6)] for host in hosts[:3]: host.assigned_to_group(g) host_ids1 = {h.id for h in hosts[:3]} host_ids2 = {h.id for h in hosts[3:]} host_cores = g.get_free_cores(p, 3, 3, 0) #测试没有碎片核的情况 #获取核 containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores['full']) / count for i in range(count): cid = random_sha1() used_cores = {'full': cores['full'][i*cores_per_container:(i+1)*cores_per_container]} # not using a port c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env') assert c is not None containers.append(c) host.occupy_cores(cores, 0) for host in g.private_hosts.all(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 1 assert len(part_cores) == 0 assert len(host.containers.all()) == 1 assert host.count == 1 assert len(containers) == 3 assert len(v.containers.all()) == 3 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.full_cores.all()) == 3 assert len(c.part_cores.all()) == 0 all_core_labels = sorted(['0', '1', '2', '3', ]) used_full_core_labels = [core.label for core in c.full_cores.all()] used_part_core_labels = [core.label for core in c.part_cores.all()] free_core_labels = [core.label for core in c.host.get_free_cores()[0]] assert all_core_labels == sorted(used_full_core_labels + used_part_core_labels + free_core_labels) #释放核 for c in containers: c.delete() assert len(v.containers.all()) == 0 assert g.get_max_containers(p, 3, 0) == 3 host_cores = g.get_free_cores(p, 3, 3, 0) assert len(host_cores) == 3 for host in g.private_hosts.all(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 4 assert len(part_cores) == 0 assert len(host.containers.all()) == 0 assert host.count == 0 #测试有碎片的情况 #获取核 host_cores = g.get_free_cores(p, 3, 3, 4) containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores['full']) / count for i in range(count): cid = random_sha1() used_cores = {'full': cores['full'][i*cores_per_container:(i+1)*cores_per_container], 'part': cores['part']} # not using a port c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env') assert c is not None containers.append(c) host.occupy_cores(cores, 4) for host in g.private_hosts.all(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 0 assert len(part_cores) == 1 assert part_cores[0].used == 4 assert len(host.containers.all()) == 1 assert host.count == 1 assert len(containers) == 3 assert len(v.containers.all()) == 3 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.full_cores.all()) == 3 assert len(c.part_cores.all()) == 1 all_core_labels = sorted(['0', '1', '2', '3', ]) used_full_core_labels = [core.label for core in c.full_cores.all()] used_part_core_labels = [core.label for core in c.part_cores.all()] free_core_labels = [core.label for core in c.host.get_free_cores()[0]] assert all_core_labels == sorted(used_full_core_labels + used_part_core_labels + free_core_labels) #释放核 for c in containers: c.delete(4) assert len(v.containers.all()) == 0 assert g.get_max_containers(p, 3, 0) == 3 host_cores = g.get_free_cores(p, 3, 3, 0) assert len(host_cores) == 3 for host in g.private_hosts.all(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 4 assert len(host.containers.all()) == 0 assert host.count == 0 #获取 host_cores = g.get_free_cores(p, 6, 1, 5) containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores['full']) / count for i in range(count): cid = random_sha1() used_cores = {'full': cores['full'][i*cores_per_container:(i+1)*cores_per_container], 'part': cores['part'][i:i+1]} # not using a port c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env') assert c is not None containers.append(c) host.occupy_cores(used_cores, 5) for host in g.private_hosts.all(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 1 assert len(part_cores) == 0 assert len(host.containers.all()) == 2 assert host.count == 2 assert len(containers) == 6 assert len(v.containers.all()) == 6 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.full_cores.all()) == 1 assert len(c.part_cores.all()) == 1 ##释放核 for c in containers: c.delete(5) assert len(v.containers.all()) == 0 assert g.get_max_containers(p, 3, 0) == 3 host_cores = g.get_free_cores(p, 3, 3, 0) assert len(host_cores) == 3 for host in g.private_hosts.all(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 4 assert len(part_cores) == 0 assert len(host.containers.all()) == 0 assert host.count == 0
#!/usr/bin/env python # encoding: utf-8 from eru.app import create_app_with_celery from eru.models import db, Group, Pod, Host, App from tests.utils import random_ipv4, random_string, random_uuid, random_sha1 host_number = int(raw_input("how many hosts: ")) app, _ = create_app_with_celery app.config['TESTING'] = True app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost:3306/erutest' with app.app_context(): db.create_all() a = App.get_or_create('app', 'http://git.hunantv.com/group/app.git', '') v = a.add_version(random_sha1()) g = Group.create('group', 'group') p = Pod.create('pod', 'pod', 10, -1) p.assigned_to_group(g) hosts = [Host.create(p, random_ipv4(), random_string(), random_uuid(), 24, 4096) for i in range(host_number)] for host in hosts: host.assigned_to_group(g)
def create_container(self, *a, **kw): return {'Id': random_sha1()}
def test_container(test_db): a = App.get_or_create('app', 'http://git.hunantv.com/group/app.git') assert a is not None assert a.id == a.user_id v = a.add_version(random_sha1()) assert v is not None assert v.app.id == a.id assert v.name == a.name assert len(v.containers.all()) == 0 assert len(v.tasks.all()) == 0 p = Pod.create('pod', 'pod', 10, -1) hosts = [ Host.create(p, random_ipv4(), random_string(prefix='host'), random_uuid(), 4, 4096) for i in range(6) ] for host in hosts[3:]: host.set_public() host_ids1 = {h.id for h in hosts[:3]} host_ids2 = {h.id for h in hosts[3:]} host_cores = centralized_schedule(p, 3, 3, 0) #测试没有碎片核的情况 #获取核 containers = [] for (host, count), cores in host_cores.iteritems(): host.occupy_cores(cores, 0) cores_per_container = len(cores['full']) / count for i in range(count): cid = random_sha1() used_cores = { 'full': cores['full'][i * cores_per_container:(i + 1) * cores_per_container] } c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env', nshare=0) assert c is not None containers.append(c) for host in p.get_private_hosts(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 1 assert len(part_cores) == 0 assert len(host.containers.all()) == 1 assert host.count == 1 assert len(containers) == 3 assert len(v.containers.all()) == 3 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.full_cores) == 3 assert len(c.part_cores) == 0 all_core_labels = sorted([ '0', '1', '2', '3', ]) used_full_core_labels = [core.label for core in c.full_cores] used_part_core_labels = [core.label for core in c.part_cores] free_core_labels = [core.label for core in c.host.get_free_cores()[0]] assert all_core_labels == sorted(used_full_core_labels + used_part_core_labels + free_core_labels) #释放核 for c in containers: c.delete() assert len(v.containers.all()) == 0 assert get_max_container_count(p, 3, 0) == 3 host_cores = centralized_schedule(p, 3, 3, 0) assert len(host_cores) == 3 for host in p.get_private_hosts(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 4 assert len(part_cores) == 0 assert len(host.containers.all()) == 0 assert host.count == 4 #测试有碎片的情况 #获取核 host_cores = centralized_schedule(p, 3, 3, 4) containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores['full']) / count host.occupy_cores(cores, 4) for i in range(count): cid = random_sha1() used_cores = { 'full': cores['full'][i * cores_per_container:(i + 1) * cores_per_container], 'part': cores['part'] } # not using a port c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env', nshare=4) assert c is not None containers.append(c) for host in p.get_private_hosts(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 0 assert len(part_cores) == 1 assert part_cores[0].remain == 6 assert len(host.containers.all()) == 1 assert host.count == D('0.6') assert len(containers) == 3 assert len(v.containers.all()) == 3 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.full_cores) == 3 assert len(c.part_cores) == 1 all_core_labels = sorted([ '0', '1', '2', '3', ]) used_full_core_labels = [core.label for core in c.full_cores] used_part_core_labels = [core.label for core in c.part_cores] free_core_labels = [core.label for core in c.host.get_free_cores()[0]] assert all_core_labels == sorted(used_full_core_labels + used_part_core_labels + free_core_labels) #释放核 for c in containers: c.delete() assert len(v.containers.all()) == 0 assert get_max_container_count(p, 3, 0) == 3 host_cores = centralized_schedule(p, 3, 3, 0) assert len(host_cores) == 3 for host in p.get_private_hosts(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 4 assert len(host.containers.all()) == 0 assert host.count == 4 #获取 host_cores = centralized_schedule(p, 6, 1, 5) containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores['full']) / count for i in range(count): cid = random_sha1() used_cores = { 'full': cores['full'][i * cores_per_container:(i + 1) * cores_per_container], 'part': cores['part'][i:i + 1], } host.occupy_cores(used_cores, 5) # not using a port c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env', nshare=5) assert c is not None containers.append(c) for host in p.get_private_hosts(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 1 assert len(part_cores) == 0 assert len(host.containers.all()) == 2 assert host.count == D('1') assert len(containers) == 6 assert len(v.containers.all()) == 6 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.full_cores) == 1 assert len(c.part_cores) == 1 ##释放核 for c in containers: c.delete() assert len(v.containers.all()) == 0 assert get_max_container_count(p, 3, 0) == 3 host_cores = centralized_schedule(p, 3, 3, 0) assert len(host_cores) == 3 for host in p.get_private_hosts(): full_cores, part_cores = host.get_free_cores() assert len(full_cores) == 4 assert len(part_cores) == 0 assert len(host.containers.all()) == 0 assert host.count == 4
def test_create_app(client, test_db, monkeypatch): monkeypatch.setattr('eru.models.appconfig.config_backend', FakeEtcd()) appyaml = ''' appname: "test_app" entrypoints: web: cmd: "python app.py --port 5000" ports: - 5000/tcp daemon: cmd: "python daemon.py --interval 5" service: cmd: "go run service.go" build: "pip install -r ./req.txt" ''' data = { 'version': random_sha1(), 'git': 'http://git.huanntv.com/test_app.git', 'token': random_string(random_size=10), 'appyaml': yaml.load(appyaml), } rv = client.post('/api/app/register/', data=json.dumps(data), content_type='application/json') r = json.loads(rv.data) assert rv.status_code == 201 rv = client.get('/api/app/test_app/') r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'name'] == u'test_app' assert r[u'git'] == data['git'] rv = client.get('/api/app/random_app_name/') r = json.loads(rv.data) assert rv.status_code == 404 assert r[u'error'] == 'App random_app_name not found' rv = client.get('/api/app/{0}/{1}/'.format('test_app', data['version'])) r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'name'] == u'test_app' assert r[u'sha'] == data['version'] assert r[u'appconfig']['appname'] == u'test_app' assert len(r[u'appconfig']['entrypoints']) == 3 assert r[u'appconfig']['entrypoints']['web'][ 'cmd'] == u'python app.py --port 5000' assert r[u'appconfig']['entrypoints']['web']['ports'] == ['5000/tcp'] assert r[u'appconfig']['entrypoints']['daemon'][ 'cmd'] == u'python daemon.py --interval 5' assert r[u'appconfig']['entrypoints']['service'][ 'cmd'] == u'go run service.go' assert r[u'appconfig']['build'] == u'pip install -r ./req.txt' # 短 version 试试 rv = client.get('/api/app/{0}/{1}/'.format('test_app', data['version'][:7])) r = json.loads(rv.data) assert rv.status_code == 200 assert r[u'name'] == u'test_app' assert r[u'sha'] == data['version']
def test_app_env(client, test_db, monkeypatch): monkeypatch.setattr('eru.models.appconfig.config_backend', FakeEtcd()) appyaml = ''' appname: "test_app" entrypoints: web: cmd: "python app.py --port 5000" ports: - 5000/tcp daemon: cmd: "python daemon.py --interval 5" service: cmd: "go run service.go" build: "pip install -r ./req.txt" ''' data = { 'version': random_sha1(), 'git': 'http://git.huanntv.com/test_app.git', 'token': random_string(random_size=10), 'appyaml': yaml.load(appyaml), } client.post('/api/app/register/', data=json.dumps(data), content_type='application/json') rv = client.get('/api/app/test_app/') assert rv.status_code == 200 url = '/api/app/{0}/env/'.format('test_app') envdata = { 'env': 'prod', 'TEST_APP_REDIS': 'test_app_redis', 'TEST_APP_MYSQL': 'test_app_mysqldsn', } rv = client.put(url, data=json.dumps(envdata), content_type='application/json') r = json.loads(rv.data) assert rv.status_code == 200 rv = client.get(url + '?env=prod') r = json.loads(rv.data) assert rv.status_code == 200 assert r['TEST_APP_REDIS'] == 'test_app_redis' assert r['TEST_APP_MYSQL'] == 'test_app_mysqldsn' # 没有 env 应该挂 envdata.pop('env') rv = client.put(url, data=json.dumps(envdata), content_type='application/json') r = json.loads(rv.data) assert rv.status_code == 400 assert r[u'error'].startswith('env must be') rv = client.get(url) r = json.loads(rv.data) assert rv.status_code == 400 assert r[u'error'].startswith('env must be in querystring') # 错误的 env 返回空的 rv = client.get(url + '?env=xxx') r = json.loads(rv.data) assert rv.status_code == 200
def test_container(test_db): a = App.get_or_create('app', 'http://git.hunantv.com/group/app.git', '') assert a is not None v = a.add_version(random_sha1()) assert v is not None assert v.app.id == a.id assert v.name == a.name assert len(v.containers.all()) == 0 assert len(v.tasks.all()) == 0 g = Group.create('group', 'group') p = Pod.create('pod', 'pod') assert p.assigned_to_group(g) hosts = [Host.create(p, random_ipv4(), random_string(prefix='host'), random_uuid(), 4, 4096) for i in range(6)] for host in hosts[:3]: host.assigned_to_group(g) host_ids1 = {h.id for h in hosts[:3]} host_ids2 = {h.id for h in hosts[3:]} assert g.get_max_containers(p, 3) == 3 host_cores = g.get_free_cores(p, 3, 3) assert len(host_cores) == 3 containers = [] for (host, count), cores in host_cores.iteritems(): cores_per_container = len(cores) / count for i in range(count): cid = random_sha1() used_cores = cores[i*cores_per_container:(i+1)*cores_per_container] # not using a port c = Container.create(cid, host, v, random_string(), 'entrypoint', used_cores, 'env') assert c is not None containers.append(c) host.occupy_cores(cores) for host in g.private_hosts.all(): assert len(host.get_free_cores()) == 1 assert len(host.containers.all()) == 1 assert host.count == 1 assert len(containers) == 3 assert len(v.containers.all()) == 3 for c in containers: assert c.host_id in host_ids1 assert c.host_id not in host_ids2 assert c.app.id == a.id assert c.version.id == v.id assert c.is_alive assert len(c.cores.all()) == 3 all_core_labels = sorted(['0', '1', '2', '3', ]) used_core_labels = [core.label for core in c.cores.all()] free_core_labels = [core.label for core in c.host.get_free_cores()] assert all_core_labels == sorted(used_core_labels + free_core_labels) for c in containers: c.delete() assert len(v.containers.all()) == 0 assert g.get_max_containers(p, 3) == 3 host_cores = g.get_free_cores(p, 3, 3) assert len(host_cores) == 3 for host in g.private_hosts.all(): assert len(host.get_free_cores()) == 4 assert len(host.containers.all()) == 0 assert host.count == 0