cli: add repo.py object

A user can list repos using "ogcli list repos":

$ ogcli list repos
{
    "repositories": [
        {
            "id": 1,
            "ip": "10.141.10.1",
            "name": "Repositorio (Default)"
        },
        {
            "id": 3,
            "ip": "127.0.0.1",
            "name": "dummy"
        },
        {
            "id": 4,
            "ip": "192.168.21.21",
            "name": "helloworld"
        }
    ]
}

The repository of a client or group of clients in a room is configured
using "ogcli set repo --id <id> [--client-ip <ip address>, --room-id
<room id>]:

$ ogcli set repo --id 4 --room-id 1
master
Jose M. Guisado 2023-10-11 17:29:49 +02:00
parent 68a9d6fe8f
commit 4e89fe44d0
2 changed files with 62 additions and 2 deletions

View File

@ -13,6 +13,7 @@ from cli.objects.images import OgImage
from cli.objects.disks import OgDisk from cli.objects.disks import OgDisk
from cli.objects.poweroff import OgPoweroff from cli.objects.poweroff import OgPoweroff
from cli.objects.reboot import OgReboot from cli.objects.reboot import OgReboot
from cli.objects.repo import OgRepo
from cli.objects.server import OgServer from cli.objects.server import OgServer
import argparse import argparse
import requests import requests
@ -70,7 +71,7 @@ class OgCLI():
def list(self, args): def list(self, args):
choices = ['clients', 'scopes', 'modes', 'hardware', choices = ['clients', 'scopes', 'modes', 'hardware',
'client', 'images', 'disks', 'server', 'client', 'images', 'disks', 'server',
'servers'] 'servers', 'repos']
parser = argparse.ArgumentParser(prog='ogcli list') parser = argparse.ArgumentParser(prog='ogcli list')
parser.add_argument('item', choices=choices) parser.add_argument('item', choices=choices)
@ -94,11 +95,13 @@ class OgCLI():
OgImage.list_images(self.rest) OgImage.list_images(self.rest)
elif parsed_args.item == 'disks': elif parsed_args.item == 'disks':
OgDisk.list_disks(self.rest, args[1:]) OgDisk.list_disks(self.rest, args[1:])
elif parsed_args.item == 'repos':
OgRepo.list_repos(self.rest)
elif parsed_args.item in ['server', 'servers']: elif parsed_args.item in ['server', 'servers']:
OgServer.list_servers(self.rest) OgServer.list_servers(self.rest)
def set(self, args): def set(self, args):
choices = ['modes', 'mode', 'server'] choices = ['modes', 'mode', 'server', 'repo']
parser = argparse.ArgumentParser(prog='ogcli set') parser = argparse.ArgumentParser(prog='ogcli set')
parser.add_argument('item', choices=choices) parser.add_argument('item', choices=choices)
@ -110,6 +113,8 @@ class OgCLI():
parsed_args = parser.parse_args([args[0]]) parsed_args = parser.parse_args([args[0]])
if parsed_args.item in ['modes', 'mode']: if parsed_args.item in ['modes', 'mode']:
OgModes.set_modes(self.rest, args[1:]) OgModes.set_modes(self.rest, args[1:])
elif parsed_args.item == 'repo':
OgRepo.set_repo(self.rest, args[1:])
elif parsed_args.item == 'server': elif parsed_args.item == 'server':
OgServer.set_server(self.rest, args[1:]) OgServer.set_server(self.rest, args[1:])

55
cli/objects/repo.py Normal file
View File

@ -0,0 +1,55 @@
# Copyright (C) 2023 Soleta Networks <info@soleta.eu>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
import argparse
from cli.utils import *
class OgRepo():
@staticmethod
def list_repos(rest):
r = rest.get('/repositories')
print_json(r.text)
@staticmethod
def set_repo(rest, args):
parser = argparse.ArgumentParser(prog='ogcli set repo')
parser.add_argument('--id',
nargs='?',
required=True,
help='repo id (list repos using "ogcli list repos")')
group = parser.add_argument_group('clients', 'Target client arguments')
group.add_argument('--room-id',
type=int,
action='append',
default=[],
required=False,
help='Clients from a given room id')
group.add_argument('--client-ip',
action='append',
default=[],
required=False,
help='Any valid client ip address')
parsed_args = parser.parse_args(args)
r = rest.get('/scopes')
scopes = r.json()
ips = set()
for room in parsed_args.room_id:
room_scope = scope_lookup(room, 'room', scopes)
ips.update(ips_in_scope(room_scope))
for l in parsed_args.client_ip:
ips.add(l)
if not ips:
print('No valid clients specified.')
return
parsed_args = parser.parse_args(args)
payload = {'id': parsed_args.id, 'clients': list(ips)}
rest.post('/client/repo', payload=payload)