We are tickled pink to announce the release of: tacker 7.0.0: OpenStack NFV Orchestration This release is part of the yoga release series. The source is available from: https://opendev.org/openstack/tacker Download the package from: https://tarballs.openstack.org/tacker/ Please report issues through: https://bugs.launchpad.net/tacker/+bugs For more details, please see below. 7.0.0 ^^^^^ New Features ************ * Add a Sample Ansible Driver as an option for users who want to use ansible for configuration of VNFs. This Ansible Driver supports the key LCMs such as instantiate_end, scale_start, scale_end, heal_end and terminate_start. A Sample VNF package which contains sample usage of Ansible Driver is provided. User manual is also provided to explain the steps in preparing the environment to use Ansible Driver. * Add Change Current VNF Package API based on ETSI NFV specifications. Tacker supports a VNF upgrade using this API. Currently, it only supports "RollingUpdate" out of several methods for a VNF upgrade. * Support Container based VNF operation with the following new version of RESTful APIs based on ETSI NFV specifications. Version "2.0.0" API of Instantiate VNF, Terminate VNF, and Change Current VNF Package support Kubernetes vim. Other APIs besides Scale VNF and Heal VNF, such as Create VNF, Delete VNF, List VNF, Show VNF, and so on have already supported Kubernetes vim because they use common processing that does not depend on vim type: OpenStack, Kubernetes. Version "2.0.0" API of Scale VNF and Heal VNF with Kubernetes vim will be supported in future. * Support ETSI NFV compliant automated testing by using the Robot Framework and ETSI NFV-TST API test codes. This feature uses the Robot Framework which utilizes the ETSI NFV-TST API test codes to test tacker for ETSI NFV compliance in a Black Box testing level. This is an additional quality test measure to ensure that the added tacker features comply to the ETSI NFV standards. Known Issues ************ * Regarding Sample Ansible Driver, currently, deployment flavors share only one config.yaml due to a limitation in Management Driver. * Regarding ETSI NFV compliant automated testing, some of the tests are failing due to bugs (1) Tacker Bug and (2) Issues in the ETSI NFV-TST API test codes. (1) Tacker Bug such as Bug-#1945387 was detected in this compliance test and the corresponding test is currently failing. Test will pass once the bug is fixed. (2) Issues in the ETSI NFV-TST API test codes such as schema and mock server location issues also caused some tests to fail. Tests will pass once the issues are resolved. Due to these existing failed items, this test is currently non-voting. Changes in tacker 6.0.0.0rc1..7.0.0 ----------------------------------- c572cfd1 Fix failure of testing privsep 1e21443e Apply Robot Framework for testing d0bbad7e Support Basic Lifecycle Operations of CNF v2 API 787ea794 Support ChangeCurrentVNFPackage for VNF of v2 API 903d6aee Add a Sample VNF Package for Ansible Driver bb63e5f1 Add a Sample Ansible Driver 8b7deecb Add missed parameters in auto-generated config f8a9c86b Test to create VNF instance with 'VNF' name d80e3467 Setup multi tenants for multi-tenant job only 26781fb8 Add a VNF package sample for practical use cases 2943be9e Update doc of Helm chart for Kubernetes VIM f37fe6f6 FT of multi tenants for CNF 6ec61064 Add documents for enhance operations in V2 ea92f6e6 Move Sample Kubernetes Driver Directory cce982ab Update TOX_CONSTRAINTS_FILE for stable/yoga 4a44d345 Update .gitreview for stable/yoga 56b81d62 Add constants and parameters for MgmtDriver a039fa32 FT for multi tenant policy in LCM 9c9a31e4 Introduce vagrant for devstack 1cb068c7 Remove singleton class in FakeServerManager class d219c49e Support CNF update with MgmtDriver 16c69803 Fix grant usage in scaling out 81dca798 Support handling large query results by ETSI NFV 21410608 FT of heal/chg_ext_conn v2 APIs 3635aa14 FT of scale/modify v2 APIs 676b0bff Fix links of v2 API resources 55a16877 FT of instantiate/scale's ErrorHandling 98f7150f Fix the definition of associated_vnfc_cp_id 131d222d Add specific tenant to vnf resources 31819356 Heal and scale method support of lcm_user_data d31be66f Fix subprocess usage 3d6d849f Migrate rootwrap to privsep f62b87a5 Update release notes of multi tenant policy in LCM 5dcdfa6b Do not set ineffective [alarm_auth] url 15358675 Refactor Fake Grant for Simulate NFVO 4be81964 Fix duplicate entry error in VNF Package upload 8412af6d Fix for subscription with OAuth 2.0 authorization cba456af Fix usageState of VNF package update f1fbcbb9 Fix tacker gate job failure in Y release bd3096bd Clean up at conductor start up d4233537 Support specifying namespace for deploying CNF 4f565a40 Refactor v1 conductor a0158edd Increase stack_retries of k8s FT in Zuul 08c234bd support heal VNF task of v2 API 6398fb74 Fix time consuming tests 83e4a8d5 support change_ext_conn v2 API 7e36af6c Change to use Helm cli during scale with helm 382afbab Fix retry operation after LCM failure 8a31f586 Add doc of CIR/PV/kubespray 45ac7ec7 Refactor v1 vnflcm_driver d07957a4 Correct VIM_ID is showed in "openstack vnf show" 45122003 Add release notes for multi-tenant policy in LCM 75778a2d Suppress Warnings for SQL Alchemy 445a9458 Replace line break from CRLF to LF 7d659b18 Help usage message of heal cli modified 7b45bd19 Refactor constants in conductor 724e679e FT Setup to test multi-tenant policy in LCM d40de6c7 Fix LCM failure ef5a7d2b Fix error of missing body 73c00dfa Refactor FT of sol job 8fade412 Change test utils to use absolute path 7aff8262 support modify VNF instance of v2 API 3443bf62 Allow VNF instantiation by VIM of the same tenant 7d9789ca Fix wrong exception name usage 30c13cdb Tiny refactoring for controller 41d7f5ce Add specifying tenant in notification 141a1f46 Refactor vnfm_db dec7bcc7 Make dirs_exists_ok of copytree not used 158f05e4 Handle invalid attrName in v2 API AttributeFilter b9981e5a Add free5GC VNF samples 1948ec59 Add free5GC CNF samples 9a489d32 Add free5GC CNF on VM samples 4fa1445d Software image path miss in uploading VNF package f9547f5e Resolve TODOs in v2 API attribute selector/filter 55040a0e support scale VNF task of v2 API a69f2f3f Add documents for error handling operations in V2 ccb0dd3d Fix filter data creation 35aaba1a Refactor FT of sol-kubernetes job 15ea1511 Add VIM config generator ff2e8da4 Revise FT of V2-API b2b9e243 Fix some bugs related Kubernetes MgmtDriver 94dbcea9 support fail operation task of v2 API d3b8083d CI: Extend timeout for CNF entire heal in Helm FT 88112654 [Centos Stream8]Devstack install with kubernetes 4b5204b2 support rollback operation task of v2 API fee4d127 Use LOG.warning instead of deprecated LOG.warn 84224f71 Update python testing classifier 4f25101c Update Pylint config file for development 3b699da0 fix grant request of terminate fff6cec4 Fix VIM registration error bf51c2bc support retry operation task of v2 API e2fa03fb Set default namespace when caling k8s scale API 777c2f06 CI: Use python-aodhclient from git repo in Zuul FT dc85dc25 Add fenix in k8s local.conf example 8029f4e1 fix contents of grant request bb7d75da Revert "Skip some FTs failed due to heat bug" 79ad3ec7 Add doc of Helm chart for Kubernetes VIM 975cce62 CI: Create admin endpoint for keystone 6cab16be Exclude db/types.py from sphinx-apidoc target 8c69dda5 drop anyjson requirement 36ef500c Add Location to responses of Create VNF Package 2d9521b2 Fix scaling during the heat cooldown 9c7308ec Update version of doc8 to 0.9.0 db9b91ae Fix create duplicated subscriptions 14e7fb56 Add Python3 yoga unit tests 0e231710 Update master for stable/xena 6929cbc3 Support PVs for k8s cluster with MgmtDriver 34aec336 Update instructions of installing k8s VIM 26910f1c Private registry for deploying Kubernetes cluster 9e9741b1 Add groups under topology_template in vnf_dict 2bd3d567 Sample script for healing k8s with kubespray c1851140 Sample script for scaling k8s with kubespray b3bf4ec2 Sample script for deploying k8s with kubespray f7796901 Sample script of pod-affinity in kubernetes cluster f24afcf7 Add documents for multi-version API support 9e13a55a Modify processing of _heal_grant and _scale_grant 5f35b695 Multi version API support 49ab5f9a Object definitions of multi version API support 3145e3cc Fix zuul settings to use latest kuryr-kubernetes 08ae05a2 Support Helm chart as interface for Kubernetes VIM c7d75a3c Modify Placement Processing to Aspect definition 1ce0d934 Fix for Anti Affinity verification Exception 110bba1c Fix occasional multinode-sol job FT error 7add0372 Fix status code for invalid filter conditions 055defd7 Add missing [oslo_reports] options 149d67c6 Fix cnf rollback after instantiation failure 4cdd2fbc Add missing options about periodic tasks d7a13ce1 Update zuul environment to support helm chart 3bb8791f Fix get information about multiple VNF instances a49b4457 Support TOSCA route for ChgExternalConnectivity 533b6074 Modify Network Resource Information used by FT Diffstat (except docs and test files) ------------------------------------- .gitreview | 1 + .pylintrc | 20 +- .zuul.yaml | 96 +- HACKING.rst | 1 + api-ref/source/index.rst | 17 +- api-ref/source/v1/{index.rst => legacy.rst} | 8 +- api-ref/source/v1/parameters_vnflcm.yaml | 2 +- api-ref/source/v1/parameters_vnflcm_versions.yaml | 44 + .../vnf_packages/vnf-packages-create-request.json | 10 +- .../vnf_packages/vnf-packages-create-response.json | 40 +- .../vnf_packages/vnf-packages-list-response.json | 138 +- .../vnf_packages/vnf-packages-patch-request.json | 12 +- .../vnf_packages/vnf-packages-patch-response.json | 10 +- .../vnf_packages/vnf-packages-show-response.json | 130 +- .../samples/vnflcm/list-subscription-response.json | 70 +- .../list-vnflcm-version-response.json | 13 + .../show-vnflcm-version-response.json | 9 + api-ref/source/v1/status.yaml | 2 +- api-ref/source/v1/vnflcm.rst | 9 + api-ref/source/v1/vnflcm_versions.inc | 97 + api-ref/source/v1/vnflcm_versions.rst | 9 + api-ref/source/v1/vnfpkgm.rst | 9 + api-ref/source/v2/parameters_vnflcm.yaml | 1695 +++++++++++ .../v2/samples/vnflcm/change-ext-conn-request.json | 195 ++ .../vnflcm/create-subscription-request.json | 3 + .../vnflcm/create-subscription-response.json | 10 + .../vnflcm/create-vnf-instance-request.json | 5 + .../vnflcm/create-vnf-instance-response.json | 22 + .../fail-vnflcm-operation-occurrence-response.json | 248 ++ .../samples/vnflcm/heal-vnf-instance-request.json | 7 + .../vnflcm/instantiate-vnf-instance-request.json | 128 + .../samples/vnflcm/list-subscription-response.json | 12 + .../samples/vnflcm/list-vnf-instance-response.json | 482 +++ .../list-vnflcm-operation-occurrence-response.json | 406 +++ .../samples/vnflcm/scale-vnf-instance-request.json | 8 + .../samples/vnflcm/show-subscription-response.json | 10 + .../samples/vnflcm/show-vnf-instance-response.json | 480 +++ .../show-vnflcm-operation-occurrence-response.json | 243 ++ .../vnflcm/terminate-vnf-instance-request.json | 4 + .../vnflcm/update-vnf-instance-request.json | 48 + api-ref/source/v2/status.yaml | 88 + api-ref/source/v2/vnflcm.inc | 1472 +++++++++ api-ref/source/v2/vnflcm.rst | 9 + devstack/lib/tacker | 21 +- devstack/local.conf.kubernetes | 3 + devstack/plugin.sh | 1 + .../mgmt_driver_deploy_k8s_and_cnf_with_helm.rst | 582 ++++ .../mgmt_driver_deploy_k8s_cir_usage_guide.rst | 725 +++++ ...gmt_driver_deploy_k8s_kubespary_usage_guide.rst | 1680 +++++++++++ .../user/mgmt_driver_deploy_k8s_pv_usage_guide.rst | 678 +++++ .../user/mgmt_driver_deploy_k8s_usage_guide.rst | 765 ++++- .../mgmt_driver_for_ansible_driver_usage_guide.rst | 640 ++++ .../user/practical_sample_package_usage_guide.rst | 1196 ++++++++ etc/config-generator.conf | 42 +- etc/tacker/api-paste.ini | 18 + etc/tacker/rootwrap.d/tacker.filters | 4 + lower-constraints.txt | 10 +- playbooks/devstack/pre.yaml | 4 + ...multi-version-api-support-0653df1edb67162e.yaml | 24 + ...add-sample-ansible-driver-f204be6350c8a546.yaml | 13 + .../add-v2-change-vnfpkg-api-7f993cf283a53aab.yaml | 8 + ...dd-v2-change_ext_conn-api-1fe3ca0e889eea93.yaml | 6 + .../notes/add-v2-cnf-api-a938c17b5c57fb67.yaml | 12 + .../notes/add-v2-fail-api-b35b605f262210b2.yaml | 5 + .../notes/add-v2-heal-api-1ffd18dea3904966.yaml | 5 + .../notes/add-v2-modify-api-cf7bce9e9d5bca31.yaml | 5 + .../notes/add-v2-retry-api-34667d944db1f54c.yaml | 5 + .../add-v2-rollback-api-1b53e7b9c89d5281.yaml | 5 + .../notes/add-v2-scale-api-b60e8fe329f6038b.yaml | 5 + ...bot-framework-for-testing-d04256887fd9bee7.yaml | 21 + ...er_data_during-heal-scale-5e71bf572e86bbfc.yaml | 6 + .../support-cir-k8s-cluster-d2596de8fed78f6c.yaml | 27 + ...support-helmchart-k8s-vim-3604f0070cca6b63.yaml | 10 + ...mchart-scale-with-helmcli-4595b262801b24a7.yaml | 9 + ...-k8s-mgmtdriver-kubespray-b0ecbaaefb755b11.yaml | 24 + .../support-k8s-namespace-9e861c87e4aa1aaa.yaml | 7 + ...pport-multi-tenant-in-lcm-87c5d017c37c916f.yaml | 13 + ...pport-paging-query-result-9267729be1456b0d.yaml | 13 + .../support-pv-k8s-cluster-2893a5619ea9e91c.yaml | 12 + ...dify-for-container-update-3e73c53352558dec.yaml | 9 + releasenotes/source/index.rst | 1 + releasenotes/source/xena.rst | 6 + requirements.txt | 6 +- .../files}/create_admin_token.yaml | 0 roles/setup-default-vim/tasks/main.yaml | 91 + roles/setup-helm/defaults/main.yaml | 4 + roles/setup-helm/files/50_helm_sh | 1 + roles/setup-helm/tasks/main.yaml | 106 + roles/setup-multi-tenant-vim/defaults/main.yaml | 21 + roles/setup-multi-tenant-vim/tasks/main.yaml | 216 ++ .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1465 +++++++++ .../Definitions/free5gc_df_simple.yaml | 200 ++ .../Definitions/free5gc_top.vnfd.yaml | 27 + .../Definitions/free5gc_types.yaml | 65 + .../Files/kubernetes/free5gc-amf.yaml | 93 + .../Files/kubernetes/free5gc-ausf.yaml | 65 + .../Files/kubernetes/free5gc-configmap.yaml | 785 +++++ .../Files/kubernetes/free5gc-mongodb.yaml | 64 + .../Files/kubernetes/free5gc-nrf.yaml | 65 + .../Files/kubernetes/free5gc-nssf.yaml | 65 + .../Files/kubernetes/free5gc-pcf.yaml | 65 + .../Files/kubernetes/free5gc-smf.yaml | 66 + .../Files/kubernetes/free5gc-udm.yaml | 65 + .../Files/kubernetes/free5gc-udr.yaml | 65 + .../Files/kubernetes/free5gc-upf.yaml | 105 + .../Files/kubernetes/free5gc-webui.yaml | 84 + .../Files/kubernetes/unix-daemonset.yaml | 48 + .../Scripts/free5gc_mgmt_cnf.py | 785 +++++ .../TOSCA-Metadata/TOSCA.meta | 74 + .../cnf/sample_free5gc_cnf_package/inst_param.yaml | 32 + .../BaseHOT/simple/base_hot_top.yaml | 54 + .../simple/nested/base_hot_nested_master.yaml | 26 + .../simple/nested/base_hot_nested_worker.yaml | 53 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1465 +++++++++ .../sample_free5gc_cnf_on_vm_df_simple.yaml | 236 ++ .../sample_free5gc_cnf_on_vm_top.vnfd.yaml | 31 + .../sample_free5gc_cnf_on_vm_types.yaml | 63 + .../Scripts/install_k8s_cluster.sh | 827 +++++ .../Scripts/kubernetes_mgmt_free5gc.py} | 320 +- .../TOSCA-Metadata/TOSCA.meta | 14 + .../UserData/__init__.py | 0 .../UserData/k8s_cluster_user_data.py | 0 .../simple_kubernetes_param_file.json | 82 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1465 +++++++++ .../Definitions/free5gc_df_simple.yaml | 200 ++ .../Definitions/free5gc_top.vnfd.yaml | 27 + .../Definitions/free5gc_types.yaml | 65 + .../Files/kubernetes/free5gc-amf.yaml | 93 + .../Files/kubernetes/free5gc-ausf.yaml | 65 + .../Files/kubernetes/free5gc-configmap.yaml | 785 +++++ .../Files/kubernetes/free5gc-mongodb.yaml | 64 + .../Files/kubernetes/free5gc-nrf.yaml | 65 + .../Files/kubernetes/free5gc-nssf.yaml | 65 + .../Files/kubernetes/free5gc-pcf.yaml | 65 + .../Files/kubernetes/free5gc-smf.yaml | 66 + .../Files/kubernetes/free5gc-udm.yaml | 65 + .../Files/kubernetes/free5gc-udr.yaml | 65 + .../Files/kubernetes/free5gc-upf.yaml | 105 + .../Files/kubernetes/free5gc-webui.yaml | 84 + .../Files/kubernetes/unix-daemonset.yaml | 48 + .../Scripts/free5gc_mgmt_cnf.py | 785 +++++ .../TOSCA-Metadata/TOSCA.meta | 74 + .../sample_free5gc_cnf_package/inst_param.yaml | 32 + .../BaseHOT/simple/base_hot_top.yaml | 44 + .../simple/nested/base_hot_nested_free5gc.yaml | 47 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 282 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1560 ++++++++++ .../Definitions/sample_free5gc_df_simple.yaml | 179 ++ .../Definitions/sample_free5gc_top.vnfd.yaml | 31 + .../Definitions/sample_free5gc_types.yaml | 63 + .../Scripts/free5gc_mgmt.py | 722 +++++ .../Scripts/modify_config.sh | 123 + .../TOSCA-Metadata/TOSCA.meta | 14 + .../UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 35 + .../sample_free5gc_body_scope_nfvi_node.json | 41 + .../BaseHOT/simple/base_hot_top.yaml | 54 + .../simple/nested/base_hot_nested_free5gc.yaml | 43 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 282 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1560 ++++++++++ .../Definitions/sample_free5gc_df_simple.yaml | 221 ++ .../Definitions/sample_free5gc_top.vnfd.yaml | 31 + .../Definitions/sample_free5gc_types.yaml | 63 + .../Scripts/free5gc_mgmt.py | 722 +++++ .../Scripts/modify_config.sh | 123 + .../TOSCA-Metadata/TOSCA.meta | 14 + .../UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 35 + .../BaseHOT/simple/base_hot_top.yaml | 54 + .../simple/nested/base_hot_nested_free5gc.yaml | 43 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 282 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1560 ++++++++++ .../Definitions/sample_free5gc_df_simple.yaml | 226 ++ .../Definitions/sample_free5gc_top.vnfd.yaml | 31 + .../Definitions/sample_free5gc_types.yaml | 63 + .../Scripts/free5gc_mgmt.py | 722 +++++ .../Scripts/modify_config.sh | 123 + .../TOSCA-Metadata/TOSCA.meta | 14 + .../UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 35 + .../sample_free5gc_body_scope_zone.json | 50 + .../BaseHOT/simple/base_hot_top.yaml | 41 + .../simple/nested/base_hot_nested_free5gc.yaml | 50 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 282 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1560 ++++++++++ .../Definitions/sample_free5gc_df_simple.yaml | 177 ++ .../Definitions/sample_free5gc_top.vnfd.yaml | 31 + .../Definitions/sample_free5gc_types.yaml | 63 + .../vnf/change_ext_conn/Scripts/free5gc_mgmt.py | 901 ++++++ .../vnf/change_ext_conn/Scripts/modify_config.sh | 123 + .../vnf/change_ext_conn/TOSCA-Metadata/TOSCA.meta | 14 + .../vnf/change_ext_conn/UserData/__init__.py | 0 .../vnf/change_ext_conn/UserData/lcm_user_data.py | 35 + .../changeExtVnfConnectivityRequest.json | 41 + .../vnf/change_ext_conn/instantiateVnfRequest.json | 52 + .../BaseHOT/simple/base_hot_top.yaml | 39 + .../simple/nested/base_hot_nested_free5gc.yaml | 43 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 282 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1560 ++++++++++ .../Definitions/sample_free5gc_df_simple.yaml | 173 ++ .../Definitions/sample_free5gc_top.vnfd.yaml | 31 + .../Definitions/sample_free5gc_types.yaml | 63 + .../Scripts/free5gc_mgmt.py | 722 +++++ .../Scripts/modify_config.sh | 123 + .../TOSCA-Metadata/TOSCA.meta | 14 + .../UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 35 + .../sample_free5gc_body.json | 41 + samples/mgmt_driver/ansible/__init__.py | 0 samples/mgmt_driver/ansible/ansible.py | 144 + .../mgmt_driver/ansible/ansible_config_parser.py | 468 +++ .../ansible/ansible_config_parser_cfg.py | 40 + samples/mgmt_driver/ansible/ansible_driver.py | 290 ++ .../BaseHOT/default/VNF-hot.yaml | 50 + .../BaseHOT/default/nested/VDU1.yaml | 45 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1465 +++++++++ .../Definitions/helloworld3_df_default.yaml | 225 ++ .../Definitions/helloworld3_top.vnfd.yaml | 28 + .../Definitions/helloworld3_types.yaml | 47 + .../ansible_vnf_package/ScriptANSIBLE/config.yaml | 39 + .../Scripts/Media/sample_start.yaml | 13 + .../ansible_vnf_package/TOSCA-Metadata/TOSCA.meta | 7 + .../ansible_vnf_package/UserData/__init__.py | 0 .../ansible_vnf_package/UserData/lcm_user_data.py | 35 + .../mgmt_driver/ansible/config_actions/__init__.py | 0 .../ansible/config_actions/abstract_config.py | 4 + .../config_actions/vm_app_config/__init__.py | 0 .../vm_app_config/ansible_playbook_exec.py | 160 + .../config_actions/vm_app_config/config_walker.py | 45 + .../config_actions/vm_app_config/executor.py | 361 +++ .../config_actions/vm_app_config/vm_app_config.py | 143 + samples/mgmt_driver/ansible/config_validator.py | 60 + .../mgmt_driver/ansible/config_validator_schema.py | 135 + samples/mgmt_driver/ansible/event_handler.py | 25 + samples/mgmt_driver/ansible/exceptions.py | 144 + samples/mgmt_driver/ansible/heat_client.py | 56 + samples/mgmt_driver/ansible/utils.py | 47 + .../container_update/container_update_mgmt.py | 399 +++ .../mgmt_driver/kubernetes/create_admin_token.yaml | 23 + samples/mgmt_driver/kubernetes/install_helm.sh | 49 + .../{ => kubernetes}/install_k8s_cluster.sh | 15 +- samples/mgmt_driver/kubernetes/kubernetes_mgmt.py | 3142 +++++++++++++++++++ .../BaseHOT/complex/complex_hot_top.yaml | 14 +- .../complex/nested/complex_nested_master.yaml | 0 .../complex/nested/complex_nested_worker.yaml | 0 .../nested/podaffinity_nested_master.yaml | 34 + .../nested/podaffinity_nested_worker.yaml | 30 + .../BaseHOT/podaffinity/podaffinity_hot_top.yaml | 95 + .../simple/nested/simple_nested_master.yaml | 0 .../simple/nested/simple_nested_worker.yaml | 0 .../BaseHOT/simple/simple_hot_top.yaml | 14 +- .../Definitions/sample_kubernetes_df_complex.yaml | 0 .../sample_kubernetes_df_podaffinity.yaml | 254 ++ .../Definitions/sample_kubernetes_df_simple.yaml | 0 .../Definitions/sample_kubernetes_top.vnfd.yaml | 33 + .../Definitions/sample_kubernetes_types.yaml | 63 + .../TOSCA-Metadata/TOSCA.meta | 9 +- .../kubernetes_vnf_package/UserData/__init__.py | 0 .../UserData/k8s_cluster_user_data.py | 35 + .../cnf_nodeport_setting/cnf_nodeport_mgmt.py | 363 +++ .../Definitions/helloworld3_df_simple.yaml | 124 + .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../Definitions/helloworld3_types.yaml | 53 + .../Files/kubernetes/deployment.yaml | 28 + .../Files/kubernetes/service_with_nodeport.yaml | 16 + .../Files/kubernetes/service_without_nodeport.yaml | 11 + .../TOSCA-Metadata/TOSCA.meta | 29 + .../kubespray/cnf_nodeport_setting/configure_lb.sh | 128 + .../kubernetes/kubespray/install_external_lb.sh | 278 ++ .../kubernetes/kubespray/kubespray_mgmt.py | 1541 ++++++++++ .../BaseHOT/simple/base_hot_top.yaml | 87 + .../simple/nested/base_hot_nested_master.yaml | 33 + .../simple/nested/base_hot_nested_worker.yaml | 33 + .../Definitions/sample_kubernetes_df_simple.yaml | 288 ++ .../Definitions/sample_kubernetes_top.vnfd.yaml | 1 - .../Definitions/sample_kubernetes_types.yaml | 2 +- .../TOSCA-Metadata/TOSCA.meta | 14 + .../kubespray_vnf_package/UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 35 + .../kubernetes/private_registry_mgmt.py | 480 +++ .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1465 +++++++++ .../Definitions/sample_vnfd_df_simple.yaml | 101 + .../Definitions/sample_vnfd_top.yaml | 31 + .../Definitions/sample_vnfd_types.yaml | 63 + .../TOSCA-Metadata/TOSCA.meta | 12 + .../practical_vnf_package/BaseHOT/ha/ha_hot.yaml | 139 + .../BaseHOT/scalable/nested/VDU_0.yaml | 77 + .../BaseHOT/scalable/nested/VDU_1.yaml | 77 + .../BaseHOT/scalable/nested/VDU_2.yaml | 77 + .../BaseHOT/scalable/scalable_hot.yaml | 129 + .../practical_vnf_package/Definitions/Common.yaml | 72 + .../practical_vnf_package/Definitions/Node.yaml | 31 + .../practical_vnf_package/Definitions/df_ha.yaml | 232 ++ .../Definitions/df_scalable.yaml | 391 +++ .../Definitions/etsi_nfv_sol001_common_types.yaml | 203 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1466 +++++++++ .../TOSCA-Metadata/TOSCA.meta | 4 + samples/practical_vnf_package/UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 409 +++ setup.cfg | 33 +- tacker/api/api_common.py | 25 + tacker/api/common/_filters.py | 22 +- tacker/api/schemas/vnf_lcm.py | 22 +- tacker/api/validation/parameter_types.py | 8 +- tacker/api/validation/validators.py | 12 + tacker/api/views/vnf_packages.py | 6 +- tacker/api/vnflcm/v1/controller.py | 418 ++- tacker/api/vnflcm/v1/router.py | 10 + tacker/api/vnfpkgm/v1/controller.py | 15 +- tacker/auth.py | 20 +- tacker/cmd/eventlet/tacker_server.py | 2 + tacker/common/csar_utils.py | 2 + tacker/common/exceptions.py | 14 + tacker/common/rpc.py | 5 +- tacker/conductor/conductor_server.py | 686 +++-- tacker/conf/vnf_lcm.py | 26 +- tacker/context.py | 9 + tacker/db/db_base.py | 3 + tacker/db/db_sqlalchemy/models.py | 5 +- .../3ff50553e9d3_add_grant_and_grant_request.py | 78 + .../6dc60a5760e5_add_extra_field_to_vims_db.py | 36 + ...8f71ba2_alter_vnfd_ids_vnf_instance_ids_vnf_.py | 51 + ...4b7_rename_field_subscription_authentication.py | 40 + ...3e0d0_add_vnfc_info_to_instantiated_vnf_info.py | 78 +- .../db/migration/alembic_migrations/versions/HEAD | 2 +- ...a23ebee909a8_introduce_sol_refactored_models.py | 97 + ...b0d6_add_tenant_id_to_lcm_subscriptions_and_.py | 43 + tacker/db/migration/models/head.py | 7 +- tacker/db/nfvo/nfvo_db.py | 1 + tacker/db/nfvo/nfvo_db_plugin.py | 5 +- tacker/db/types.py | 7 + tacker/db/vnfm/vnfm_db.py | 82 +- tacker/extensions/vnfm.py | 16 + tacker/glance_store/store.py | 12 +- tacker/hacking/checks.py | 13 + tacker/nfvo/drivers/vim/openstack_driver.py | 6 +- tacker/objects/__init__.py | 1 + tacker/objects/cancel_mode.py | 41 + tacker/objects/fields.py | 12 + tacker/objects/heal_vnf_request.py | 6 +- tacker/objects/scale_vnf_request.py | 2 +- tacker/objects/terminate_vnf_req.py | 2 +- tacker/objects/vim_connection.py | 9 +- tacker/objects/vnf_instance.py | 17 +- tacker/objects/vnf_instantiated_info.py | 4 +- tacker/objects/vnf_lcm_op_occs.py | 10 +- tacker/objects/vnf_lcm_subscriptions.py | 96 +- tacker/objects/vnf_package.py | 4 +- tacker/objects/vnf_resources.py | 3 +- tacker/objects/vnf_software_image.py | 2 +- tacker/objects/vnfd_attribute.py | 2 +- tacker/plugins/common/constants.py | 18 +- tacker/policies/__init__.py | 2 + tacker/policies/vnf_lcm.py | 22 + tacker/privileged/__init__.py | 31 + tacker/privileged/linux_cmd.py | 33 + tacker/sol_refactored/api/api_version.py | 115 + tacker/sol_refactored/api/policies/vnflcm_v2.py | 240 ++ tacker/sol_refactored/api/router.py | 59 + tacker/sol_refactored/api/schemas/__init__.py | 0 tacker/sol_refactored/api/schemas/common_types.py | 255 ++ tacker/sol_refactored/api/schemas/vnflcm_v2.py | 357 +++ tacker/sol_refactored/api/validator.py | 51 + tacker/sol_refactored/api/wsgi.py | 180 ++ tacker/sol_refactored/common/cinder_utils.py | 45 + .../sol_refactored/common/common_script_utils.py | 279 ++ tacker/sol_refactored/common/config.py | 87 + tacker/sol_refactored/common/coordinate.py | 69 + tacker/sol_refactored/common/exceptions.py | 330 ++ tacker/sol_refactored/common/http_client.py | 237 ++ tacker/sol_refactored/common/lcm_op_occ_utils.py | 544 ++++ tacker/sol_refactored/common/subscription_utils.py | 269 ++ tacker/sol_refactored/common/vim_utils.py | 101 + tacker/sol_refactored/common/vnf_instance_utils.py | 79 + tacker/sol_refactored/common/vnfd_utils.py | 456 +++ tacker/sol_refactored/conductor/__init__.py | 0 .../sol_refactored/conductor/conductor_rpc_v2.py | 52 + tacker/sol_refactored/conductor/conductor_v2.py | 332 +++ tacker/sol_refactored/conductor/v2_hook.py | 29 + .../sol_refactored/conductor/vnflcm_driver_v2.py | 1147 +++++++ tacker/sol_refactored/controller/__init__.py | 0 tacker/sol_refactored/controller/vnflcm_v2.py | 654 ++++ .../sol_refactored/controller/vnflcm_versions.py | 27 + tacker/sol_refactored/controller/vnflcm_view.py | 402 +++ tacker/sol_refactored/db/__init__.py | 0 tacker/sol_refactored/db/sqlalchemy/__init__.py | 0 tacker/sol_refactored/db/sqlalchemy/models.py | 154 + .../infra_drivers/kubernetes/kubernetes.py | 353 +++ .../infra_drivers/kubernetes/kubernetes_utils.py | 726 +++++ .../infra_drivers/openstack/heat_utils.py | 244 ++ .../infra_drivers/openstack/openstack.py | 1585 ++++++++++ .../infra_drivers/openstack/userdata_default.py | 251 ++ .../infra_drivers/openstack/userdata_main.py | 56 + .../infra_drivers/openstack/userdata_utils.py | 55 + .../sol_refactored/mgmt_drivers/sample_script.py | 67 + tacker/sol_refactored/nfvo/glance_utils.py | 58 + tacker/sol_refactored/nfvo/local_nfvo.py | 387 +++ tacker/sol_refactored/nfvo/nfvo_client.py | 143 + tacker/sol_refactored/objects/__init__.py | 122 + tacker/sol_refactored/objects/base.py | 455 +++ .../objects/common/cp_protocol_data.py | 33 + .../objects/common/ext_link_port_data.py | 32 + .../common/ext_managed_virtual_link_data.py | 40 + .../objects/common/ext_virtual_link_data.py | 37 + tacker/sol_refactored/objects/common/fields.py | 111 + .../common/ip_over_ethernet_address_data.py | 67 + tacker/sol_refactored/objects/common/link.py | 30 + .../objects/common/notification_link.py | 30 + .../objects/common/problem_details.py | 34 + .../objects/common/resource_handle.py | 33 + .../objects/common/subscription_authentication.py | 72 + .../objects/common/vim_connection_info.py | 34 + .../objects/common/vnf_ext_cp_config.py | 33 + .../objects/common/vnf_ext_cp_data.py | 32 + .../common/vnf_instance_subscription_filter.py | 80 + .../objects/v1/constraint_resource_ref.py | 37 + tacker/sol_refactored/objects/v1/fields.py | 43 + tacker/sol_refactored/objects/v1/grant.py | 85 + tacker/sol_refactored/objects/v1/grant_info.py | 38 + tacker/sol_refactored/objects/v1/grant_request.py | 65 + .../objects/v1/placement_constraint.py | 51 + .../objects/v1/resource_definition.py | 46 + .../objects/v1/snapshot_resource_definition.py | 35 + .../objects/v1/vim_compute_resource_flavour.py | 37 + tacker/sol_refactored/objects/v1/vim_constraint.py | 35 + .../objects/v1/vim_snapshot_resource.py | 35 + .../objects/v1/vim_software_image.py | 36 + .../sol_refactored/objects/v1/zone_group_info.py | 33 + tacker/sol_refactored/objects/v1/zone_info.py | 36 + .../objects/v2/affected_ext_link_port.py | 41 + .../objects/v2/affected_virtual_link.py | 49 + .../objects/v2/affected_virtual_storage.py | 46 + tacker/sol_refactored/objects/v2/affected_vnfc.py | 49 + tacker/sol_refactored/objects/v2/cancel_mode.py | 30 + .../objects/v2/change_current_vnf_pkg_request.py | 50 + .../v2/change_ext_vnf_connectivity_request.py | 35 + .../objects/v2/change_vnf_flavour_request.py | 40 + .../sol_refactored/objects/v2/cp_protocol_info.py | 34 + .../objects/v2/create_vnf_pkg_info_request.py | 31 + .../objects/v2/create_vnf_request.py | 33 + .../objects/v2/create_vnf_snapshot_info_request.py | 32 + .../objects/v2/create_vnf_snapshot_request.py | 35 + .../objects/v2/ext_link_port_info.py | 33 + .../objects/v2/ext_managed_virtual_link_info.py | 39 + .../objects/v2/ext_virtual_link_info.py | 36 + .../objects/v2/external_artifacts_access_config.py | 73 + tacker/sol_refactored/objects/v2/fields.py | 175 ++ .../sol_refactored/objects/v2/heal_vnf_request.py | 36 + .../objects/v2/instantiate_vnf_request.py | 41 + .../objects/v2/ip_over_ethernet_address_info.py | 66 + tacker/sol_refactored/objects/v2/lccn_links.py | 35 + .../sol_refactored/objects/v2/lccn_subscription.py | 55 + .../objects/v2/lccn_subscription_request.py | 38 + .../v2/lifecycle_change_notifications_filter.py | 45 + .../modifications_triggered_by_vnf_pkg_change.py | 39 + .../objects/v2/monitoring_parameter.py | 34 + .../objects/v2/operate_vnf_request.py | 36 + tacker/sol_refactored/objects/v2/pkgm_links.py | 33 + .../objects/v2/pkgm_notification_filter.py | 91 + .../objects/v2/pkgm_subscription_request.py | 35 + .../objects/v2/revert_to_vnf_snapshot_request.py | 35 + tacker/sol_refactored/objects/v2/scale_info.py | 32 + .../sol_refactored/objects/v2/scale_vnf_request.py | 34 + .../objects/v2/scale_vnf_to_level_request.py | 32 + .../objects/v2/terminate_vnf_request.py | 33 + .../v2/upload_vnf_package_from_uri_request.py | 58 + .../objects/v2/virtual_storage_resource_info.py | 38 + .../sol_refactored/objects/v2/vnf_ext_cp_info.py | 39 + .../v2/vnf_identifier_creation_notification.py | 36 + .../v2/vnf_identifier_deletion_notification.py | 36 + .../objects/v2/vnf_info_modification_request.py | 44 + .../objects/v2/vnf_info_modifications.py | 45 + tacker/sol_refactored/objects/v2/vnf_instance.py | 109 + tacker/sol_refactored/objects/v2/vnf_lcm_op_occ.py | 136 + .../vnf_lcm_operation_occurrence_notification.py | 61 + .../objects/v2/vnf_link_port_data.py | 32 + .../objects/v2/vnf_link_port_info.py | 36 + .../objects/v2/vnf_package_artifact_info.py | 43 + .../objects/v2/vnf_package_change_notification.py | 41 + .../v2/vnf_package_onboarding_notification.py | 39 + .../objects/v2/vnf_package_software_image_info.py | 70 + tacker/sol_refactored/objects/v2/vnf_pkg_info.py | 74 + .../objects/v2/vnf_pkg_info_modifications.py | 34 + tacker/sol_refactored/objects/v2/vnf_snapshot.py | 54 + .../sol_refactored/objects/v2/vnf_snapshot_info.py | 47 + .../v2/vnf_snapshot_info_modification_request.py | 33 + .../objects/v2/vnf_snapshot_info_modifications.py | 33 + .../objects/v2/vnf_state_snapshot_info.py | 32 + .../objects/v2/vnf_virtual_link_resource_info.py | 40 + tacker/sol_refactored/objects/v2/vnfc_info.py | 35 + .../objects/v2/vnfc_info_modifications.py | 32 + .../objects/v2/vnfc_resource_info.py | 59 + .../objects/v2/vnfc_snapshot_info.py | 52 + tacker/sol_refactored/test-tools/cli.py | 250 ++ .../test-tools/notif_endpoint_app.py | 111 + .../functional5/BaseHOT/simple/helloworld3.yaml | 30 +- .../functional6/BaseHOT/simple/helloworld3.yaml | 21 +- .../Definitions/helloworld3_df_simple.yaml | 16 +- .../functional7/BaseHOT/simple/helloworld3.yaml | 100 + .../functional7/BaseHOT/simple/nested/VDU1.yaml | 65 + .../functional7/BaseHOT/simple/nested/VDU2.yaml | 65 + .../Definitions/helloworld3_df_simple.yaml | 415 +++ .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../functional7/Definitions/helloworld3_types.yaml | 55 + .../etsi/nfv/functional7/TOSCA-Metadata/TOSCA.meta | 4 + .../etsi/nfv/functional7/UserData/__init__.py | 0 .../etsi/nfv/functional7/UserData/lcm_user_data.py | 35 + .../mt_functional1/BaseHOT/simple/helloworld3.yaml | 99 + .../mt_functional1/BaseHOT/simple/nested/VDU1.yaml | 72 + .../mt_functional1/BaseHOT/simple/nested/VDU2.yaml | 61 + .../Definitions/helloworld3_df_simple.yaml | 403 +++ .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../Definitions/helloworld3_types.yaml | 55 + .../nfv/mt_functional1/TOSCA-Metadata/TOSCA.meta | 4 + .../etsi/nfv/mt_functional1/UserData/__init__.py | 0 .../nfv/mt_functional1/UserData/lcm_user_data.py | 35 + .../BaseHOT/default/VNF-hot.yaml | 50 + .../BaseHOT/default/nested/VDU1.yaml | 45 + .../Definitions/helloworld3_df_default.yaml | 212 ++ .../Definitions/helloworld3_top.vnfd.yaml | 28 + .../Definitions/helloworld3_types.yaml | 47 + .../TOSCA-Metadata/TOSCA.meta | 7 + .../sample_compliance_test/UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 35 + .../BaseHOT/simple/helloworld3.yaml | 98 + .../BaseHOT/simple/nested/VDU1.yaml | 72 + .../BaseHOT/simple/nested/VDU2.yaml | 61 + .../Definitions/helloworld3_df_simple.yaml | 403 +++ .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../Definitions/helloworld3_types.yaml | 55 + .../stack_update_in_heal/TOSCA-Metadata/TOSCA.meta | 4 + .../UserData/BaseHOT/simple/helloworld3.yaml | 98 + .../UserData/BaseHOT/simple/nested/VDU1.yaml | 72 + .../UserData/BaseHOT/simple/nested/VDU2.yaml | 61 + .../Definitions/helloworld3_df_simple.yaml | 403 +++ .../UserData/Definitions/helloworld3_top.vnfd.yaml | 31 + .../UserData/Definitions/helloworld3_types.yaml | 55 + .../UserData/TOSCA-Metadata/TOSCA.meta | 4 + .../nfv/stack_update_in_heal/UserData/__init__.py | 0 .../stack_update_in_heal/UserData/lcm_user_data.py | 100 + .../BaseHOT/simple/helloworld3.yaml | 105 + .../BaseHOT/simple/nested/VDU1.yaml | 76 + .../BaseHOT/simple/nested/VDU2.yaml | 68 + .../Definitions/helloworld3_df_simple.yaml | 403 +++ .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../Definitions/helloworld3_types.yaml | 55 + .../TOSCA-Metadata/TOSCA.meta | 4 + .../UserData/BaseHOT/simple/helloworld3.yaml | 105 + .../UserData/BaseHOT/simple/nested/VDU1.yaml | 76 + .../UserData/BaseHOT/simple/nested/VDU2.yaml | 68 + .../Definitions/helloworld3_df_simple.yaml | 403 +++ .../UserData/Definitions/helloworld3_top.vnfd.yaml | 31 + .../UserData/Definitions/helloworld3_types.yaml | 55 + .../UserData/TOSCA-Metadata/TOSCA.meta | 4 + .../nfv/stack_update_in_scale/UserData/__init__.py | 0 .../UserData/lcm_user_data.py | 100 + .../Definitions/helloworld3_df_simple.yaml | 0 .../test_cnf/Definitions/helloworld3_top.vnfd.yaml | 31 + .../test_cnf/Definitions/helloworld3_types.yaml | 53 + .../Files/kubernetes/bindings.yaml | 0 .../clusterrole_clusterrolebinding_SA.yaml | 0 .../Files/kubernetes/config-map.yaml | 0 .../Files/kubernetes/controller-revision.yaml | 0 .../Files/kubernetes/daemon-set.yaml | 0 .../Files/kubernetes/deployment.yaml | 0 .../kubernetes/horizontal-pod-autoscaler.yaml | 0 .../Files/kubernetes/job.yaml | 0 .../Files/kubernetes/limit-range.yaml | 0 .../kubernetes/local-subject-access-review.yaml | 0 .../Files/kubernetes/multiple_yaml_lease.yaml | 0 .../kubernetes/multiple_yaml_network-policy.yaml | 0 .../kubernetes/multiple_yaml_priority-class.yaml | 0 .../Files/kubernetes/namespace.yaml | 0 .../Files/kubernetes/persistent-volume-0.yaml | 0 .../Files/kubernetes/persistent-volume-1.yaml | 0 .../Files/kubernetes/pod-template.yaml | 0 .../Files/kubernetes/pod.yaml | 0 .../kubernetes/replicaset_service_secret.yaml | 0 .../Files/kubernetes/resource-quota.yaml | 0 .../Files/kubernetes/role_rolebinding_SA.yaml | 0 ...access-review_and_self-subject-rule-review.yaml | 0 .../Files/kubernetes/statefulset.yaml | 0 .../Files/kubernetes/statefulset_fail.yaml | 36 + .../Files/kubernetes/storage-class.yaml | 0 .../Files/kubernetes/storage-class_pv_pvc.yaml | 0 .../Files/kubernetes/subject-access-review.yaml | 0 .../Files/kubernetes/token-review.yaml | 0 .../TOSCA-Metadata/TOSCA.meta | 7 +- .../Definitions/sample_df_simple.yaml | 178 ++ .../Definitions/sample_top.vnfd.yaml | 31 + .../Definitions/sample_types.yaml | 53 + .../Files/kubernetes/configmap_2.yaml | 9 + .../Files/kubernetes/deployment.yaml | 39 + .../Files/kubernetes/pod_env.yaml | 26 + .../Files/kubernetes/pod_volume.yaml | 8 + .../Files/kubernetes/replicaset.yaml | 41 + .../Files/kubernetes/secret_2.yaml | 9 + .../TOSCA-Metadata/TOSCA.meta | 39 + .../Definitions/sample_df_simple.yaml | 178 ++ .../Definitions/sample_top.vnfd.yaml | 31 + .../Definitions/sample_types.yaml | 53 + .../Files/kubernetes/configmap_1.yaml | 9 + .../Files/kubernetes/deployment.yaml | 39 + .../Files/kubernetes/pod_env.yaml | 26 + .../Files/kubernetes/pod_volume.yaml | 28 + .../Files/kubernetes/replicaset.yaml | 41 + .../Files/kubernetes/secret_1.yaml | 9 + .../TOSCA-Metadata/TOSCA.meta | 39 + .../Definitions/helloworld3_df_simple.yaml | 42 + .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../Definitions/helloworld3_types.yaml | 53 + .../Files/kubernetes/storage-class-url.yaml | 0 .../TOSCA-Metadata/TOSCA.meta | 0 .../Definitions/sample_vnfd_df_helmchart.yaml | 151 + .../Definitions/sample_vnfd_top.yaml | 31 + .../Definitions/sample_vnfd_types.yaml | 53 + .../Files/kubernetes/localhelm-0.1.0.tgz | Bin 0 -> 3603 bytes .../test_cnf_helmchart/TOSCA-Metadata/TOSCA.meta | 9 + .../Definitions/helloworld3_df_simple.yaml | 150 + .../Definitions/helloworld3_top.vnfd.yaml | 31 + .../Definitions/helloworld3_types.yaml | 53 + .../Files/kubernetes/deployment_has_namespace.yaml | 22 + .../Files/kubernetes/deployment_no_namespace.yaml | 21 + .../Files/kubernetes/namespace01.yaml | 4 + .../Files/kubernetes/namespace02.yaml | 4 + .../test_cnf_multi_ns/TOSCA-Metadata/TOSCA.meta | 24 + .../test_heal_grant_unit/helloworld3_types.yaml | 59 + .../etsi/nfv/test_heal_grant_unit/sample_vnfd.yaml | 144 + .../Scripts/vnflcm_noop.py | 10 + .../TOSCA-Metadata/TOSCA.meta | 2 +- .../functional/legacy/vnfm/test_tosca_vnf_alarm.py | 3 + .../legacy/vnfm/test_vnf_placement_policy.py | 7 - .../functional/sol/vnflcm/test_vnf_instance.py | 308 +- .../sol/vnflcm/test_vnf_instance_with_user_data.py | 387 ++- .../functional/sol/vnflcm/test_vnflcm_noop.py | 26 +- .../functional/sol/vnfpkgm/test_vnf_package.py | 11 + .../sol_kubernetes/vnflcm/test_kubernetes.py | 1128 ++----- .../vnflcm/test_kubernetes_container_update.py | 102 + .../sol_kubernetes/vnflcm/test_kubernetes_heal.py | 310 +- .../sol_kubernetes/vnflcm/test_kubernetes_helm.py | 139 + .../vnflcm/test_kubernetes_multi_ns.py | 140 + .../sol_kubernetes/vnflcm/test_kubernetes_scale.py | 500 +--- .../sol_kubernetes_multi_tenant/__init__.py | 0 .../sol_kubernetes_multi_tenant/vnflcm/__init__.py | 0 .../sol_kubernetes_multi_tenant/vnflcm/base.py | 230 ++ .../vnflcm/fake_vnflcm.py | 109 + .../vnflcm/test_kubernetes_multi_tenant.py | 375 +++ .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1463 +++++++++ .../contents/Definitions/sample_cnf_df_simple.yaml | 169 ++ .../contents/Definitions/sample_cnf_top.vnfd.yaml | 31 + .../contents/Definitions/sample_cnf_types.yaml | 53 + .../contents/Files/kubernetes/deployment.yaml | 24 + .../contents/Files/kubernetes/namespace.yaml | 4 + .../Files/new_kubernetes/error_deployment.yaml | 28 + .../Files/new_kubernetes/new_deployment.yaml | 24 + .../contents/Scripts/coordinate_new_vnf.py | 66 + .../contents/Scripts/coordinate_old_vnf.py | 63 + .../contents/TOSCA-Metadata/TOSCA.meta | 25 + .../test_change_vnf_pkg_with_deployment/pkggen.py | 47 + .../contents/Definitions/sample_cnf_df_simple.yaml | 304 ++ .../contents/Definitions/sample_cnf_top.vnfd.yaml | 31 + .../contents/Definitions/sample_cnf_types.yaml | 53 + .../contents/Files/kubernetes/bindings.yaml | 10 + .../clusterrole_clusterrolebinding_SA.yaml | 29 + .../contents/Files/kubernetes/config-map.yaml | 8 + .../Files/kubernetes/controller-revision.yaml | 8 + .../contents/Files/kubernetes/daemon-set.yaml | 24 + .../contents/Files/kubernetes/deployment.yaml | 29 + .../Files/kubernetes/deployment_fail_test.yaml | 29 + .../kubernetes/horizontal-pod-autoscaler.yaml | 13 + .../contents/Files/kubernetes/job.yaml | 30 + .../contents/Files/kubernetes/limit-range.yaml | 10 + .../kubernetes/local-subject-access-review.yaml | 11 + .../Files/kubernetes/multiple_yaml_lease.yaml | 8 + .../kubernetes/multiple_yaml_network-policy.yaml | 17 + .../kubernetes/multiple_yaml_priority-class.yaml | 7 + .../contents/Files/kubernetes/namespace.yaml | 4 + .../Files/kubernetes/persistent-volume-0.yaml | 14 + .../Files/kubernetes/persistent-volume-1.yaml | 14 + .../contents/Files/kubernetes/pod-template.yaml | 43 + .../contents/Files/kubernetes/pod.yaml | 17 + .../kubernetes/replicaset_service_secret.yaml | 56 + .../contents/Files/kubernetes/resource-quota.yaml | 11 + .../Files/kubernetes/role_rolebinding_SA.yaml | 31 + ...access-review_and_self-subject-rule-review.yaml | 14 + .../contents/Files/kubernetes/statefulset.yaml | 41 + .../contents/Files/kubernetes/storage-class.yaml | 6 + .../Files/kubernetes/storage-class_pv_pvc.yaml | 37 + .../Files/kubernetes/subject-access-review.yaml | 9 + .../contents/Files/kubernetes/token-review.yaml | 9 + .../contents/Scripts/coordinate_old_vnf.py | 63 + .../contents/TOSCA-Metadata/TOSCA.meta | 144 + .../test_instantiate_cnf_resources/pkggen.py | 74 + .../sol_kubernetes_v2/test_change_vnfpkg.py | 330 ++ .../sol_kubernetes_v2/test_vnflcm_basic.py | 266 ++ .../sol_kubernetes_v2/test_vnflcm_error_handing.py | 471 +++ .../functional/sol_multi_tenant/vnflcm/__init__.py | 0 .../functional/sol_multi_tenant/vnflcm/base.py | 118 + .../sol_multi_tenant/vnflcm/fake_vnflcm.py | 252 ++ .../vnflcm/test_vnf_lcm_with_multi_tenant.py | 455 +++ .../sol_separated_nfvo/vnflcm/fake_grant.py | 268 +- .../sol_separated_nfvo/vnflcm/fake_grant_server.py | 159 + ...st_vnf_instance_with_user_data_nfvo_separate.py | 229 +- .../contents/BaseHOT/simple/nested/VDU1.yaml | 91 + .../contents/BaseHOT/simple/sample1.yaml | 120 + .../contents/Definitions/v2_sample1_df_simple.yaml | 428 +++ .../contents/Definitions/v2_sample1_top.vnfd.yaml | 31 + .../contents/Definitions/v2_sample1_types.yaml | 55 + .../contents/Scripts/sample_script.py | 67 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../basic_lcms_max/contents/UserData/userdata.py | 125 + .../sol_v2/samples/basic_lcms_max/pkggen.py | 125 + .../sol_v2/samples/basic_lcms_max/post.py | 21 + .../sol_v2/samples/basic_lcms_max/pre.py | 24 + .../contents/BaseHOT/simple/nested/VDU1.yaml | 30 + .../contents/BaseHOT/simple/sample2.yaml | 61 + .../contents/Definitions/v2_sample2_df_simple.yaml | 262 ++ .../contents/Definitions/v2_sample2_top.vnfd.yaml | 31 + .../contents/Definitions/v2_sample2_types.yaml | 55 + .../contents/Scripts/sample_script.py | 77 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../sol_v2/samples/basic_lcms_min/pkggen.py | 81 + .../Definitions/etsi_nfv_sol001_common_types.yaml | 202 ++ .../Definitions/etsi_nfv_sol001_vnfd_types.yaml | 1463 +++++++++ .../contents/BaseHOT/simple/nested/VDU1.yaml | 30 + .../contents/BaseHOT/simple/sample2.yaml | 61 + .../contents/Definitions/v2_sample2_df_simple.yaml | 258 ++ .../contents/Definitions/v2_sample2_top.vnfd.yaml | 31 + .../contents/Definitions/v2_sample2_types.yaml | 55 + .../contents/Scripts/sample_script.py | 67 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../sol_v2/samples/error_network/pkggen.py | 50 + .../contents/BaseHOT/simple/nested/VDU1.yaml | 91 + .../scale_ng/contents/BaseHOT/simple/sample1.yaml | 120 + .../contents/Definitions/v2_sample1_df_simple.yaml | 428 +++ .../contents/Definitions/v2_sample1_top.vnfd.yaml | 31 + .../contents/Definitions/v2_sample1_types.yaml | 55 + .../scale_ng/contents/Scripts/sample_script.py | 67 + .../scale_ng/contents/TOSCA-Metadata/TOSCA.meta | 4 + .../samples/scale_ng/contents/UserData/userdata.py | 125 + .../functional/sol_v2/samples/scale_ng/pkggen.py | 77 + .../functional/sol_v2/samples/scale_ng/post.py | 20 + .../functional/sol_v2/samples/scale_ng/pre.py | 21 + .../contents/BaseHOT/simple/base_hot_top.yaml | 54 + .../simple/nested/base_hot_nested_VDU1.yaml | 27 + .../contents/BaseHOT/volume/base_hot_top.yaml | 53 + .../volume/nested/base_hot_nested_VDU1.yaml | 39 + .../change_vnf_pkg_new_image_df_simple.yaml | 219 ++ .../change_vnf_pkg_new_image_df_volume.yaml | 224 ++ .../Definitions/change_vnf_pkg_top.vnfd.yaml | 31 + .../contents/Definitions/change_vnf_pkg_types.yaml | 53 + .../contents/Scripts/coordinate_new_vnf.py | 145 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../test_change_vnf_pkg_with_new_image/pkggen.py | 51 + .../contents/BaseHOT/simple/base_hot_top.yaml | 65 + .../simple/nested/base_hot_nested_VDU1.yaml | 27 + .../contents/BaseHOT/volume/base_hot_top.yaml | 65 + .../volume/nested/base_hot_nested_VDU1.yaml | 39 + .../change_vnf_pkg_new_volume_df_simple.yaml | 224 ++ .../change_vnf_pkg_new_volume_df_volume.yaml | 237 ++ .../Definitions/change_vnf_pkg_top.vnfd.yaml | 31 + .../contents/Definitions/change_vnf_pkg_types.yaml | 53 + .../contents/Scripts/coordinate_new_vnf.py | 145 + .../contents/Scripts/error_coordinate_new_vnf.py | 67 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../test_change_vnf_pkg_with_new_volume/pkggen.py | 54 + .../contents/BaseHOT/simple/base_hot_top.yaml | 53 + .../simple/nested/base_hot_nested_VDU1.yaml | 26 + .../change_vnf_pkg_error_image_df_simple.yaml | 219 ++ .../Definitions/change_vnf_pkg_top.vnfd.yaml | 31 + .../contents/Definitions/change_vnf_pkg_types.yaml | 53 + .../contents/Scripts/coordinate_new_vnf.py | 145 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../pkggen.py | 46 + .../contents/BaseHOT/simple/base_hot_top.yaml | 53 + .../simple/nested/base_hot_nested_VDU1.yaml | 27 + .../contents/BaseHOT/volume/base_hot_top.yaml | 65 + .../volume/nested/base_hot_nested_VDU1.yaml | 39 + .../change_vnf_pkg_old_image_df_simple.yaml | 211 ++ .../change_vnf_pkg_old_volume_df_simple.yaml | 229 ++ .../Definitions/change_vnf_pkg_top.vnfd.yaml | 32 + .../contents/Definitions/change_vnf_pkg_types.yaml | 53 + .../contents/Scripts/coordinate_old_vnf.py | 145 + .../contents/TOSCA-Metadata/TOSCA.meta | 4 + .../pkggen.py | 85 + .../contents/BaseHOT/simple/nested/VDU1.yaml | 30 + .../contents/BaseHOT/simple/sample2.yaml | 61 + .../contents/Definitions/v2_sample2_df_simple.yaml | 258 ++ .../contents/Definitions/v2_sample2_top.vnfd.yaml | 31 + .../contents/Definitions/v2_sample2_types.yaml | 55 + .../update_vnf/contents/Scripts/sample_script.py | 67 + .../update_vnf/contents/TOSCA-Metadata/TOSCA.meta | 4 + .../functional/sol_v2/samples/update_vnf/pkggen.py | 49 + .../sol_v2/test_vnflcm_error_handling.py | 1128 +++++++ .../unit/objects/test_vnf_lcm_subscriptions.py | 93 +- .../unit/sol_refactored/api/test_api_version.py | 62 + .../unit/sol_refactored/api/test_validator.py | 80 + .../common/test_common_script_utils.py | 309 ++ .../unit/sol_refactored/common/test_coordinate.py | 80 + .../sol_refactored/common/test_lcm_op_occ_utils.py | 2426 +++++++++++++++ .../common/test_vnf_instance_utils.py | 67 + .../unit/sol_refactored/common/test_vnfd_utils.py | 181 ++ .../unit/sol_refactored/conductor/__init__.py | 0 .../sol_refactored/conductor/test_conductor_v2.py | 532 ++++ .../conductor/test_vnflcm_driver_v2.py | 2188 ++++++++++++++ .../unit/sol_refactored/controller/__init__.py | 0 .../sol_refactored/controller/test_vnflcm_v2.py | 673 +++++ .../sol_refactored/controller/test_vnflcm_view.py | 186 ++ .../unit/sol_refactored/infra_drivers/__init__.py | 0 .../infra_drivers/kubernetes/__init__.py | 0 .../infra_drivers/kubernetes/fakes.py | 546 ++++ .../infra_drivers/kubernetes/test_kubernetes.py | 1361 +++++++++ .../infra_drivers/openstack/__init__.py | 0 .../infra_drivers/openstack/test_openstack.py | 3145 ++++++++++++++++++++ .../Definitions/sample_cnf_df_simple.yaml | 131 + .../Files/kubernetes/deployment.yaml | 24 + .../Files/new_kubernetes/new_deployment.yaml | 24 + .../Scripts/coordinate_new_vnf.py | 67 + .../change_vnfpkg_sample/TOSCA-Metadata/TOSCA.meta | 14 + .../sample1/BaseHOT/simple/nested/VDU1.yaml | 87 + .../samples/sample1/BaseHOT/simple/ut_sample1.yaml | 119 + .../sample1/Definitions/ut_sample1_df_simple.yaml | 426 +++ .../samples/sample1/Scripts/sample_script.py | 67 + .../samples/sample1/TOSCA-Metadata/TOSCA.meta | 4 + .../samples/sample1/UserData/userdata_default.py | 120 + .../sample2/Definitions/sample_cnf_df_simple.yaml | 131 + .../sample2/Files/kubernetes/api-service.yaml | 11 + .../samples/sample2/Files/kubernetes/bindings.yaml | 10 + .../clusterrole_clusterrolebinding_SA.yaml | 29 + .../sample2/Files/kubernetes/config-map.yaml | 8 + .../Files/kubernetes/controller-revision.yaml | 8 + .../sample2/Files/kubernetes/daemon-set.yaml | 19 + .../sample2/Files/kubernetes/deployment.yaml | 24 + .../kubernetes/horizontal-pod-autoscaler.yaml | 13 + .../samples/sample2/Files/kubernetes/job.yaml | 25 + .../sample2/Files/kubernetes/limit-range.yaml | 10 + .../kubernetes/local-subject-access-review.yaml | 11 + .../Files/kubernetes/multiple_yaml_lease.yaml | 8 + .../kubernetes/multiple_yaml_network-policy.yaml | 17 + .../kubernetes/multiple_yaml_priority-class.yaml | 7 + .../sample2/Files/kubernetes/namespace.yaml | 4 + .../samples/sample2/Files/kubernetes/node.yaml | 41 + .../Files/kubernetes/persistent-volume-0.yaml | 14 + .../Files/kubernetes/persistent-volume-1.yaml | 14 + .../sample2/Files/kubernetes/pod-template.yaml | 43 + .../samples/sample2/Files/kubernetes/pod.yaml | 12 + .../kubernetes/replicaset_service_secret.yaml | 51 + .../sample2/Files/kubernetes/resource-quota.yaml | 11 + .../Files/kubernetes/role_rolebinding_SA.yaml | 31 + ...access-review_and_self-subject-rule-review.yaml | 14 + .../sample2/Files/kubernetes/statefulset.yaml | 36 + .../sample2/Files/kubernetes/storage-class.yaml | 6 + .../Files/kubernetes/storage-class_pv_pvc.yaml | 37 + .../Files/kubernetes/subject-access-review.yaml | 9 + .../sample2/Files/kubernetes/token-review.yaml | 9 + .../Files/kubernetes/volume-attachment.yaml | 12 + .../samples/sample2/Scripts/coordinate_old_vnf.py | 64 + .../samples/sample2/TOSCA-Metadata/TOSCA.meta | 154 + .../unit/vnfm/infra_drivers/kubernetes/fakes.py | 157 +- .../kubernetes/test_kubernetes_driver.py | 327 +- .../kubernetes/test_kubernetes_driver_helm.py | 680 +++++ .../kubernetes/test_translate_outputs.py | 70 +- .../vnfm/infra_drivers/kubernetes/test_utils.py | 70 + .../etsi_nfv/etsi_nfv_sol001_common_types.yaml | 404 +-- .../data/etsi_nfv/etsi_nfv_sol001_vnfd_types.yaml | 2704 ++++++++--------- .../etsi_nfv/hot/hot_generate_hot_from_tosca.yaml | 130 +- .../hot_generate_hot_from_tosca_with_scaling.yaml | 122 +- .../etsi_nfv/hot/scaling/worker_instance.hot.yaml | 82 +- .../etsi_nfv/tosca_generate_hot_from_tosca.yaml | 230 +- ...tosca_generate_hot_from_tosca_parser_error.yaml | 32 +- ...a_generate_hot_from_tosca_translator_error.yaml | 96 +- ..._generate_hot_from_tosca_with_params_error.yaml | 394 +-- ...tosca_generate_hot_from_tosca_with_scaling.yaml | 366 +-- ...t_from_tosca_with_scaling_invalid_inst_req.yaml | 210 +- ...rom_tosca_with_substitution_mappings_error.yaml | 394 +-- .../data/etsi_nfv/tosca_params_error.yaml | 6 +- .../openstack/data/etsi_nfv/tosca_vnfd.yaml | 196 +- .../data/etsi_nfv/tosca_vnfd_group_member.yaml | 103 + .../openstack/data/hot_scale_grant.yaml | 4 +- .../openstack/data/test_tosca_parser_failure.yaml | 54 +- .../openstack/fixture_data/fixture_data_utils.py | 179 +- .../openstack/test_etsi_translate_template.py | 6 +- .../openstack/test_openstack_driver.py | 1273 ++++++-- .../openstack/test_update_template.py | 227 ++ .../unit/vnfm/infra_drivers/openstack/test_vdu.py | 2 +- .../unit/vnfm/lcm_user_data/utils/test_utils.py | 23 + .../mgmt_drivers/test_container_update_mgmt.py | 156 + .../vdu_autoheal/test_vdu_autoheal.py | 2 +- tacker/vnflcm/utils.py | 34 +- tacker/vnflcm/vnflcm_driver.py | 280 +- .../vnfm/infra_drivers/kubernetes/helm/__init__.py | 0 .../infra_drivers/kubernetes/helm/helm_client.py | 189 ++ .../kubernetes/k8s/translate_outputs.py | 80 +- .../infra_drivers/kubernetes/kubernetes_driver.py | 551 +++- tacker/vnfm/infra_drivers/kubernetes/utils.py | 83 + tacker/vnfm/infra_drivers/openstack/heat_client.py | 10 + tacker/vnfm/infra_drivers/openstack/openstack.py | 650 +++- .../infra_drivers/openstack/translate_template.py | 4 + .../infra_drivers/openstack/update_template.py | 98 + tacker/vnfm/infra_drivers/openstack/vdu.py | 3 +- tacker/vnfm/infra_drivers/scale_driver.py | 9 +- tacker/vnfm/keystone.py | 9 +- tacker/vnfm/lcm_user_data/utils.py | 85 +- tacker/vnfm/mgmt_drivers/constants.py | 2 + tacker/vnfm/mgmt_drivers/vnflcm_abstract_driver.py | 10 + tacker/vnfm/mgmt_drivers/vnflcm_noop.py | 10 + tacker/vnfm/nfvo_client.py | 5 + .../policy_actions/vdu_autoheal/vdu_autoheal.py | 3 +- tacker/vnfm/vim_client.py | 3 +- test-requirements.txt | 2 +- tools/gen_vim_config.sh | 388 +++ tools/test-setup-k8s-vim.sh | 2 +- tools/test-setup-mgmt.sh | 29 + tox.ini | 43 +- vagrant/devstack/.gitignore | 9 + vagrant/devstack/README.md | 83 + vagrant/devstack/Vagrantfile | 119 + vagrant/devstack/ansible.cfg | 5 + vagrant/devstack/group_vars/all.yml | 28 + .../helper/install_vagrant_libvirt_pkgs.sh | 7 + vagrant/devstack/hosts | 9 + vagrant/devstack/lib/machine.rb | 38 + vagrant/devstack/lib/vagrant_boxes.yml | 13 + vagrant/devstack/lib/vd_utils.rb | 79 + .../roles/centos-stream8/compute/tasks/main.yml | 6 + .../centos-stream8/compute/templates/local.conf.j2 | 22 + .../centos-stream8/controller/tasks/basic_pkgs.yml | 14 + .../centos-stream8/controller/tasks/devstack.yml | 22 + .../controller/tasks/extra_tools.yml | 6 + .../centos-stream8/controller/tasks/git_config.yml | 4 + .../centos-stream8/controller/tasks/kubernetes.yml | 10 + .../roles/centos-stream8/controller/tasks/main.yml | 21 + .../roles/centos-stream8/controller/tasks/ovn.yml | 24 + .../controller/tasks/python3_specific_vers.yml | 9 + .../controller/tasks/set_path_env.yml | 5 + .../controller/tasks/setup_tacker.yml | 65 + .../controller/tasks/vim_extra_plugins.yml | 35 + .../controller/templates/kubernetes.repo.j2 | 7 + .../centos-stream8/controller/templates/vimrc.j2 | 159 + .../ubuntu-focal/compute/tasks/basic_pkgs.yml | 6 + .../roles/ubuntu-focal/compute/tasks/devstack.yml | 15 + .../roles/ubuntu-focal/compute/tasks/main.yml | 6 + .../ubuntu-focal/compute/templates/local.conf.j2 | 22 + .../ubuntu-focal/controller/tasks/basic_pkgs.yml | 16 + .../ubuntu-focal/controller/tasks/devstack.yml | 20 + .../ubuntu-focal/controller/tasks/extra_tools.yml | 8 + .../ubuntu-focal/controller/tasks/git_config.yml | 4 + .../roles/ubuntu-focal/controller/tasks/main.yml | 23 + .../controller/tasks/python3_specific_vers.yml | 9 + .../controller/tasks/remove_useless_pkgs.yml | 11 + .../ubuntu-focal/controller/tasks/set_path_env.yml | 5 + .../ubuntu-focal/controller/tasks/setup_tacker.yml | 65 + .../controller/tasks/vim_extra_plugins.yml | 29 + .../ubuntu-focal/controller/tasks/vim_latest.yml | 8 + .../ubuntu-focal/controller/templates/vimrc.j2 | 159 + vagrant/devstack/samples/machines-2nodes.yml | 35 + vagrant/devstack/samples/machines.yml | 21 + vagrant/devstack/site.yaml | 18 + 1040 files changed, 137137 insertions(+), 7641 deletions(-) Requirements updates -------------------- diff --git a/requirements.txt b/requirements.txt index 8352eaaa..80daa4d2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,2 +10 @@ amqp>=2.4.0 -anyjson>=0.3.3 # BSD -eventlet!=0.18.3,!=0.20.1,>=0.18.2 # MIT +eventlet>=0.30.1 # MIT @@ -30,0 +30 @@ oslo.policy>=3.6.0 # Apache-2.0 +oslo.privsep>=2.4.0 # Apache-2.0 @@ -34 +34 @@ oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0 -oslo.service!=1.28.1,>=1.24.0 # Apache-2.0 +oslo.service>=2.5.0 # Apache-2.0 diff --git a/test-requirements.txt b/test-requirements.txt index 5ef1d3dc..6ae7245b 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -9 +9 @@ ddt>=1.0.1 # MIT -doc8>=0.8.1 # Apache-2.0 +doc8>=0.9.0 # Apache-2.0