Beispiel #1
0
Datei: api.py Projekt: doanac/cya
def host_container_update(name, c):
    c = hosts.get(name).containers.get(c)
    if c.one_shot and request.json.get('state') == 'DESTROY':
        c.delete()
    else:
        c.update(request.json)
    return jsonify({})
Beispiel #2
0
Datei: api.py Projekt: doanac/cya
def host_container_update(name, c):
    c = hosts.get(name).containers.get(c)
    if c.one_shot and request.json.get("state") == "DESTROY":
        c.delete()
    else:
        c.update(request.json)
    return jsonify({})
Beispiel #3
0
 def test_secret_create(self):
     data = h1.copy()
     data['api_key'] = '123'
     hosts.create('host_1', data)
     h = hosts.get('host_1')
     self.assertNotEqual('123', h.api_key)
     self.assertTrue(SecretField.verify('123', h.api_key))
Beispiel #4
0
    def test_update_host(self):
        resp = self.post_json('/api/v1/host/', h1)
        self.assertEqual('http://localhost/api/v1/host/host_1/', resp.location)

        self.patch_json(resp.location, {'cpu_total': 123}, h1['api_key'])
        h = hosts.get('host_1')
        self.assertEqual(123, h.cpu_total)
Beispiel #5
0
    def setUp(self):
        self.modelsdir = tempfile.mkdtemp()
        self.addCleanup(shutil.rmtree, self.modelsdir)
        hosts._model_dir = os.path.join(self.modelsdir, 'hosts')
        container_requests._model_dir = os.path.join(self.modelsdir, 'reqs')
        os.mkdir(hosts._model_dir)
        os.mkdir(container_requests._model_dir)

        hosts.create('host1', h1)
        hosts.create('host2', h1)
        self.host1 = hosts.get('host1')
        self.host2 = hosts.get('host2')

        self.container_data = {
            'template': 'ubuntu',
            'release': 'xenial',
        }
Beispiel #6
0
    def test_container_create(self):
        h = h1.copy()
        h['containers'] = [{'name': 'c1', 'template': 'foo'}]

        hosts.create('host_1', h)
        h = hosts.get('host_1')
        self.assertEqual(1, h.containers.count())
        self.assertEqual('foo', h.containers.get('c1').template)
        self.assertEqual('c1', h.to_dict()['containers'][0]['name'])
Beispiel #7
0
 def test_enlisted(self):
     """The scheduler ignores hosts not enlisted"""
     self.host1.ping()
     self.host1.update({'enlisted': False})
     self.host1 = hosts.get(self.host1.name)
     container_requests.create('container_foo', self.container_data)
     container_requests.handle(self.host1)
     self.assertEqual(1, container_requests.count())
     self.assertEqual(0, self.host1.containers.count())
Beispiel #8
0
def host_container_log(host, container, logname):
    if g.user is None or 'openid' not in session:
        flash('You must be logged in to view container logs')
        return redirect(url_for('login'))
    try:
        log = hosts.get(host).containers.get(container).get_log(logname)
        return Response(log, 200, mimetype='text/plain')
    except FileNotFoundError:
        return ('This container has no %s log' % logname, 404)
Beispiel #9
0
Datei: ui.py Projekt: doanac/cya
def host_container_log(host, container, logname):
    if g.user is None or 'openid' not in session:
        flash('You must be logged in to view container logs')
        return redirect(url_for('login'))
    try:
        log = hosts.get(host).containers.get(container).get_log(logname)
        return Response(log, 200, mimetype='text/plain')
    except FileNotFoundError:
        return ('This container has no %s log' % logname, 404)
Beispiel #10
0
Datei: ui.py Projekt: doanac/cya
def remove_container():
    if g.user is None or 'openid' not in session:
        return redirect(url_for('login'))
    if not g.user.admin:
        flash('you must be an admin to create a container')
        return redirect(url_for('login'))

    host = hosts.get(request.form['host'])
    container = host.containers.get(request.form['name'])
    container.delete()
    flash('Deleted container: %s' % request.form['name'])
    return redirect(request.form['url'])
Beispiel #11
0
Datei: ui.py Projekt: doanac/cya
def recreate_container():
    if g.user is None or 'openid' not in session:
        return redirect(url_for('login'))
    if not g.user.admin:
        flash('you must be an admin to re-create a container')
        return redirect(url_for('login'))

    host = hosts.get(request.form['host'])
    container = host.containers.get(request.form['name'])
    container.update({'re_create': True})
    flash('Container re-created: %s' % request.form['name'])
    return redirect(request.form['url'])
