From 059c65baa61b604fc8c3244749d4fadaf68d199b Mon Sep 17 00:00:00 2001 From: Hiromu Asahina Date: Wed, 18 Dec 2024 01:22:04 +0900 Subject: [PATCH] Add tacker_cli for external OAuth2.0 This patch adds CLI shell script which is a wrapper of the curl command for cases where an external OAuth2.0 authorization server is configured. Without this script, users need to get OAuth2.0 token and build a curl command with proper headers and a body manually as the usual openstack command only work for Keystone. Change-Id: Idaa159d0f5cc9cc245e141eb595bb2f15c571d03 --- .../admin/external_oauth2_usage_guide.rst | 99 + doc/tools/ext_oauth2_server/tacker_cli.sh | 2743 +++++++++++++++++ 2 files changed, 2842 insertions(+) create mode 100644 doc/tools/ext_oauth2_server/tacker_cli.sh diff --git a/doc/source/admin/external_oauth2_usage_guide.rst b/doc/source/admin/external_oauth2_usage_guide.rst index 7c13efa33..3aecb5c04 100644 --- a/doc/source/admin/external_oauth2_usage_guide.rst +++ b/doc/source/admin/external_oauth2_usage_guide.rst @@ -900,6 +900,103 @@ Using Tacker API When using an external OAuth 2.0 authorization server, the current version of OpenStack Command is not supported. +Instead, you can use `tacker_cli.sh`_, a wrapper of ``curl``. For example, you +can call ``v1.0/vims`` API as follows. + +.. code-block:: shell + + $ export TACKER_AUTH_URL="http://$keycloak_host_name:$keycloak_http_port/realms/testrealm/protocol/openid-connect/token" + $ export TACKER_CLIENT_ID="tacker_api_proj" + $ export TACKER_CLIENT_SECRET="iIK6lARLzJgoQQyMyoymNYrGTDuR0733S" + $ export TACKER_AUTH_TYPE="client_secret_basic" + $ export TACKER_OAUTH2_SCOPE="tacker_scope" + $ export TACKER_URL=http://127.0.0.1:9890 + $ ./tacker_cli.sh vim list + + {"vims": [{"id": "a99189da-bf72-4af7-884c-36d157f00571", + "type": "openstack", "tenant_id": "2cc02f60acf34fdda7bc5e9af9a7032b", + "name": "openstack", "description": "", "placement_attr": { + "regions": ["RegionOne"]}, "is_default": true, + "created_at": "2024-11-07 02:04:46", "updated_at": "2024-11-07 02:10:18", + "extra": {}, "auth_url": "http://192.168.56.11/identity/v3", + "vim_project": {"name": "admin", "project_domain_name": "default"}, + "auth_cred": {"username": "admin", "user_domain_name": "default", + "cert_verify": "True", "project_id": null, "project_name": "admin", + "project_domain_name": "default", "auth_url": "http://192.168.56.11/identity/v3", + "key_type": "barbican_key", "secret_uuid": "***", "password": "***"}, "status": "ACTIVE"}]} + +You can also find other subcommands corresponding to Tacker APIs. + +.. code-block:: shell + + $ ./tacker_cli.sh -h + + Usage: tacker_cli.sh [] + + Options: + -h, --help show this help message and exit + -v, --version print version + + Commands: + vim + vnfpkgm + vnflcm + vnffm + vnfpm + +``tacker_cli`` uses a similar authentication scheme as the OpenStack project +CLIs, with the credential information as environment variables beginning with +the prefix ``TACKER``. Full examples of each authentication method are provided +below. + +.. code-block:: shell + + # client_secret_basic + export TACKER_AUTH_URL="http://:/realms/testrealm/protocol/openid-connect/token" + export TACKER_CLIENT_ID="tacker_api_proj" + export TACKER_CLIENT_SECRET="" + export TACKER_AUTH_TYPE="client_secret_basic" + export TACKER_OAUTH2_SCOPE="tacker_scope" + export TACKER_URL=http://: + + # client_secret_post + export TACKER_AUTH_URL="http://:/realms/testrealm/protocol/openid-connect/token" + export TACKER_CLIENT_ID="tacker_api_proj" + export TACKER_CLIENT_SECRET="" + export TACKER_AUTH_TYPE="client_secret_post" + export TACKER_OAUTH2_SCOPE="tacker_scope" + export TACKER_URL=http://: + + # private_key_jwt + export TACKER_AUTH_URL="http://:/realms/testrealm/protocol/openid-connect/token" + export TACKER_CLIENT_ID="tacker_api_proj" + export TACKER_JWT_KEY="path/to/private_key.pem" + export TACKER_AUTH_TYPE="private_key_jwt" + export TACKER_OAUTH2_SCOPE="tacker_scope" + export TACKER_URL=http://: + + # client_secret_jwt + export TACKER_AUTH_URL="http://:/realms/testrealm/protocol/openid-connect/token" + export TACKER_CLIENT_ID="tacker_api_proj" + export TACKER_CLIENT_SECRET="" + export TACKER_AUTH_TYPE="client_secret_jwt" + export TACKER_OAUTH2_SCOPE="tacker_scope" + export TACKER_URL=http://: + + # tls_client_auth + export TACKER_AUTH_URL="https://:/realms/testrealm/protocol/openid-connect/token" + export TACKER_CLIENT_ID="tacker_api_proj" + export TACKER_AUTH_TYPE="tls_client_auth" + export TACKER_OAUTH2_SCOPE="tacker_scope" + export TACKER_CACERT="path/to/ca.pem" + export TACKER_CLIENT_CERT="path/to/client.pem" + export TACKER_CLIENT_KEY="path/to/client.key" + export TACKER_URL=https://: + +.. note:: + + Please note that this script only supports `the version 2 VNF LCM APIs`_. + Cleaning Up ----------- @@ -922,3 +1019,5 @@ following command. .. _project details: https://docs.openstack.org/keystone/latest/admin/cli-manage-projects-users-and-roles.html .. _domain details: https://docs.openstack.org/security-guide/identity/domains.html .. _Mappers tab of Client scope page in the Keycloak dashboard: https://www.keycloak.org/docs/latest/server_admin/#protocol +.. _tacker_cli.sh: https://opendev.org/openstack/tacker/src/branch/master/doc/tools/tacker_cli.sh +.. _the version 2 VNF LCM APIs: https://docs.openstack.org/api-ref/nfv-orchestration/v2/vnflcm.html diff --git a/doc/tools/ext_oauth2_server/tacker_cli.sh b/doc/tools/ext_oauth2_server/tacker_cli.sh new file mode 100644 index 000000000..ca56edd96 --- /dev/null +++ b/doc/tools/ext_oauth2_server/tacker_cli.sh @@ -0,0 +1,2743 @@ +#!/bin/bash + +PROGNAME=$(basename $0) +VERSION="0.0.1" + +UUID="[A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f]-[A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f]-[A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f]-[A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f]-[A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f]" +HTTP_METHOD="+(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)" + +function usage() { + echo "Usage: $PROGNAME []" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " -v, --version print version" + echo + echo "Commands:" + echo " vim" + echo " vnfpkgm" + echo " vnflcm" + echo " vnffm" + echo " vnfpm" + echo + echo "Configuration:" + echo + echo " Set credentials and access information as environment variables according to an authentication method" + echo + echo " Examples:" + echo + echo ' client_secret_basic' + echo ' export TACKER_AUTH_URL="http://127.0.0.1:8080/realms/testrealm/protocol/openid-connect/token"' + echo ' export TACKER_CLIENT_ID="tacker_api_proj"' + echo ' export TACKER_CLIENT_SECRET=""' + echo ' export TACKER_AUTH_TYPE="client_secret_basic"' + echo ' export TACKER_OAUTH2_SCOPE="tacker_scope"' + echo ' export TACKER_URL=http://127.0.0.1:9890' + echo '' + echo ' client_secret_post' + echo ' export TACKER_AUTH_URL="http://127.0.0.1:8080/realms/testrealm/protocol/openid-connect/token"' + echo ' export TACKER_CLIENT_ID="tacker_api_proj"' + echo ' export TACKER_CLIENT_SECRET=""' + echo ' export TACKER_AUTH_TYPE="client_secret_post"' + echo ' export TACKER_OAUTH2_SCOPE="tacker_scope"' + echo ' export TACKER_URL=http://127.0.0.1:9890' + echo '' + echo ' private_key_jwt' + echo ' export TACKER_AUTH_URL="http://127.0.0.1:8080/realms/testrealm/protocol/openid-connect/token"' + echo ' export TACKER_CLIENT_ID="tacker_api_proj"' + echo ' export TACKER_JWT_KEY="/opt/stack/workspace/ext_oauth2/keycloak/script/private_key.pem"' + echo ' export TACKER_AUTH_TYPE="private_key_jwt"' + echo ' export TACKER_OAUTH2_SCOPE="tacker_scope"' + echo ' export TACKER_URL=http://127.0.0.1:9890' + echo '' + echo ' client_secret_jwt' + echo ' export TACKER_AUTH_URL="http://127.0.0.1:8080/realms/testrealm/protocol/openid-connect/token"' + echo ' export TACKER_CLIENT_ID="tacker_api_proj"' + echo ' export TACKER_CLIENT_SECRET=""' + echo ' export TACKER_AUTH_TYPE="client_secret_jwt"' + echo ' export TACKER_OAUTH2_SCOPE="tacker_scope"' + echo ' export TACKER_URL=http://127.0.0.1:9890' + echo '' + echo ' tls_client_auth' + echo ' export TACKER_AUTH_URL="https://127.0.0.1:8443/realms/testrealm/protocol/openid-connect/token"' + echo ' export TACKER_CLIENT_ID="tacker_api_proj"' + echo ' export TACKER_AUTH_TYPE="tls_client_auth"' + echo ' export TACKER_OAUTH2_SCOPE="tacker_scope"' + echo ' export TACKER_CACERT="path/to/ca.pem"' + echo ' export TACKER_CLIENT_CERT="path/to/client.pem"' + echo ' export TACKER_CLIENT_KEY="path/to/client.key"' + echo ' export TACKER_URL=https://127.0.0.1:9890' + echo +} + +function vim::usage() { + echo "Usage: $PROGNAME vim []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " register" + echo " list" + echo " show" + echo " update" + echo " delete" +} + +function vim::register::usage() { + echo "Usage: $PROGNAME vim register [-h] --config-file " + echo + echo "Register a new VIM" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --config-file " + echo " YAML file with VIM configuration parameters" + echo +} + +function vim::list::usage() { + echo "Usage: $PROGNAME vim list [-h]" + echo + echo "List VIMs that belong to a given tenant" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vim::show::usage() { + echo "Usage: $PROGNAME vim show [-h] " + echo + echo "Display VIM details" + echo + echo "positional arguments:" + echo " VIM to display (ID)" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vim::update::usage() { + echo "Usage: $PROGNAME vim update [-h] --config-file " + echo + echo "Update VIM" + echo + echo "positional arguments:" + echo " ID of vim to update" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --config-file " + echo " YAML file with VIM configuration parameters for update" + echo +} + +function vim::delete::usage() { + echo "Usage: $PROGNAME vim delete [-h] [ ...]" + echo + echo "Delete VIM(s)" + echo + echo "positional arguments:" + echo " vim(s) to delete (ID)" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpkgm::usage() { + echo "Usage: $PROGNAME vnfpkgm []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " create" + echo " upload" + echo " download" + echo " artifact-download" + echo " list" + echo " show" + echo " update" + echo " delete" + echo +} + +function vnfpkgm::create::usage() { + echo "Usage: $PROGNAME vnfpkgm create [-h] [--param-file ]" + echo + echo "Create a new VNF Package" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify create request parameters in a json file" + echo +} + +function vnfpkgm::upload::usage() { + echo "Usage: $PROGNAME vnfpkgm upload [-h] --path " + echo + echo "Upload VNF Package" + echo + echo "positional arguments:" + echo " " + echo " VNF package ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --path " + echo " upload VNF CSAR package from local zip file" + echo +} + +function vnfpkgm::download::usage() { + echo "Usage: $PROGNAME vnfpkgm download [-h] [--file ] " + echo + echo "Download VNF package contents of an on-boarded VNF package" + echo + echo "positional arguments:" + echo " " + echo " VNF package ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --file " + echo " Local file to save downloaded VNF Package data. If this is not specified" + echo " data will be saved as .zip" + echo + echo +} + +function vnfpkgm::artifact_download::usage() { + echo "Usage: $PROGNAME vnfpkgm artifact-download [-h] --file --artifact-path " + echo + echo "Download VNF package artifact of an on-boarded VNF package" + echo + echo "positional arguments:" + echo " " + echo " VNF package ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --file " + echo " Local file to save downloaded artifact data" + echo " --artifact-path " + echo " The artifact file's path" + echo +} + +function vnfpkgm::list::usage() { + echo "Usage: $PROGNAME vnfpkgm list [-h]" + echo + echo "List VNF Packages" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpkgm::show::usage() { + echo "Usage: $PROGNAME vnfpkgm show [-h] " + echo + echo "Show VNF Package Details" + echo + echo "positional arguments:" + echo " " + echo " VNF package ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpkgm::update::usage() { + echo "Usage: $PROGNAME vnfpkgm update [-h] --param-file " + echo + echo "Update information about an individual VNF package" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify update request parameters in a json file" + echo +} + +function vnfpkgm::delete::usage() { + echo "Usage: $PROGNAME vnfpkgm delete [-h] [ ...]" + echo + echo "Delete VNF Package" + echo + echo "positional arguments:" + echo " " + echo " Vnf package(s) ID to delete" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnflcm::usage() { + echo "Usage: $PROGNAME vnflcm []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " create" + echo " instanatiate" + echo " list" + echo " show" + echo " terminate" + echo " delete" + echo " heal" + echo " update" + echo " scale" + echo " change-ext-conn" + echo " change-vnfpkg" + echo " versions" + echo " op" + echo " subsc" +} + +function vnflcm::create::usage() { + echo "Usage: $PROGNAME vnflcm create [-h] --param-file " + echo + echo "Create a new VNF Instance" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify create request parameters in a json file" + echo +} + +function vnflcm::instantiate::usage() { + echo "Usage: $PROGNAME vnflcm instantiate [-h] --param-file " + echo + echo "Instantiate a VNF Instance" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to instantiate" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify instantiate request parameters in a json file" + echo +} + +function vnflcm::list::usage() { + echo "Usage: $PROGNAME vnflcm list [-h]" + echo + echo "List VNF Instances" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnflcm::show::usage() { + echo "Usage: $PROGNAME vnflcm show [-h] " + echo + echo "Display VNF Instance details" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnflcm::terminate::usage() { + echo "Usage: $PROGNAME vnflcm terminate [-h] --param-file " + echo + echo "Terminate a VNF Instance" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to terminate" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify terminate request parameters in a json file" + echo +} + +function vnflcm::delete::usage() { + echo "Usage: $PROGNAME vnflcm delete [-h] [ ...]" + echo + echo "Delete VNF Instance(s)" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID(s) to delete" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnflcm::heal::usage() { + echo "Usage: $PROGNAME vnflcm heal [-h] --param-file " + echo + echo "Heal a VNF Instance" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to heal" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify heal request parameters in a json file" + echo +} + +function vnflcm::update::usage() { + echo "Usage: $PROGNAME vnflcm update [-h] --param-file " + echo + echo "Update a VNF Instance" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to update" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify update request parameters in a json file" + echo +} + +function vnflcm::scale::usage() { + echo "Usage: $PROGNAME vnflcm scale [-h] --param-file " + echo + echo "Scale a VNF Instance" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to scale" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify scale request parameters in a json file" + echo +} + +function vnflcm::change_ext_conn::usage() { + echo "Usage: $PROGNAME vnflcm change-ext-conn [-h] --param-file " + echo + echo "Change External VNF Connectivity" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to Change External VNF Connectivity" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify change-ext-conn request parameters in a json file" + echo +} + +function vnflcm::change_vnfpkg::usage() { + echo "Usage: $PROGNAME vnflcm change-vnfpkg [-h] --param-file " + echo + echo "Change Current VNF Package" + echo + echo "positional arguments:" + echo " " + echo " VNF instance ID to Change Current VNF Package" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify change-vnfpkg request parameters in a json file" + echo +} + +function vnflcm::versions::usage() { + echo "Usage: $PROGNAME vnflcm versions [-h]" + echo + echo "Show VnfLcm Api versions" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function op::usage() { + echo "Usage: $PROGNAME vnflcm op []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " rollback" + echo " retry" + echo " fail" + echo " list" + echo " show" + echo +} + +function op::rollback::usage() { + echo "Usage: $PROGNAME vnflcm op rollback [-h] " + echo + echo "Rollback LCM Operation Occurrence" + echo + echo "positional arguments:" + echo " " + echo " VNF lifecycle management operation occurrence ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function op::retry::usage() { + echo "Usage: $PROGNAME vnflcm op retry [-h] " + echo + echo "Retry LCM Operation Occurrence" + echo + echo "positional arguments:" + echo " " + echo " VNF lifecycle management operation occurrence ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function op::fail::usage() { + echo "Usage: $PROGNAME vnflcm op fail [-h] " + echo + echo "Fail LCM Operation Occurrence" + echo + echo "positional arguments:" + echo " " + echo " VNF lifecycle management operation occurrence ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function op::list::usage() { + echo "Usage: $PROGNAME vnflcm op list [-h]" + echo + echo "List LCM Operation Occurrences" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function op::show::usage() { + echo "Usage: $PROGNAME vnflcm op show [-h] " + echo + echo "Display LCM Operation Occurrence details" + echo + echo "positional arguments:" + echo " " + echo " VNF lifecycle management operation occurrence ID" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function subsc::usage() { + echo "Usage: $PROGNAME vnflcm subsc []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " create" + echo " list" + echo " show" + echo " delete" + echo +} + +function subsc::create::usage() { + echo "Usage: $PROGNAME vnflcm subsc create [-h] --param-file " + echo + echo "Create a new Lccn Subscription" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify create request parameters in a json file" + echo +} + +function subsc::list::usage() { + echo "Usage: $PROGNAME vnflcm subsc list [-h]" + echo + echo "List Lccn Subscriptions" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function subsc::show::usage() { + echo "Usage: $PROGNAME vnflcm subsc show [-h] " + echo + echo "Display Lccn Subscription details" + echo + echo "positional arguments:" + echo " " + echo " Lccn Subscription ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function subsc::delete::usage() { + echo "Usage: $PROGNAME vnflcm subsc delete [-h] [ ...]" + echo + echo "Delete Lccn Subscription(s)" + echo + echo "positional arguments:" + echo " " + echo " Lccn Subscription ID(s) to delete" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnffm::usage() { + echo "Usage: $PROGNAME vnffm []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " alarm" + echo " sub" + echo +} + +function vnffm::alarm::usage() { + echo "Usage: $PROGNAME vnffm alarm []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " list" + echo " show" + echo " update" + echo +} + +function vnffm::alarm::list::usage() { + echo "Usage: $PROGNAME vnffm alarm list [-h]" + echo + echo "List VNF FM alarms" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnffm::alarm::show::usage() { + echo "Usage: $PROGNAME vnffm alarm show [-h] " + echo + echo "Display VNF FM alarm details" + echo + echo "positional arguments:" + echo " " + echo " VNF FM alarm ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnffm::alarm::update::usage() { + echo "Usage: $PROGNAME vnffm alarm update [-h] --param-file " + echo + echo "Update information about an individual VNF FM alarm" + echo + echo "positional arguments:" + echo " " + echo " VNF FM alarm ID to update" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify update request parameters in a json file" + echo +} + +function vnffm::sub::usage() { + echo "Usage: $PROGNAME vnffm sub []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " create" + echo " list" + echo " show" + echo " delete" +} + +function vnffm::sub::create::usage() { + echo "Usage: $PROGNAME vnffm sub create [-h] --param-file " + echo + echo "Create a new VNF FM subscription" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify create VNF FM subscription request parameters in a json file" + echo +} + +function vnffm::sub::list::usage() { + echo "Usage: $PROGNAME vnffm sub list [-h]" + echo + echo "List VNF FM subscriptions" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnffm::sub::show::usage() { + echo "Usage: $PROGNAME vnffm sub show [-h] " + echo + echo "Display VNF FM subscription details" + echo + echo "positional arguments:" + echo " " + echo " VNF FM subscription ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnffm::sub::delete::usage() { + echo "Usage: $PROGNAME vnffm sub delete [-h] [ ...]" + echo + echo "Delete VNF FM subscription(s)" + echo + echo "positional arguments:" + echo " " + echo " VNF FM subscription ID(s) to delete" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpm::usage() { + echo "Usage: $PROGNAME vnfpm []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " job" + echo " report-show" + echo " threshold" + echo +} + +function vnfpm::job::usage() { + echo "Usage: $PROGNAME vnfpm job []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " create" + echo " update" + echo " list" + echo " show" + echo " delete" + echo +} + +function vnfpm::job::create::usage() { + echo "Usage: $PROGNAME vnfpm job create [-h] --param-file " + echo + echo "Create a new VNF PM job" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify create VNF PM job request parameters in a json file" + echo +} + +function vnfpm::job::update::usage() { + echo "Usage: $PROGNAME vnfpm job update [-h] --param-file " + echo + echo "Update information about an individual VNF PM job" + echo + echo "positional arguments:" + echo " " + echo " VNF PM job ID to update" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify update PM job request parameters in a json file" + echo +} + +function vnfpm::job::list::usage() { + echo "Usage: $PROGNAME vnfpm job list [-h]" + echo + echo "List VNF PM jobs" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpm::job::show::usage() { + echo "Usage: $PROGNAME vnfpm job show [-h] " + echo + echo "Display VNF PM job details" + echo + echo "positional arguments:" + echo " " + echo " VNF PM job ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpm::job::delete::usage() { + echo "Usage: $PROGNAME vnfpm job delete [-h] [ ...]" + echo + echo "Delete VNF PM job(s)" + echo + echo "positional arguments:" + echo " " + echo " VNF PM job ID(s) to delete" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify delete request parameters in a json file" + echo +} + +function vnfpm::report_show::usage() { + echo "Usage: $PROGNAME vnfpm report-show [-h] " + echo + echo "Display VNF PM report details" + echo + echo "positional arguments:" + echo " " + echo " VNF PM job id where the VNF PM report is located" + echo " " + echo " VNF PM report ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpm::threshold::usage() { + echo "Usage: $PROGNAME vnfpm threshold []" + echo + echo "Options:" + echo " h-, --help show this help message and exit" + echo + echo "Commands:" + echo " create" + echo " update" + echo " list" + echo " show" + echo " delete" + echo +} + +function vnfpm::threshold::create::usage() { + echo "Usage: $PROGNAME vnfpm threshold create [-h] --param-file " + echo + echo "Create a new VNF PM threshold" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify create request parameters in a json file" + echo +} + +function vnfpm::threshold::update::usage() { + echo "Usage: $PROGNAME vnfpm threshold update [-h] --param-file " + echo + echo "Update information about an individual VNF PM threshold" + echo + echo "positional arguments:" + echo " " + echo " VNF PM threshold ID to update" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo " --param-file " + echo " specify update PM threshold request parameters in a json file" + echo +} + +function vnfpm::threshold::list::usage() { + echo "Usage: $PROGNAME vnfpm threshold list [-h]" + echo + echo "List VNF PM thresholds" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpm::threshold::show::usage() { + echo "Usage: $PROGNAME vnfpm threshold show [-h] " + echo + echo "Display VNF PM threshold details" + echo + echo "positional arguments:" + echo " " + echo " VNF PM threshold ID to display" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vnfpm::threshold::delete::usage() { + echo "Usage: $PROGNAME vnfpm threshold delete [-h] [ ...]" + echo + echo "Delete VNF PM threshold(s)" + echo + echo "positional arguments:" + echo " " + echo " VNF PM threshold ID(s) to delete" + echo + echo "Options:" + echo " -h, --help show this help message and exit" + echo +} + +function vim() { + case $1 in + -h | --help) + vim::usage + exit 0 + ;; + register) + shift + vim::register "${@}" + exit 0 + ;; + list) + shift + vim::list "${@}" + exit 0 + ;; + show) + shift + vim::show "${@}" + exit 0 + ;; + update) + shift + vim::update "${@}" + exit 0 + ;; + delete) + shift + vim::delete "${@}" + exit 0 + ;; + *) + vim::usage + exit 1 + ;; + esac +} + +function vim::register() { + case $1 in + -h | --help) + vim::register::usage + exit 0 + ;; + --config-file) + config_file="$2" + shift + shift + ;; + esac + + if [[ -z "${config_file}" ]]; then + vim::register::usage + exit 1 + fi + + exec_curl POST /v1.0/vims -d @${config_file} +} + +function vim::list() { + case $1 in + -h | --help) + vim::list::usage + exit 0 + ;; + esac + + exec_curl GET /v1.0/vims +} + +function vim::show() { + case $1 in + -h | --help) + vim::show::usage + exit 0 + ;; + ${UUID}) + vim_id="${1}" + shift + ;; + esac + + if [[ -z "${vim_id}" ]]; then + vim::show::usage + exit 1 + fi + + exec_curl GET /v1.0/vims/${vim_id} +} + +function vim::update() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vim::update::usage + exit 0 + ;; + --config-file) + config_file="$2" + shift + shift + ;; + ${UUID}) + vim_id="${1}" + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${config_file}" || -z "${vim_id}" ]]; then + vim::update::usage + exit 1 + fi + + exec_curl PUT /v1.0/vims/${vim_id} -d @${config_file} +} + +function vim::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vim::delete::usage + exit 0 + ;; + ${UUID}) + vim_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${vim_ids}" ]]; then + vim::delete::usage + exit 1 + fi + + for vim_id in "${vim_ids[@]}"; do + exec_curl DELETE /v1.0/vims/${vim_id} + done +} + +function vnfpkgm() { + case $1 in + -h | --help) + vnfpkgm::usage + exit 0 + ;; + create) + shift + vnfpkgm::create "${@}" + exit 0 + ;; + upload) + shift + vnfpkgm::upload "${@}" + exit 0 + ;; + download) + shift + vnfpkgm::download "${@}" + exit 0 + ;; + artifact-download) + shift + vnfpkgm::artifact_download "${@}" + exit 0 + ;; + list) + shift + vnfpkgm::list "${@}" + exit 0 + ;; + show) + shift + vnfpkgm::show "${@}" + exit 0 + ;; + update) + shift + vnfpkgm::update "${@}" + exit 0 + ;; + delete) + shift + vnfpkgm::delete "${@}" + exit 0 + ;; + *) + vnfpkgm::usage + exit 1 + ;; + esac +} + +function vnfpkgm::create() { + case $1 in + -h | --help) + vnfpkgm::create::usage + exit 0 + ;; + --param-file) + param="@${2}" + shift + shift + ;; + esac + + exec_curl POST /vnfpkgm/v1/vnf_packages -d ${param:="{}"} +} + +function vnfpkgm::upload() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpkgm::upload::usage + exit 0 + ;; + ${UUID}) + pkg_id="${1}" + shift + ;; + --path) + pkg_path="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${pkg_id}" || -z "${pkg_path}" || "${pkg_path##*.}" != "zip" ]]; then + vnfpkgm::upload::usage + exit 1 + fi + + exec_curl PUT /vnfpkgm/v1/vnf_packages/${pkg_id}/package_content -H "Content-Type: application/zip" -F "vnf_package_content=@${pkg_path}" +} + +function vnfpkgm::download() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpkgm::download::usage + exit 0 + ;; + ${UUID}) + pkg_id="${1}" + shift + ;; + --file) + file="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${pkg_id}" ]]; then + vnfpkgm::download::usage + exit 1 + fi + + exec_curl GET /vnfpkgm/v1/vnf_packages/${pkg_id}/package_content -o ${file:="${pkg_id}.zip"} +} + +function vnfpkgm::artifact_download() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpkgm::artifact_download::usage + exit 0 + ;; + ${UUID}) + pkg_id="${1}" + shift + ;; + --file) + file="${2}" + shift + shift + ;; + --artifact-path) + artifact_path="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${pkg_id}" || -z "${artifact_path}" || -z "${file}" ]]; then + vnfpkgm::artifact_download::usage + exit 1 + fi + + exec_curl GET /vnfpkgm/v1/vnf_packages/${pkg_id}/artifacts/${artifact_path} -o ${file} +} + +function vnfpkgm::list() { + case $1 in + -h | --help) + vnfpkgm::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnfpkgm/v1/vnf_packages +} + +function vnfpkgm::show() { + case $1 in + -h | --help) + vnfpkgm::show::usage + exit 0 + ;; + ${UUID}) + pkg_id="${1}" + shift + ;; + esac + + if [[ -z "${pkg_id}" ]]; then + vnfpkgm::show::usage + exit 1 + fi + + exec_curl GET /vnfpkgm/v1/vnf_packages/${pkg_id} +} + +function vnfpkgm::update() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpkgm::update::usage + exit 0 + ;; + ${UUID}) + pkg_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${pkg_id}" || -z "${param}" ]]; then + vnfpkgm::update::usage + exit 1 + fi + + exec_curl PATCH /vnfpkgm/v1/vnf_packages/${pkg_id} -d @"${param}" +} + +function vnfpkgm::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpkgm::delete::usage + exit 0 + ;; + ${UUID}) + pkg_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${pkg_ids}" ]]; then + vnfpkgm::delete::usage + exit 1 + fi + + for pkg_id in "${pkg_ids[@]}"; do + exec_curl DELETE /vnfpkgm/v1/vnf_packages/${pkg_id} + done +} + +function vnflcm() { + case $1 in + -h | --help) + vnflcm::usage + exit 0 + ;; + op) + shift + op "${@}" + exit 0 + ;; + subsc) + shift + subsc "${@}" + exit 0 + ;; + create) + shift + vnflcm::create "${@}" + exit 0 + ;; + instantiate) + shift + vnflcm::instantiate "${@}" + exit 0 + ;; + list) + shift + vnflcm::list "${@}" + exit 0 + ;; + show) + shift + vnflcm::show "${@}" + exit 0 + ;; + terminate) + shift + vnflcm::terminate "${@}" + exit 0 + ;; + delete) + shift + vnflcm::delete "${@}" + exit 0 + ;; + heal) + shift + vnflcm::heal "${@}" + exit 0 + ;; + update) + shift + vnflcm::update "${@}" + exit 0 + ;; + scale) + shift + vnflcm::scale "${@}" + exit 0 + ;; + change-ext-conn) + shift + vnflcm::change_ext_conn "${@}" + exit 0 + ;; + change-vnfpkg) + shift + vnflcm::change_vnfpkg "${@}" + exit 0 + ;; + versions) + shift + vnflcm::versions "${@}" + exit 0 + ;; + *) + vnflcm::usage + exit 1 + ;; + esac +} + +function vnflcm::create() { + case $1 in + -h | --help) + vnflcm::create::usage + exit 0 + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + + if [[ -z "${param}" ]]; then + vnflcm::create::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances -H "version: 2.0.0" -d @${param} +} + +function vnflcm::instantiate() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::instantiate::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::instantiate::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances/${inst_id}/instantiate -H "version: 2.0.0" -d @${param} +} + +function vnflcm::list() { + case $1 in + -h | --help) + vnflcm::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnflcm/v2/vnf_instances -H "version: 2.0.0" +} + +function vnflcm::show() { + case $1 in + -h | --help) + vnflcm::show::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + esac + + if [[ -z "${inst_id}" ]]; then + vnflcm::show::usage + exit 1 + fi + + exec_curl GET /vnflcm/v2/vnf_instances/${inst_id} -H "version: 2.0.0" +} + +function vnflcm::terminate() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::terminate::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::terminate::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances/${inst_id}/terminate -H "version: 2.0.0" -d @${param} +} + +function vnflcm::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::delete::usage + exit 0 + ;; + ${UUID}) + inst_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_ids}" ]]; then + vnflcm::delete::usage + exit 1 + fi + + for inst_id in "${inst_ids[@]}"; do + exec_curl DELETE /vnflcm/v2/vnf_instances/${inst_id} -H "version: 2.0.0" + done +} + +function vnflcm::heal() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::heal::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::heal::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances/${inst_id}/heal -H "version: 2.0.0" -d @${param} +} + +function vnflcm::update() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::update::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::update::usage + exit 1 + fi + + exec_curl PATCH /vnflcm/v2/vnf_instances/${inst_id} -H "version: 2.0.0" -d @${param} +} + +function vnflcm::scale() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::scale::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::scale::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances/${inst_id}/scale -H "version: 2.0.0" -d @${param} +} + +function vnflcm::change_ext_conn() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::change_ext_conn::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::change_ext_conn::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances/${inst_id}/change_ext_conn -H "version: 2.0.0" -d @${param} +} + +function vnflcm::change_vnfpkg() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnflcm::change_vnfpkg::usage + exit 0 + ;; + ${UUID}) + inst_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${inst_id}" || -z "${param}" ]]; then + vnflcm::change_vnfpkg::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_instances/${inst_id}/change_vnfpkg -H "version: 2.0.0" -d @${param} +} + +function vnflcm::versions() { + case $1 in + -h | --help) + vnflcm::versions::usage + exit 0 + ;; + esac + + exec_curl GET /vnflcm/v2/api_versions +} + +function op() { + case $1 in + -h | --help) + op::usage + exit 0 + ;; + rollback) + shift + op::rollback "${@}" + exit 0 + ;; + retry) + shift + op::retry "${@}" + exit 0 + ;; + fail) + shift + op::fail "${@}" + exit 0 + ;; + list) + shift + op::list "${@}" + exit 0 + ;; + show) + shift + op::show "${@}" + exit 0 + ;; + *) + op::usage + exit 1 + ;; + esac +} + +function op::rollback() { + case $1 in + -h | --help) + op::rollback::usage + exit 0 + ;; + ${UUID}) + opocc_id="${1}" + shift + ;; + esac + + if [[ -z "${opocc_id}" ]]; then + op::rollback::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_lcm_op_occs/${opocc_id}/rollback -H "version: 2.0.0" +} + +function op::retry() { + case $1 in + -h | --help) + op::retry::usage + exit 0 + ;; + ${UUID}) + opocc_id="${1}" + shift + ;; + esac + + if [[ -z "${opocc_id}" ]]; then + op::retry::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_lcm_op_occs/${opocc_id}/retry -H "version: 2.0.0" +} + +function op::fail() { + case $1 in + -h | --help) + op::fail::usage + exit 0 + ;; + ${UUID}) + opocc_id="${1}" + shift + ;; + esac + + if [[ -z "${opocc_id}" ]]; then + op::fail::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/vnf_lcm_op_occs/${opocc_id}/fail -H "version: 2.0.0" +} + +function op::list() { + case $1 in + -h | --help) + op::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnflcm/v2/vnf_lcm_op_occs -H "version: 2.0.0" +} + +function op::show() { + case $1 in + -h | --help) + op::show::usage + exit 0 + ;; + ${UUID}) + opocc_id="${1}" + shift + ;; + esac + + if [[ -z "${opocc_id}" ]]; then + op::show::usage + exit 1 + fi + + exec_curl GET /vnflcm/v2/vnf_lcm_op_occs/${opocc_id} -H "version: 2.0.0" +} + +function subsc() { + case $1 in + -h | --help) + subsc::usage + exit 0 + ;; + create) + shift + subsc::create "${@}" + exit 0 + ;; + list) + shift + subsc::list "${@}" + exit 0 + ;; + show) + shift + subsc::show "${@}" + exit 0 + ;; + delete) + shift + subsc::delete "${@}" + exit 0 + ;; + *) + subsc::usage + exit 1 + ;; + esac +} + +function subsc::create() { + case $1 in + -h | --help) + subsc::create::usage + exit 0 + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + + if [[ -z "${param}" ]]; then + subsc::create::usage + exit 1 + fi + + exec_curl POST /vnflcm/v2/subscriptions -H "version: 2.0.0" -d@${param} +} + +function subsc::list() { + case $1 in + -h | --help) + subsc::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnflcm/v2/subscriptions -H "version: 2.0.0" +} + +function subsc::show() { + case $1 in + -h | --help) + subsc::show::usage + exit 0 + ;; + ${UUID}) + subsc_id="${1}" + shift + ;; + esac + + if [[ -z "${subsc_id}" ]]; then + subsc::show::usage + exit 1 + fi + + exec_curl GET /vnflcm/v2/subscriptions/${subsc_id} -H "version: 2.0.0" +} + +function subsc::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + subsc::delete::usage + exit 0 + ;; + ${UUID}) + subsc_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${subsc_ids}" ]]; then + subsc::delete::usage + exit 1 + fi + + for subsc_id in "${subsc_ids[@]}"; do + exec_curl DELETE /vnflcm/v2/subscriptions/${subsc_id} -H "version: 2.0.0" + done +} + +function vnffm() { + case $1 in + -h | --help) + vnffm::usage + exit 0 + ;; + alarm) + shift + vnffm::alarm "${@}" + exit 0 + ;; + sub) + shift + vnffm::sub "${@}" + exit 0 + ;; + *) + vnffm::usage + exit 1 + ;; + esac +} + +function vnffm::alarm() { + case $1 in + -h | --help) + vnffm::alarm::usage + exit 0 + ;; + list) + shift + vnffm::alarm::list "${@}" + exit 0 + ;; + show) + shift + vnffm::alarm::show "${@}" + exit 0 + ;; + update) + shift + vnffm::alarm::update "${@}" + exit 0 + ;; + *) + vnffm::alarm::usage + exit 1 + ;; + esac +} + +function vnffm::alarm::list() { + case $1 in + -h | --help) + vnffm::alarm::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnffm/v1/alarms -H "version: 1.3.0" +} + +function vnffm::alarm::show() { + case $1 in + -h | --help) + vnffm::alarm::show::usage + exit 0 + ;; + ${UUID}) + alarm_id="${1}" + shift + ;; + esac + + if [[ -z "${alarm_id}" ]]; then + vnffm::alarm::show::usage + exit 1 + fi + + exec_curl GET /vnffm/v1/alarms/${alarm_id} -H "version: 1.3.0" +} + +function vnffm::alarm::update() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnffm::alarm::update::usage + exit 0 + ;; + ${UUID}) + alarm_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + done + + if [[ -z "${param}" ]]; then + vnffm::alarm::update::usage + exit 1 + fi + + exec_curl PATCH /vnffm/v1/alarms/${alarm_id} -H "version: 1.3.0" -d@${param} +} + +function vnffm::sub() { + case $1 in + -h | --help) + vnffm::sub::usage + exit 0 + ;; + create) + shift + vnffm::sub::create "${@}" + exit 0 + ;; + list) + shift + vnffm::sub::list "${@}" + exit 0 + ;; + show) + shift + vnffm::sub::show "${@}" + exit 0 + ;; + delete) + shift + vnffm::sub::delete "${@}" + exit 0 + ;; + *) + vnffm::sub::usage + exit 1 + ;; + esac +} + +function vnffm::sub::create() { + case $1 in + -h | --help) + vnffm::sub::create::usage + exit 0 + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + + if [[ -z "${param}" ]]; then + vnffm::sub::create::usage + exit 1 + fi + + exec_curl POST /vnffm/v1/subscriptions -H "version: 1.3.0" -d@${param} +} + +function vnffm::sub::list() { + case $1 in + -h | --help) + vnffm::sub::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnffm/v1/subscriptions -H "version: 1.3.0" +} + +function vnffm::sub::show() { + case $1 in + -h | --help) + vnffm::sub::show::usage + exit 0 + ;; + ${UUID}) + sub_id="${1}" + shift + ;; + esac + + if [[ -z "${sub_id}" ]]; then + vnffm::sub::show::usage + exit 1 + fi + + exec_curl GET /vnffm/v1/subscriptions/${sub_id} -H "version: 1.3.0" +} + +function vnffm::sub::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnffm::sub::delete::usage + exit 0 + ;; + ${UUID}) + sub_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${sub_ids}" ]]; then + vnffm::sub::delete::usage + exit 1 + fi + + for sub_id in "${sub_ids[@]}"; do + exec_curl DELETE /vnffm/v1/subscriptions/${sub_id} -H "version: 1.3.0" + done +} + +function vnfpm() { + case $1 in + -h | --help) + vnfpm::usage + exit 0 + ;; + job) + shift + vnfpm::job "${@}" + exit 0 + ;; + report-show) + shift + vnfpm::report_show "${@}" + exit 0 + ;; + threshold) + shift + vnfpm::threshold "${@}" + exit 0 + ;; + *) + vnfpm::usage + exit 1 + ;; + esac +} + +function vnfpm::job() { + case $1 in + -h | --help) + vnfpm::job::usage + exit 0 + ;; + create) + shift + vnfpm::job::create "${@}" + exit 0 + ;; + update) + shift + vnfpm::job::update "${@}" + exit 0 + ;; + list) + shift + vnfpm::job::list "${@}" + exit 0 + ;; + show) + shift + vnfpm::job::show "${@}" + exit 0 + ;; + delete) + shift + vnfpm::job::delete "${@}" + exit 0 + ;; + *) + vnfpm::job::usage + exit 1 + ;; + esac +} + +function vnfpm::job::create() { + case $1 in + -h | --help) + vnfpm::job::create::usage + exit 0 + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + + if [[ -z "${param}" ]]; then + vnfpm::job::create::usage + exit 1 + fi + + exec_curl POST /vnfpm/v2/pm_jobs -H "version: 2.1.0" -d@${param} +} + +function vnfpm::job::update() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpm::job::update::usage + exit 0 + ;; + ${UUID}) + job_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + done + + if [[ -z "${param}" || -z "${job_id}" ]]; then + vnfpm::job::update::usage + exit 1 + fi + + exec_curl PATCH /vnfpm/v2/pm_jobs/${job_id} -H "version: 2.1.0" -d@${param} +} + +function vnfpm::job::list() { + case $1 in + -h | --help) + vnfpm::job::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnfpm/v2/pm_jobs -H "version: 2.1.0" +} + +function vnfpm::job::show() { + case $1 in + -h | --help) + vnfpm::job::show::usage + exit 0 + ;; + ${UUID}) + job_id="${1}" + shift + ;; + esac + + if [[ -z "${job_id}" ]]; then + vnfpm::job::show::usage + exit 1 + fi + + exec_curl GET /vnfpm/v2/pm_jobs/${job_id} -H "version: 2.1.0" +} + +function vnfpm::job::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpm::job::delete::usage + exit 0 + ;; + ${UUID}) + job_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${job_ids}" ]]; then + vnfpm::job::delete::usage + exit 1 + fi + + for job_id in "${job_ids[@]}"; do + exec_curl DELETE /vnfpm/v2/pm_jobs/${job_id} -H "version: 2.1.0" + done +} + +function vnfpm::report_show() { + case $1 in + -h | --help) + vnfpm::report_show::usage + exit 0 + ;; + ${UUID}) + job_id="${1}" + shift + ;; + esac + + case $1 in + -h | --help) + vnfpm::report_show::usage + exit 0 + ;; + ${UUID}) + report_id="${1}" + shift + ;; + esac + + if [[ -z "${job_id}" || -z "${report_id}" ]]; then + vnfpm::report_show::usage + exit 1 + fi + + exec_curl GET /vnfpm/v2/pm_jobs/${job_id}/reports/${report_id} -H "version: 2.1.0" +} + +function vnfpm::threshold() { + case $1 in + -h | --help) + vnfpm::threshold::usage + exit 0 + ;; + create) + shift + vnfpm::threshold::create "${@}" + exit 0 + ;; + update) + shift + vnfpm::threshold::update "${@}" + exit 0 + ;; + list) + shift + vnfpm::threshold::list "${@}" + exit 0 + ;; + show) + shift + vnfpm::threshold::show "${@}" + exit 0 + ;; + delete) + shift + vnfpm::threshold::delete "${@}" + exit 0 + ;; + *) + vnfpm::threshold::usage + exit 1 + ;; + esac +} + +function vnfpm::threshold::create() { + case $1 in + -h | --help) + vnfpm::threshold::create::usage + exit 0 + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + + if [[ -z "${param}" ]]; then + vnfpm::threshold::create::usage + exit 1 + fi + + exec_curl POST /vnfpm/v2/thresholds -H "version: 2.1.0" -d@${param} +} + +function vnfpm::threshold::update() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpm::threshold::update::usage + exit 0 + ;; + ${UUID}) + thr_id="${1}" + shift + ;; + --param-file) + param="${2}" + shift + shift + ;; + esac + done + + if [[ -z "${param}" || -z ${thr_id} ]]; then + vnfpm::threshold::update::usage + exit 1 + fi + + exec_curl PATCH /vnfpm/v2/thresholds/${thr_id} -H "version: 2.1.0" -d@${param} +} + +function vnfpm::threshold::list() { + case $1 in + -h | --help) + vnfpm::threshold::list::usage + exit 0 + ;; + esac + + exec_curl GET /vnfpm/v2/thresholds -H "version: 2.1.0" +} + +function vnfpm::threshold::show() { + case $1 in + -h | --help) + vnfpm::threshold::show::usage + exit 0 + ;; + ${UUID}) + thr_id="${1}" + shift + ;; + esac + + if [[ -z "${thr_id}" ]]; then + vnfpm::threshold::show::usage + exit 1 + fi + + exec_curl GET /vnfpm/v2/thresholds/${thr_id} -H "version: 2.1.0" +} + +function vnfpm::threshold::delete() { + while [[ $# -gt 0 ]]; do + case $1 in + -h | --help) + vnfpm::threshold::delete::usage + exit 0 + ;; + ${UUID}) + thr_ids+=("${1}") + shift + ;; + *) + break + ;; + esac + done + + if [[ -z "${thr_ids}" ]]; then + vnfpm::threshold::delete::usage + exit 1 + fi + + for thr_id in "${thr_ids[@]}"; do + exec_curl DELETE /vnfpm/v2/thresholds/${thr_id} -H "version: 2.1.0" + done +} + +function authenticate::create_client_assertion() { + # Usage: authenticate::create_client_assertion [secret|key] + + key_type="${1}" + + # Set create (iat) and expire (exp) times + create_time=$(date +%s) + expire_time=$((create_time + 300)) # Current time + 5 minutes (300 seconds) + + # Generate UUID for jti claim + jti=$(generate_uuid) + + # Create JWT header + if [ "${key_type}" = "secret" ]; then + header='{"alg":"HS256","typ":"JWT"}' + else + header='{"alg":"RS256","typ":"JWT"}' + fi + header_b64=$(base64url_encode "${header}") + + # Create JWT payload + payload='{ + "iss": "'${TACKER_CLIENT_ID}'", + "sub": "'${TACKER_CLIENT_ID}'", + "aud": "'${TACKER_AUTH_URL}'", + "iat": "'${create_time}'", + "exp": "'${expire_time}'", + "jti": "'${jti}'" + }' + payload_b64=$(base64url_encode "${payload}") + # Combine header and payload + unsigned_token="${header_b64}.${payload_b64}" + # Sign the token + if [ "${key_type}" = "secret" ]; then + # Sign with secret key (HS256) + hexsecret=$(echo -n "${TACKER_CLIENT_SECRET}" | + xxd -p | + paste -sd "") + signature=$(echo -n "${unsigned_token}" | + openssl dgst -sha256 -mac HMAC -macopt hexkey:"${hexsecret}" -binary | + base64 | + tr '/+' '_-' | + tr -d '=') + else + # Sign with private key (RS256) + signature=$(echo -n "${unsigned_token}" | + openssl dgst -sha256 -sign "${TACKER_JWT_KEY}" | + base64 | + tr '/+' '_-' | + tr -d '=') + fi + # Create the complete JWT + jwt="${unsigned_token}.${signature}" + echo "${jwt}" +} + +function authenticate::client_secret_basic() { + TACKER_ACCESS_TOKEN=$(curl -s -X POST "${TACKER_AUTH_URL}" -u "${TACKER_CLIENT_ID}:${TACKER_CLIENT_SECRET}" -d "grant_type=client_credentials" -d "scope=${TACKER_OAUTH2_SCOPE}" "${@}" | jq -r ".access_token") + export TACKER_ACCESS_TOKEN +} + +function authenticate::client_secret_post() { + TACKER_ACCESS_TOKEN=$(curl -s -X POST "${TACKER_AUTH_URL}" -d "client_id=${TACKER_CLIENT_ID}" -d "client_secret=${TACKER_CLIENT_SECRET}" -d "grant_type=client_credentials" -d "scope=${TACKER_OAUTH2_SCOPE}" "${@}" | jq -r ".access_token") + export TACKER_ACCESS_TOKEN +} + +function authenticate::private_key_jwt() { + assertion=$(authenticate::create_client_assertion "key") + TACKER_ACCESS_TOKEN=$(curl -s -X POST "${TACKER_AUTH_URL}" -d "client_id=${TACKER_CLIENT_ID}" -d "grant_type=client_credentials" -d "scope=${TACKER_OAUTH2_SCOPE}" -d "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" -d "client_assertion=${assertion}" "${@}" | jq -r ".access_token") + export TACKER_ACCESS_TOKEN +} + +function authenticate::client_secret_jwt() { + assertion=$(authenticate::create_client_assertion "secret") + TACKER_ACCESS_TOKEN=$(curl -s -X POST "${TACKER_AUTH_URL}" -d "client_id=${TACKER_CLIENT_ID}" -d "grant_type=client_credentials" -d "scope=${TACKER_OAUTH2_SCOPE}" -d "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" -d "client_assertion=${assertion}" "${@}" | jq -r ".access_token") + export TACKER_ACCESS_TOKEN +} + +function authenticate::tls_client_auth() { + TACKER_ACCESS_TOKEN=$(curl -s -X POST "${TACKER_AUTH_URL}" -d "client_id=${TACKER_CLIENT_ID}" -d "grant_type=client_credentials" -d "scope=${TACKER_OAUTH2_SCOPE}" "${@}" | jq -r ".access_token") + export TACKER_ACCESS_TOKEN +} + +function authenticate() { + case ${TACKER_AUTH_TYPE} in + client_secret_basic) + authenticate::client_secret_basic "${@}" + return + ;; + client_secret_post) + authenticate::client_secret_post "${@}" + return + ;; + private_key_jwt) + authenticate::private_key_jwt "${@}" + return + ;; + client_secret_jwt) + authenticate::client_secret_jwt "${@}" + return + ;; + tls_client_auth) + authenticate::tls_client_auth "${@}" + return + ;; + *) + echo "Unknown auth type: ${TACKER_AUTH_TYPE}" + exit 1 + ;; + esac +} + +function exec_curl::setup_mtls() { + if [[ "${TACKER_CACERT:+defined}" ]]; then + set -- "${@}" --cacert "${TACKER_CACERT}" + fi + if [[ "${TACKER_CLIENT_KEY:+defined}" && "${TACKER_CLIENT_CERT:+defined}" ]]; then + set -- "${@}" --key "${TACKER_CLIENT_KEY}" --cert "${TACKER_CLIENT_CERT}" + fi + echo "${@}" +} + +function generate_uuid() { + if command -v uuidgen >/dev/null; then + uuidgen + else + cat /proc/sys/kernel/random/uuid + fi +} + +function base64url_encode() { + echo -n "$1" | base64 -w 0 | tr '/+' '_-' | tr -d '=' +} + +function exec_curl() { + # Usage: exec_curl [] [ ...] + + # set HTTP method if specified + if [[ ${1} == ${HTTP_METHOD} ]]; then + method="${1}" + shift + fi + + # set path in URL + if [[ ${1} == /* ]]; then + path="${1}" + shift + else + echo "invalid path: ${1}" + exit 1 + fi + + # set opts to use certs if tls_client_auth is selected + mtls_args=$(exec_curl::setup_mtls) + + # get OAuth2.0 token to call Tacker API + authenticate ${mtls_args} + set -- "${@}" -H "Authorization: Bearer ${TACKER_ACCESS_TOKEN}" + + # set default content-type if not set + if ! echo "${@}" | grep -q "Content-Type:"; then + set -- "${@}" -H "Content-Type: application/json" + fi + + curl -X ${method:-GET} ${TACKER_URL}/${path} "${@}" ${mtls_args:+$mtls_args} +} + +function main() { + case $1 in + -h | --help) + usage | less -F + exit 0 + ;; + -v | --version) + echo "${VERSION}" + exit 0 + ;; + vim) + shift + vim "${@}" + exit 0 + ;; + vnfpkgm) + shift + vnfpkgm "${@}" + exit 0 + ;; + vnflcm) + shift + vnflcm "${@}" + exit 0 + ;; + vnffm) + shift + vnffm "${@}" + exit 0 + ;; + vnfpm) + shift + vnfpm "${@}" + exit 0 + ;; + *) + usage | less -F + exit 1 + ;; + esac +} + +main "${@}"