diff options
author | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-09-10 13:33:05 +0200 |
---|---|---|
committer | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-09-10 15:11:11 +0200 |
commit | 6b33268b5c03db29cb003acb4e2042c9254402d2 (patch) | |
tree | cb6ceec1c3949177efa592a1466f8d26a9f21667 /ogcp/views.py | |
parent | a1b164b1062eb7ba6b724ebe84d8d7e0b308e234 (diff) |
ogcp: add view to assign repo to clients
Add /action/repo/set in Commands to assign a repository to
multiple clients.
The view includes the actual repo assigned in the client pills
and shows a table with the clients grouped by repo when multiple
repos are assigned among the selected clients.
Diffstat (limited to 'ogcp/views.py')
-rw-r--r-- | ogcp/views.py | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/ogcp/views.py b/ogcp/views.py index 77bad42..c24cb73 100644 --- a/ogcp/views.py +++ b/ogcp/views.py @@ -15,7 +15,7 @@ from ogcp.forms.action_forms import ( GenericForm, SelectClientForm, ImageUpdateForm, ImportClientsForm, ServerForm, DeleteRepositoryForm, RepoForm, FolderForm, CacheForm, ClientMoveForm, RunScriptForm, ImageConfigForm, ImageFetchForm, - ServerConfigurationForm + ServerConfigurationForm, SetRepoForm ) from flask_login import ( current_user, LoginManager, @@ -2416,6 +2416,66 @@ def action_oglive(): selected_clients=selected_clients) +def get_clients_repo_dictionary(ips, server, repositories): + repos = {} + repo_id_to_name = {repo["id"]: repo["name"] for repo in repositories} + + for ip in ips: + r = server.get('/client/info', payload={"client": [ip]}) + if not r: + raise ServerError + if r.status_code != requests.codes.ok: + raise ServerErrorCode + resp = r.json() + repo_name = repo_id_to_name[resp['repo_id']] + if repo_name not in repos: + repos[repo_name] = [ip] + else: + repos[repo_name].append(ip) + return repos + +@app.route('/action/repo/set', methods=['GET', 'POST']) +@login_required +def action_repo_set(): + form = SetRepoForm(request.form) + if request.method == 'POST': + ips = form.ips.data.split(' ') + payload = {'clients': ips, 'id': int(form.repo.data)} + server = get_server_from_clients(ips) + r = server.post('/client/repo', payload) + if not r: + return ogserver_down('commands') + if r.status_code == requests.codes.ok: + flash(_('Repo set ogLive request sent successfully'), + category='info') + else: + flash(_('Ogserver replied with status code not ok'), + category='error') + return redirect(url_for('commands')) + + else: + ips = parse_elements(request.args.to_dict()) + form.ips.data = " ".join(ips) + if not validate_elements(ips): + return redirect(url_for('commands')) + + server = get_server_from_clients(list(ips)) + try: + repositories = get_repositories(server) + repos_set = get_clients_repo_dictionary(ips, server, repositories) + except ServerError: + return ogserver_down('commands') + except ServerErrorCode: + return ogserver_error('commands') + + form.repo.choices = [(repo["id"], repo["name"]) for repo in repositories] + + scopes, clients = get_scopes(set(ips)) + selected_clients = list(get_selected_clients(scopes['scope']).items()) + return render_template('actions/repo_set.html', repos_set=repos_set, form=form, scopes=scopes, + selected_clients=selected_clients) + + @app.route('/action/image/create', methods=['GET', 'POST']) @login_required def action_image_create(): |