1 # Copyright ETSI Contributors and Others.
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
8 # http://www.apache.org/licenses/LICENSE-2.0
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
17 from osmclient
.common
.exceptions
import ClientException
18 from osmclient
.common
import print_output
19 from osmclient
.cli_commands
import utils
20 from prettytable
import PrettyTable
24 from datetime
import datetime
27 logger
= logging
.getLogger("osmclient")
30 def vnf_list(ctx
, ns
, filter, long, output
):
34 utils
.check_client_version(ctx
.obj
, "--ns")
36 filter = "&".join(filter)
37 utils
.check_client_version(ctx
.obj
, "--filter")
38 resp
= ctx
.obj
.vnf
.list(ns
, filter)
40 resp
= ctx
.obj
.vnf
.list()
62 table
= PrettyTable(field_names
)
64 name
= vnfr
["name"] if "name" in vnfr
else "-"
69 vnfr
["member-vnf-index-ref"],
71 vnfr
["vim-account-id"],
75 date
= datetime
.fromtimestamp(vnfr
["_admin"]["created"]).strftime(
78 last_update
= datetime
.fromtimestamp(vnfr
["_admin"]["modified"]).strftime(
81 new_row
.extend([date
, last_update
])
82 table
.add_row(new_row
)
83 print_output
.print_output(output
, table
.field_names
, table
._rows
)
86 @click.command(name
="vnf-list", short_help
="list all NF instances")
88 "--ns", default
=None, help="NS instance id or name to restrict the NF list"
94 help="restricts the list to the NF instances matching the filter.",
96 @click.option("--long", is_flag
=True, help="get more details")
97 @print_output.output_option
99 def vnf_list1(ctx
, ns
, filter, long, output
):
100 """list all NF instances"""
102 vnf_list(ctx
, ns
, filter, long, output
)
105 @click.command(name
="nf-list", short_help
="list all NF instances")
107 "--ns", default
=None, help="NS instance id or name to restrict the NF list"
113 help="restricts the list to the NF instances matching the filter.",
115 @click.option("--long", is_flag
=True, help="get more details")
116 @print_output.output_option
118 def nf_list(ctx
, ns
, filter, long, output
):
119 """list all NF instances
123 --ns TEXT NS instance id or name to restrict the VNF list
124 --filter filterExpr Restricts the list to the VNF instances matching the filter
127 filterExpr consists of one or more strings formatted according to "simpleFilterExpr",
128 concatenated using the "&" character:
131 filterExpr := <simpleFilterExpr>["&"<simpleFilterExpr>]*
132 simpleFilterExpr := <attrName>["."<attrName>]*["."<op>]"="<value>[","<value>]*
133 op := "eq" | "neq" | "gt" | "lt" | "gte" | "lte" | "cont" | "ncont"
135 value := scalar value
139 * zero or more occurrences
140 ? zero or one occurrence
141 [] grouping of expressions to be used with ? and *
142 "" quotation marks for marking string constants
146 "AttrName" is the name of one attribute in the data type that defines the representation
147 of the resource. The dot (".") character in "simpleFilterExpr" allows concatenation of
148 <attrName> entries to filter by attributes deeper in the hierarchy of a structured document.
149 "Op" stands for the comparison operator. If the expression has concatenated <attrName>
150 entries, it means that the operator "op" is applied to the attribute addressed by the last
151 <attrName> entry included in the concatenation. All simple filter expressions are combined
152 by the "AND" logical operator. In a concatenation of <attrName> entries in a <simpleFilterExpr>,
153 the rightmost "attrName" entry in a "simpleFilterExpr" is called "leaf attribute". The
154 concatenation of all "attrName" entries except the leaf attribute is called the "attribute
155 prefix". If an attribute referenced in an expression is an array, an object that contains a
156 corresponding array shall be considered to match the expression if any of the elements in the
157 array matches all expressions that have the same attribute prefix.
161 --filter vim-account-id=<VIM_ACCOUNT_ID>
162 --filter vnfd-ref=<VNFD_NAME>
163 --filter vdur.ip-address=<IP_ADDRESS>
164 --filter vnfd-ref=<VNFD_NAME>,vdur.ip-address=<IP_ADDRESS>
167 vnf_list(ctx
, ns
, filter, long, output
)
170 @click.command(name
="vnf-show", short_help
="shows the info of a VNF instance")
171 @click.argument("name")
172 @click.option("--literal", is_flag
=True, help="print literally, no pretty table")
176 help="restricts the information to the fields in the filter",
178 @click.option("--kdu", default
=None, help="KDU name (whose status will be shown)")
179 @print_output.output_option
181 def vnf_show(ctx
, name
, literal
, filter, kdu
, output
):
182 """shows the info of a VNF instance
184 NAME: name or ID of the VNF instance
187 def print_kdu_status(op_info_status
):
188 """print KDU status properly formatted"""
190 op_status
= yaml
.safe_load(op_info_status
)
192 "namespace" in op_status
193 and "info" in op_status
194 and "last_deployed" in op_status
["info"]
195 and "status" in op_status
["info"]
196 and "code" in op_status
["info"]["status"]
197 and "resources" in op_status
["info"]["status"]
198 and "seconds" in op_status
["info"]["last_deployed"]
200 last_deployed_time
= datetime
.fromtimestamp(
201 op_status
["info"]["last_deployed"]["seconds"]
202 ).strftime("%a %b %d %I:%M:%S %Y")
203 print("LAST DEPLOYED: {}".format(last_deployed_time
))
204 print("NAMESPACE: {}".format(op_status
["namespace"]))
205 status_code
= "UNKNOWN"
206 if op_status
["info"]["status"]["code"] == 1:
207 status_code
= "DEPLOYED"
208 print("STATUS: {}".format(status_code
))
211 print(op_status
["info"]["status"]["resources"])
212 if "notes" in op_status
["info"]["status"]:
214 print(op_status
["info"]["status"]["notes"])
216 print(op_info_status
)
218 print(op_info_status
)
223 raise ClientException(
224 '"--literal" option is incompatible with "--kdu" option'
227 raise ClientException(
228 '"--filter" option is incompatible with "--kdu" option'
231 utils
.check_client_version(ctx
.obj
, ctx
.command
.name
)
232 resp
= ctx
.obj
.vnf
.get(name
)
235 ns_id
= resp
["nsr-id-ref"]
237 op_data
["member_vnf_index"] = resp
["member-vnf-index-ref"]
238 op_data
["kdu_name"] = kdu
239 op_data
["primitive"] = "status"
240 op_data
["primitive_params"] = {}
241 op_id
= ctx
.obj
.ns
.exec_op(ns_id
, op_name
="action", op_data
=op_data
, wait
=False)
244 op_info
= ctx
.obj
.ns
.get_op(op_id
)
245 if op_info
["operationState"] == "COMPLETED":
246 print_kdu_status(op_info
["detailed-status"])
250 print("Could not determine KDU status")
254 print(yaml
.safe_dump(resp
, indent
=4, default_flow_style
=False))
257 table
= PrettyTable(["field", "value"])
258 for k
, v
in list(resp
.items()):
259 if not filter or k
in filter:
260 table
.add_row([k
, utils
.wrap_text(text
=json
.dumps(v
, indent
=2), width
=100)])
261 print_output
.print_output(output
, table
.field_names
, table
._rows
)