source: ogCli-Git/cli/objects/images.py

Last change on this file was 0c1a747, checked in by Jose M. Guisado <jguisado@…>, 23 months ago

create image: add repository_id param for new images

Adds 'repository_id' parameter when creating a *new* image (ie: using
--desc).

Removes unused --repo parameter.

See ogServer commit: 52a38d3e574fb25b47d230bc87754583eb17b4a6
("Use the repository id on image creation")

  • Property mode set to 100644
File size: 6.1 KB
Line 
1# Copyright (C) 2020-2021 Soleta Networks <info@soleta.eu>
2#
3# This program is free software: you can redistribute it and/or modify it under
4# the terms of the GNU Affero General Public License as published by the
5# Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7
8from urllib.parse import urlparse
9from cli.utils import *
10
11import argparse
12
13
14class OgImage():
15
16    @staticmethod
17    def list_images(rest):
18        r = rest.get('/images')
19        print_json(r.text)
20
21    @staticmethod
22    def restore_image(rest, args):
23        parser = argparse.ArgumentParser()
24        parser.add_argument('--disk',
25                            nargs='?',
26                            required=True,
27                            help='Disk')
28        parser.add_argument('--part',
29                            nargs='?',
30                            required=True,
31                            help='Partition')
32        parser.add_argument('--id',
33                            nargs='?',
34                            type=int,
35                            required=True,
36                            help='Image id to be restored')
37        parser.add_argument('--type',
38                            nargs='?',
39                            required=False,
40                            choices=['unicast',
41                                     'unicast-direct', 'tiptorrent'],
42                            default='tiptorrent',
43                            help='Transfer method. (Default: tiptorrent)')
44        parser.add_argument('--repo',
45                            nargs='?',
46                            default=urlparse(rest.URL).netloc.split(':')[0],
47                            help='Images repository ip')
48        group = parser.add_argument_group('clients', 'Client selection args')
49        group.add_argument('--center-id',
50                           type=int,
51                           action='append',
52                           default=[],
53                           required=False,
54                           help='Clients from given center id')
55        group.add_argument('--room-id',
56                           type=int,
57                           action='append',
58                           default=[],
59                           required=False,
60                           help='Clients from given room id')
61        group.add_argument('--client-ip',
62                           action='append',
63                           default=[],
64                           required=False,
65                           help='Specific client IP')
66        parsed_args = parser.parse_args(args)
67
68        r = rest.get('/scopes')
69        scopes = r.json()
70        ips = set()
71
72        for center in parsed_args.center_id:
73            center_scope = scope_lookup(center, 'center', scopes)
74            ips.update(ips_in_scope(center_scope))
75        for room in parsed_args.room_id:
76            room_scope = scope_lookup(room, 'room', scopes)
77            ips.update(ips_in_scope(room_scope))
78        for l in parsed_args.client_ip:
79            ips.add(l)
80
81        if not ips:
82            print('No clients specified.')
83            return
84
85        r = rest.get('/images')
86        images = r.json()
87        found_image = [img for img in images['images']
88                       if img['id'] == parsed_args.id]
89        if not found_image:
90            print(f'Image with id {parsed_args.id} not found.')
91            return
92        else:
93            found_image = found_image[0]
94
95        payload = {'disk': parsed_args.disk, 'partition': parsed_args.part,
96                   'id': str(parsed_args.id), 'name': found_image['name'],
97                   'profile': str(found_image['software_id']),
98                   'repository': parsed_args.repo,
99                   'type': parsed_args.type.upper(), 'clients': list(ips)}
100        r = rest.post('/image/restore', payload=payload)
101
102    @staticmethod
103    def create_image(rest, args):
104        parser = argparse.ArgumentParser()
105        parser.add_argument('--disk',
106                            nargs='?',
107                            required=True,
108                            help='Disk')
109        parser.add_argument('--part',
110                            nargs='?',
111                            required=True,
112                            help='Partition')
113        parser.add_argument('--name',
114                            nargs='?',
115                            required=True,
116                            help='Image name')
117        parser.add_argument('--desc',
118                            nargs='?',
119                            required=False,
120                            help='Image description (for new images)')
121        parser.add_argument('--repo-id',
122                            nargs='?',
123                            default=1,
124                            help='Images repository id')
125        group = parser.add_argument_group('clients', 'Client selection args')
126        group.add_argument('--client-ip',
127                           action='append',
128                           default=[],
129                           required=True,
130                           help='Specific client IP')
131        parsed_args = parser.parse_args(args)
132
133        r = rest.get('/client/info', payload={'client': parsed_args.client_ip})
134        center_id = r.json()['center']
135
136        r = rest.get('/client/setup',
137                     payload={'client': parsed_args.client_ip})
138        if r.status_code == 200:
139            part_info = list(filter(lambda x: x['disk'] == int(parsed_args.disk) and
140                             x['partition'] == int(parsed_args.part),
141                             r.json()['partitions']))
142            if not part_info:
143                print('Partition not found.')
144                return
145            fs_code = list(part_info)[0]['code']
146
147        payload = {'clients': parsed_args.client_ip, 'disk': parsed_args.disk, 'center_id': center_id,
148                   'partition': parsed_args.part, 'code': str(fs_code), 'name': parsed_args.name,
149                   'id': '0'}
150        if parsed_args.desc:
151            payload['description'] = parsed_args.desc
152            payload['repository_id'] = parsed_args.repo_id
153
154        rest.post('/image/create', payload=payload)
Note: See TracBrowser for help on using the repository browser.