Coverage for osmclient/cli_commands/packages.py: 56%
89 statements
« prev ^ index » next coverage.py v7.3.1, created at 2024-06-29 09:50 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2024-06-29 09:50 +0000
1# Copyright ETSI Contributors and Others.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
16import click
17from osmclient.cli_commands import utils
18from prettytable import PrettyTable
19import logging
21logger = logging.getLogger("osmclient")
24@click.command(
25 name="package-create", short_help="Create empty VNF or NS package structure"
26)
27@click.argument("package-type")
28@click.argument("package-name")
29@click.option(
30 "--base-directory",
31 default=".",
32 help=('(NS/VNF/NST) Set the location for package creation. Default: "."'),
33)
34@click.option(
35 "--image",
36 default="image-name",
37 help='(VNF) Set the name of the vdu image. Default "image-name"',
38)
39@click.option(
40 "--vdus", default=1, help="(VNF) Set the number of vdus in a VNF. Default 1"
41)
42@click.option(
43 "--vcpu", default=1, help="(VNF) Set the number of virtual CPUs in a vdu. Default 1"
44)
45@click.option(
46 "--memory",
47 default=1024,
48 help="(VNF) Set the memory size (MB) of the vdu. Default 1024",
49)
50@click.option(
51 "--storage", default=10, help="(VNF) Set the disk size (GB) of the vdu. Default 10"
52)
53@click.option(
54 "--interfaces",
55 default=0,
56 help="(VNF) Set the number of additional interfaces apart from the management interface. Default 0",
57)
58@click.option(
59 "--vendor", default="OSM", help='(NS/VNF) Set the descriptor vendor. Default "OSM"'
60)
61@click.option(
62 "--override",
63 default=False,
64 is_flag=True,
65 help="(NS/VNF/NST) Flag for overriding the package if exists.",
66)
67@click.option(
68 "--detailed",
69 is_flag=True,
70 default=False,
71 help="(NS/VNF/NST) Flag for generating descriptor .yaml with all possible commented options",
72)
73@click.option(
74 "--netslice-subnets", default=1, help="(NST) Number of netslice subnets. Default 1"
75)
76@click.option(
77 "--netslice-vlds", default=1, help="(NST) Number of netslice vlds. Default 1"
78)
79@click.option(
80 "--old",
81 default=False,
82 is_flag=True,
83 help="Flag to create a descriptor using the previous OSM format (pre SOL006, OSM<9)",
84)
85@click.pass_context
86def package_create(
87 ctx,
88 package_type,
89 base_directory,
90 package_name,
91 override,
92 image,
93 vdus,
94 vcpu,
95 memory,
96 storage,
97 interfaces,
98 vendor,
99 detailed,
100 netslice_subnets,
101 netslice_vlds,
102 old,
103):
104 """
105 Creates an OSM NS, VNF, NST package
107 \b
108 PACKAGE_TYPE: Package to be created: NS, VNF or NST.
109 PACKAGE_NAME: Name of the package to create the folder with the content.
110 """
112 logger.debug("")
113 utils.check_client_version(ctx.obj, ctx.command.name)
114 print(
115 "Creating the {} structure: {}/{}".format(
116 package_type.upper(), base_directory, package_name
117 )
118 )
119 resp = ctx.obj.package_tool.create(
120 package_type,
121 base_directory,
122 package_name,
123 override=override,
124 image=image,
125 vdus=vdus,
126 vcpu=vcpu,
127 memory=memory,
128 storage=storage,
129 interfaces=interfaces,
130 vendor=vendor,
131 detailed=detailed,
132 netslice_subnets=netslice_subnets,
133 netslice_vlds=netslice_vlds,
134 old=old,
135 )
136 print(resp)
139@click.command(
140 name="package-validate", short_help="Validate descriptors given a base directory"
141)
142@click.argument("base-directory", default=".", required=False)
143@click.option(
144 "--recursive/--no-recursive",
145 default=True,
146 help="The activated recursive option will validate the yaml files"
147 " within the indicated directory and in its subdirectories",
148)
149@click.option(
150 "--old",
151 is_flag=True,
152 default=False,
153 help="Validates also the descriptors using the previous OSM format (pre SOL006)",
154)
155@click.pass_context
156def package_validate(ctx, base_directory, recursive, old):
157 """
158 Validate descriptors given a base directory.
160 \b
161 BASE_DIRECTORY: Base folder for NS, VNF or NST package.
162 """
163 logger.debug("")
164 utils.check_client_version(ctx.obj, ctx.command.name)
165 results = ctx.obj.package_tool.validate(base_directory, recursive, old)
166 table = PrettyTable()
167 table.field_names = ["TYPE", "PATH", "VALID", "ERROR"]
168 # Print the dictionary generated by the validation function
169 for result in results:
170 table.add_row(
171 [result["type"], result["path"], result["valid"], result["error"]]
172 )
173 table.sortby = "VALID"
174 table.align["PATH"] = "l"
175 table.align["TYPE"] = "l"
176 table.align["ERROR"] = "l"
177 print(table)
180@click.command(
181 name="package-translate", short_help="Translate descriptors given a base directory"
182)
183@click.argument("base-directory", default=".", required=False)
184@click.option(
185 "--recursive/--no-recursive",
186 default=True,
187 help="The activated recursive option will translate the yaml files"
188 " within the indicated directory and in its subdirectories",
189)
190@click.option(
191 "--dryrun",
192 is_flag=True,
193 default=False,
194 help="Do not translate yet, only make a dry-run to test translation",
195)
196@click.pass_context
197def package_translate(ctx, base_directory, recursive, dryrun):
198 """
199 Translate descriptors given a base directory.
201 \b
202 BASE_DIRECTORY: Stub folder for NS, VNF or NST package.
203 """
204 logger.debug("")
205 utils.check_client_version(ctx.obj, ctx.command.name)
206 results = ctx.obj.package_tool.translate(base_directory, recursive, dryrun)
207 table = PrettyTable()
208 table.field_names = [
209 "CURRENT TYPE",
210 "NEW TYPE",
211 "PATH",
212 "VALID",
213 "TRANSLATED",
214 "ERROR",
215 ]
216 # Print the dictionary generated by the validation function
217 for result in results:
218 table.add_row(
219 [
220 result["current type"],
221 result["new type"],
222 result["path"],
223 result["valid"],
224 result["translated"],
225 result["error"],
226 ]
227 )
228 table.sortby = "TRANSLATED"
229 table.align["PATH"] = "l"
230 table.align["TYPE"] = "l"
231 table.align["ERROR"] = "l"
232 print(table)
235@click.command(name="package-build", short_help="Build the tar.gz of the package")
236@click.argument("package-folder")
237@click.option(
238 "--skip-validation", default=False, is_flag=True, help="skip package validation"
239)
240@click.option(
241 "--skip-charm-build",
242 default=False,
243 is_flag=True,
244 help="the charm will not be compiled, it is assumed to already exist",
245)
246@click.pass_context
247def package_build(ctx, package_folder, skip_validation, skip_charm_build):
248 """
249 Build the package NS, VNF given the package_folder.
251 \b
252 PACKAGE_FOLDER: Folder of the NS, VNF or NST to be packaged
253 """
254 logger.debug("")
255 utils.check_client_version(ctx.obj, ctx.command.name)
256 results = ctx.obj.package_tool.build(
257 package_folder,
258 skip_validation=skip_validation,
259 skip_charm_build=skip_charm_build,
260 )
261 print(results)
264@click.command(
265 name="descriptor-translate",
266 short_help="Translate input descriptor file from Rel EIGHT OSM descriptors to SOL006 and prints in standard output",
267)
268@click.argument("descriptor-file", required=True)
269@click.pass_context
270def descriptor_translate(ctx, descriptor_file):
271 """
272 Translate input descriptor.
274 \b
275 DESCRIPTOR_FILE: Descriptor file for NS, VNF or Network Slice.
276 """
277 logger.debug("")
278 utils.check_client_version(ctx.obj, ctx.command.name)
279 result = ctx.obj.package_tool.descriptor_translate(descriptor_file)
280 print(result)
283# TODO: check if this command should be here. It is more related to nspkg and nfpkg
284@click.command(name="upload-package", short_help="uploads a VNF package or NS package")
285@click.argument("filename")
286@click.option(
287 "--skip-charm-build",
288 default=False,
289 is_flag=True,
290 help="the charm will not be compiled, it is assumed to already exist",
291)
292@click.pass_context
293def upload_package(ctx, filename, skip_charm_build):
294 """uploads a vnf package or ns package
296 filename: vnf or ns package folder, or vnf or ns package file (tar.gz)
297 """
298 logger.debug("")
299 ctx.obj.package.upload(filename, skip_charm_build=skip_charm_build)