Beispiel #12
0
def recreate_container():
    if g.user is None or 'openid' not in session:
        return redirect(url_for('login'))
    if not g.user.admin:
        flash('you must be an admin to re-create a container')
        return redirect(url_for('login'))

    host = hosts.get(request.form['host'])
    container = host.containers.get(request.form['name'])
    container.update({'re_create': True})
    flash('Container re-created: %s' % request.form['name'])
    return redirect(request.form['url'])
Beispiel #13
0
def remove_container():
    if g.user is None or 'openid' not in session:
        return redirect(url_for('login'))
    if not g.user.admin:
        flash('you must be an admin to create a container')
        return redirect(url_for('login'))

    host = hosts.get(request.form['host'])
    container = host.containers.get(request.form['name'])
    container.delete()
    flash('Deleted container: %s' % request.form['name'])
    return redirect(request.form['url'])
Beispiel #14
0
    def test_mem_total(self):
        """Ensure we honor max_containers"""
        self.host1.ping()
        self.host1.update({'max_containers': 1, 'mem_total': 6})
        self.host2.ping()
        self.host2.update({'max_containers': 1, 'mem_total': 5})
        self.host1 = hosts.get(self.host1.name)

        # create one container, it should go to host1 (more memory)
        container_requests.create('container_foo', self.container_data)
        container_requests.handle(self.host1)
        self.assertEqual(0, container_requests.count())
        self.assertEqual(1, self.host1.containers.count())
Beispiel #15
0
Datei: api.py Projekt: doanac/cya
def host_get(name):
    h = hosts.get(name)
    if _is_host_authenticated(h):
        h.ping()
        container_requests.handle(h)

    data = h.to_dict()
    data['client_version'] = client_version()
    withcontainers = request.args.get('with_containers') is not None
    if not withcontainers and 'containers' in h.data:
        del data['containers']
    if 'api_key' in data:
        del data['api_key']
    return jsonify(data)
Beispiel #16
0
Datei: api.py Projekt: doanac/cya
def host_get(name):
    h = hosts.get(name)
    if _is_host_authenticated(h):
        h.ping()
        container_requests.handle(h)

    data = h.to_dict()
    data["client_version"] = client_version()
    withcontainers = request.args.get("with_containers") is not None
    if not withcontainers and "containers" in h.data:
        del data["containers"]
    if "api_key" in data:
        del data["api_key"]
    return jsonify(data)
Beispiel #17
0
Datei: api.py Projekt: doanac/cya
 def wrapper(*args, **kwargs):
     key = request.headers.get('Authorization', None)
     if not key:
         resp = jsonify({'Message': 'No Authorization header provided'})
         resp.status_code = 401
         return resp
     parts = key.split(' ')
     if len(parts) != 2 or parts[0] != 'Token':
         resp = jsonify({'Message': 'Invalid Authorization header'})
         resp.status_code = 401
         return resp
     host = hosts.get(kwargs['name'])
     if not SecretField.verify(parts[1], host.api_key):
         resp = jsonify({'Message': 'Incorrect API key for host'})
         resp.status_code = 401
         return resp
     return f(*args, **kwargs)
Beispiel #18
0
Datei: ui.py Projekt: doanac/cya
def start_container():
    if g.user is None or 'openid' not in session:
        return redirect(url_for('login'))
    if not g.user.admin:
        flash('you must be an admin to update container state')
        return redirect(url_for('login'))

    host = hosts.get(request.form['host'])
    container = host.containers.get(request.form['name'])
    keep_running = request.form['keep_running'].lower() in (1, 'true')
    if keep_running:
        state = 'STARTING'
    else:
        state = 'STOPPING'
    container.update({'keep_running': keep_running, 'state': state})
    flash('Container requeste queued')
    return redirect(request.form['url'])
Beispiel #19
0
def start_container():
    if g.user is None or 'openid' not in session:
        return redirect(url_for('login'))
    if not g.user.admin:
        flash('you must be an admin to update container state')
        return redirect(url_for('login'))

    host = hosts.get(request.form['host'])
    container = host.containers.get(request.form['name'])
    keep_running = request.form['keep_running'].lower() in (1, 'true')
    if keep_running:
        state = 'STARTING'
    else:
        state = 'STOPPING'
    container.update({'keep_running': keep_running, 'state': state})
    flash('Container requeste queued')
    return redirect(request.form['url'])
Beispiel #20
0
    def test_max_containers(self):
        """Ensure we honor max_containers"""
        self.host1.ping()
        self.host1.update({'max_containers': 1})
        self.host1 = hosts.get(self.host1.name)

        # create one container
        container_requests.create('container_foo', self.container_data)
        container_requests.handle(self.host1)
        self.assertEqual(0, container_requests.count())
        self.assertEqual(1, self.host1.containers.count())

        # create 2nd container, will stay stuck in queued
        container_requests.create('container_foo', self.container_data)
        container_requests.handle(self.host1)
        self.assertEqual(1, container_requests.count())
        self.assertEqual(1, self.host1.containers.count())
Beispiel #21
0
Datei: api.py Projekt: doanac/cya
 def wrapper(*args, **kwargs):
     key = request.headers.get("Authorization", None)
     if not key:
         resp = jsonify({"Message": "No Authorization header provided"})
         resp.status_code = 401
         return resp
     parts = key.split(" ")
     if len(parts) != 2 or parts[0] != "Token":
         resp = jsonify({"Message": "Invalid Authorization header"})
         resp.status_code = 401
         return resp
     host = hosts.get(kwargs["name"])
     if not SecretField.verify(parts[1], host.api_key):
         resp = jsonify({"Message": "Incorrect API key for host"})
         resp.status_code = 401
         return resp
     return f(*args, **kwargs)
Beispiel #22
0
Datei: api.py Projekt: doanac/cya
def host_container_get(name, c):
    c = hosts.get(name).containers.get(c)
    return jsonify(c.to_dict())
Beispiel #23
0
def host_container(host, container):
    h = hosts.get(host)
    c = h.containers.get(container)
    s = [c.initscripts.get(x) for x in c.initscripts.list()]
    return render_template('container.html', host=h, container=c, scripts=s)
Beispiel #24
0
def host(name):
    host = hosts.get(name)
    host.container_list = [
        host.containers.get(x) for x in host.containers.list()
    ]
    return render_template('host.html', host=host)
Beispiel #25
0
Datei: ui.py Projekt: doanac/cya
def index():
    host_list = [hosts.get(x) for x in hosts.list()]
    for h in host_list:
        h.container_list = [h.containers.get(x) for x in h.containers.list()]
    requests = [container_requests.get(x) for x in container_requests.list()]
    return render_template('index.html', hosts=host_list, requests=requests)
Beispiel #26
0
Datei: api.py Projekt: doanac/cya
def host_update(name):
    if 'enlisted' in request.json:
        raise ModelError('"enlisted" field cannot be updated via API', 403)

    hosts.get(name).update(request.json)
    return jsonify({})
Beispiel #27
0
Datei: api.py Projekt: doanac/cya
def host_delete(name):
    hosts.get(name).delete()
    return jsonify({})
Beispiel #28
0
Datei: api.py Projekt: doanac/cya
def host_container_list(name):
    h = hosts.get(name)
    return jsonify({'containers': [x for x in h.containers.list()]})
Beispiel #29
0
Datei: api.py Projekt: doanac/cya
def host_delete(name):
    hosts.get(name).delete()
    return jsonify({})
Beispiel #30
0
Datei: ui.py Projekt: doanac/cya
def host_container(host, container):
    h = hosts.get(host)
    c = h.containers.get(container)
    s = [c.initscripts.get(x) for x in c.initscripts.list()]
    return render_template('container.html', host=h, container=c, scripts=s)
Beispiel #31
0
Datei: api.py Projekt: doanac/cya
def host_container_logs_update(name, c, l):
    c = hosts.get(name).containers.get(c)
    c.append_log(l, request.data.decode())
    resp = jsonify({})
    resp.status_code = 201
    return resp
Beispiel #32
0
Datei: api.py Projekt: doanac/cya
def host_container_logs_update(name, c, l):
    c = hosts.get(name).containers.get(c)
    c.append_log(l, request.data.decode())
    resp = jsonify({})
    resp.status_code = 201
    return resp
Beispiel #33
0
Datei: api.py Projekt: doanac/cya
def host_container_get(name, c):
    c = hosts.get(name).containers.get(c)
    return jsonify(c.to_dict())
Beispiel #34
0
Datei: ui.py Projekt: doanac/cya
def host(name):
    host = hosts.get(name)
    host.container_list = [
        host.containers.get(x) for x in host.containers.list()]
    return render_template('host.html', host=host)
Beispiel #35
0
    def test_empty_update(self):
        hosts.create('host_1', h1)

        self.assertEqual(1, hosts.count())
        self.assertEqual('ubuntu', hosts.get('host_1').distro_id)
Beispiel #36
0
Datei: api.py Projekt: doanac/cya
def host_update(name):
    if "enlisted" in request.json:
        raise ModelError('"enlisted" field cannot be updated via API', 403)

    hosts.get(name).update(request.json)
    return jsonify({})
Beispiel #37
0
def index():
    host_list = [hosts.get(x) for x in hosts.list()]
    for h in host_list:
        h.container_list = [h.containers.get(x) for x in h.containers.list()]
    requests = [container_requests.get(x) for x in container_requests.list()]
    return render_template('index.html', hosts=host_list, requests=requests)
Beispiel #38
0
Datei: api.py Projekt: doanac/cya
def host_container_list(name):
    h = hosts.get(name)
    return jsonify({"containers": [x for x in h.containers.list()]})