From 42660e4a1754f169dce2e3f6ab145fdcb383f5b5 Mon Sep 17 00:00:00 2001 From: beierlm Date: Fri, 26 Feb 2021 20:32:26 +0000 Subject: [PATCH] Merge branch 'beierlm-virtual-pc' into 'master' Virtual PC Descriptor See merge request vnf-onboarding/osm-packages!118 (cherry picked from commit 745178311b459af68bbaa36117cb21bada1ddc4b) 93f1539f Virtual PC Descriptor a3376cdc Update hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml 15bccf2b Deleted hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/install,... 5074ce34 Adding built charm 4e56134b Virtual PC NS Descriptor a7fcf52d Fix no indicators on virtual-pc charm a819702e Merge branch 'fix-virtual-pc-no-indicators' into 'beierlm-virtual-pc' --- hackfest_virtual-pc_ns/README.md | 3 + .../hackfest_virtual-pc_nsd.yaml | 37 + .../charms/virtual-pc-src/.jujuignore | 3 + .../charms/virtual-pc-src/LICENSE | 674 ++++++++ .../charms/virtual-pc-src/README.md | 55 + .../charms/virtual-pc-src/actions.yaml | 6 + .../charms/virtual-pc-src/config.yaml | 6 + .../charms/virtual-pc-src/metadata.yaml | 9 + .../virtual-pc-src/requirements-dev.txt | 3 + .../charms/virtual-pc-src/requirements.txt | 1 + .../charms/virtual-pc-src/run_tests | 16 + .../charms/virtual-pc-src/src/charm.py | 137 ++ .../charms/virtual-pc-src/src/test.py | 17 + .../charms/virtual-pc-src/src/utils.py | 78 + .../virtual-pc-src/templates/color.pkla | 6 + .../virtual-pc-src/templates/startwm.sh | 33 + .../charms/virtual-pc-src/tests/__init__.py | 0 .../charms/virtual-pc-src/tests/test_charm.py | 35 + .../charms/virtual-pc/LICENSE | 674 ++++++++ .../charms/virtual-pc/README.md | 55 + .../charms/virtual-pc/actions.yaml | 6 + .../charms/virtual-pc/config.yaml | 6 + .../charms/virtual-pc/dispatch | 3 + .../charms/virtual-pc/hooks/install | 1 + .../charms/virtual-pc/hooks/start | 1 + .../charms/virtual-pc/hooks/upgrade-charm | 1 + .../charms/virtual-pc/metadata.yaml | 9 + .../charms/virtual-pc/requirements-dev.txt | 3 + .../charms/virtual-pc/requirements.txt | 1 + .../charms/virtual-pc/run_tests | 16 + .../charms/virtual-pc/src/charm.py | 138 ++ .../charms/virtual-pc/src/test.py | 17 + .../charms/virtual-pc/src/utils.py | 78 + .../charms/virtual-pc/templates/color.pkla | 6 + .../charms/virtual-pc/templates/startwm.sh | 33 + .../charms/virtual-pc/tests/__init__.py | 0 .../charms/virtual-pc/tests/test_charm.py | 35 + .../venv/PyYAML-5.4.1.dist-info/INSTALLER | 1 + .../venv/PyYAML-5.4.1.dist-info/LICENSE | 20 + .../venv/PyYAML-5.4.1.dist-info/METADATA | 46 + .../venv/PyYAML-5.4.1.dist-info/RECORD | 43 + .../venv/PyYAML-5.4.1.dist-info/WHEEL | 5 + .../venv/PyYAML-5.4.1.dist-info/top_level.txt | 2 + .../charms/virtual-pc/venv/_yaml/__init__.py | 33 + .../venv/ops-1.1.0.dist-info/INSTALLER | 1 + .../venv/ops-1.1.0.dist-info/LICENSE.txt | 202 +++ .../venv/ops-1.1.0.dist-info/METADATA | 263 +++ .../venv/ops-1.1.0.dist-info/RECORD | 28 + .../virtual-pc/venv/ops-1.1.0.dist-info/WHEEL | 5 + .../venv/ops-1.1.0.dist-info/top_level.txt | 1 + .../charms/virtual-pc/venv/ops/__init__.py | 20 + .../charms/virtual-pc/venv/ops/charm.py | 823 ++++++++++ .../charms/virtual-pc/venv/ops/framework.py | 1199 ++++++++++++++ .../charms/virtual-pc/venv/ops/jujuversion.py | 114 ++ .../virtual-pc/venv/ops/lib/__init__.py | 264 +++ .../charms/virtual-pc/venv/ops/log.py | 58 + .../charms/virtual-pc/venv/ops/main.py | 406 +++++ .../charms/virtual-pc/venv/ops/model.py | 1314 +++++++++++++++ .../charms/virtual-pc/venv/ops/storage.py | 374 +++++ .../charms/virtual-pc/venv/ops/testing.py | 826 ++++++++++ .../charms/virtual-pc/venv/ops/version.py | 3 + .../charms/virtual-pc/venv/yaml/__init__.py | 427 +++++ .../yaml/_yaml.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 2342916 bytes .../charms/virtual-pc/venv/yaml/composer.py | 139 ++ .../virtual-pc/venv/yaml/constructor.py | 748 +++++++++ .../charms/virtual-pc/venv/yaml/cyaml.py | 101 ++ .../charms/virtual-pc/venv/yaml/dumper.py | 62 + .../charms/virtual-pc/venv/yaml/emitter.py | 1137 +++++++++++++ .../charms/virtual-pc/venv/yaml/error.py | 75 + .../charms/virtual-pc/venv/yaml/events.py | 86 + .../charms/virtual-pc/venv/yaml/loader.py | 63 + .../charms/virtual-pc/venv/yaml/nodes.py | 49 + .../charms/virtual-pc/venv/yaml/parser.py | 589 +++++++ .../charms/virtual-pc/venv/yaml/reader.py | 185 +++ .../virtual-pc/venv/yaml/representer.py | 389 +++++ .../charms/virtual-pc/venv/yaml/resolver.py | 227 +++ .../charms/virtual-pc/venv/yaml/scanner.py | 1435 +++++++++++++++++ .../charms/virtual-pc/venv/yaml/serializer.py | 111 ++ .../charms/virtual-pc/venv/yaml/tokens.py | 104 ++ .../cloud_init/virtual-pc_init | 4 + hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml | 66 + 81 files changed, 14250 insertions(+) create mode 100644 hackfest_virtual-pc_ns/README.md create mode 100644 hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/.jujuignore create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/LICENSE create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/README.md create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/config.yaml create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/metadata.yaml create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements-dev.txt create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements.txt create mode 100755 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/run_tests create mode 100755 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/test.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/color.pkla create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/startwm.sh create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/__init__.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/test_charm.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/LICENSE create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/README.md create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/config.yaml create mode 100755 hackfest_virtual-pc_vnfd/charms/virtual-pc/dispatch create mode 120000 hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/install create mode 120000 hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/start create mode 120000 hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/upgrade-charm create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/metadata.yaml create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements-dev.txt create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements.txt create mode 100755 hackfest_virtual-pc_vnfd/charms/virtual-pc/run_tests create mode 100755 hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/src/test.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/color.pkla create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/startwm.sh create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/__init__.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/test_charm.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/INSTALLER create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/LICENSE create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/METADATA create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/RECORD create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/WHEEL create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/top_level.txt create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/_yaml/__init__.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/INSTALLER create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/LICENSE.txt create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/METADATA create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/RECORD create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/WHEEL create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/top_level.txt create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/__init__.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/charm.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/framework.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/jujuversion.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/lib/__init__.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/log.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/main.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/model.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/storage.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/testing.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/version.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/__init__.py create mode 100755 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/_yaml.cpython-38-x86_64-linux-gnu.so create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/composer.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/constructor.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/cyaml.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/dumper.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/emitter.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/error.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/events.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/loader.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/nodes.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/parser.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/reader.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/representer.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/resolver.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/scanner.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/serializer.py create mode 100644 hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/tokens.py create mode 100644 hackfest_virtual-pc_vnfd/cloud_init/virtual-pc_init create mode 100644 hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml diff --git a/hackfest_virtual-pc_ns/README.md b/hackfest_virtual-pc_ns/README.md new file mode 100644 index 00000000..7c2c2af5 --- /dev/null +++ b/hackfest_virtual-pc_ns/README.md @@ -0,0 +1,3 @@ +# Descriptor created by OSM descriptor package generated + +**Created on 02/18/2021, 05:51:56 ** \ No newline at end of file diff --git a/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml b/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml new file mode 100644 index 00000000..12462518 --- /dev/null +++ b/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml @@ -0,0 +1,37 @@ +# Copyright 2019 ETSI OSM +# +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +nsd: + nsd: + - description: Virtual Desktop Computer with Xubuntu Desktop and RDP + designer: OSM + df: + - id: default-df + vnf-profile: + - id: '1' + virtual-link-connectivity: + - constituent-cpd-id: + - constituent-base-element-id: '1' + constituent-cpd-id: virtual-pc-mgmt-ext + virtual-link-profile-id: mgmtnet + vnfd-id: virtual-pc_vnfd + id: hackfest_virtual-pc_nsd + name: hackfest_virtual-pc_nsd + version: '1.0' + virtual-link-desc: + - id: mgmtnet + mgmt-network: 'true' + vnfd-id: + - virtual-pc_vnfd diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/.jujuignore b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/.jujuignore new file mode 100644 index 00000000..6ccd559e --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/.jujuignore @@ -0,0 +1,3 @@ +/venv +*.py[cod] +*.charm diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/LICENSE b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/LICENSE new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/README.md b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/README.md new file mode 100644 index 00000000..834c2b5b --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/README.md @@ -0,0 +1,55 @@ +# virtual-pc + +## Description + + +## Usage + +### Prepare the environment + +```bash +sudo snap install juju --classic --channel 2.8/stable +sudo snap install lxd +lxd.init +juju bootstrap lxd +juju add-model test-virtual-pc +``` + +### Deploy (from the Store) + +```bash +juju deploy cs:~charmed-osm/virtual-pc --channel edge +``` + +### Deploy (locally) + +Build the charm: + +```bash +virtualenv -p python3 venv +source venv/bin/activate +pip install -r requirements-dev.txt +pip install charmcraft +./venv/bin/charmcraft build +``` + +Deploy: + +```bash +juju deploy ./virtual-pc.charm +``` + +## Developing + +Create and activate a virtualenv with the development requirements: + + virtualenv -p python3 venv + source venv/bin/activate + pip install -r requirements-dev.txt + +## Testing + +The Python operator framework includes a very nice harness for testing +operator behaviour without full deployment. Just `run_tests`: + + ./run_tests diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml new file mode 100644 index 00000000..9a14be4d --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml @@ -0,0 +1,6 @@ +# Copyright 2020 ETSI OSM Contributors +# See LICENSE file for licensing details. +# +# This is only an example, and you should edit to suit your needs. +# If you don't need actions, you can remove the file entirely. +# It ties in to the example _on_fortune_action handler in src/charm.py diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/config.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/config.yaml new file mode 100644 index 00000000..c2c67568 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/config.yaml @@ -0,0 +1,6 @@ +# Copyright 2020 ETSI OSM Contributors +# See LICENSE file for licensing details. +# +# This is only an example, and you should edit to suit your needs. +# If you don't need config, you can remove the file entirely. +options: diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/metadata.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/metadata.yaml new file mode 100644 index 00000000..3d30a5b5 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/metadata.yaml @@ -0,0 +1,9 @@ +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. +name: virtual-pc +description: | + TODO: fill out the charm's description +summary: | + TODO: fill out the charm's summary +series: + - focal diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements-dev.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements-dev.txt new file mode 100644 index 00000000..34e6ef82 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements-dev.txt @@ -0,0 +1,3 @@ +-r requirements.txt +flake8 +charmcraft \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements.txt new file mode 100644 index 00000000..2d81d3bb --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/requirements.txt @@ -0,0 +1 @@ +ops diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/run_tests b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/run_tests new file mode 100755 index 00000000..08ec01e0 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/run_tests @@ -0,0 +1,16 @@ +#!/bin/sh -e +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. + +if [ -z "$VIRTUAL_ENV" -a -d venv/ ]; then + . venv/bin/activate +fi + +if [ -z "$PYTHONPATH" ]; then + export PYTHONPATH=src +else + export PYTHONPATH="src:$PYTHONPATH" +fi + +flake8 +python3 -m unittest -v "$@" diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py new file mode 100755 index 00000000..e068304f --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. + +from apt.progress.base import InstallProgress +import logging +import os +import shutil + +from jinja2 import Template +from ops.charm import CharmBase +from ops.framework import StoredState +from ops.main import main +from ops.model import ( + MaintenanceStatus, + ActiveStatus, + # BlockedStatus, +) +from utils import ( + service_stop, + service_restart, + install_apt, + shell, +) + + +# from typing import Dict, Any +logger = logging.getLogger(__name__) + +APT_REQUIREMENTS = [ + "firefox", + "mate-desktop", # 469 packages + "mate-applets", + "mate-applet-brisk-menu", + "mate-indicator-applet", + "mate-session-manager", + "mate-terminal", + "xrdp", +] +SNAP_INSTALLS = [ + "code --classic", +] +POLKIT_TEMPLATE = "./templates/color.pkla" +POLKIT_PATH = "/etc/polkit-1/localauthority/50-local.d/color.pkla" +STARTWM_TEMPLATE = "./templates/startwm.sh" +STARTWM_PATH = "/etc/xrdp/startwm.sh" +# WM_COMMAND = "startxfce4" # xubuntu-desktop +# WM_COMMAND = "budgie-desktop" # budgie-desktop-environment +WM_COMMAND = "mate-session" # mate-desktop + + +class VirtualPCCharm(CharmBase, InstallProgress): + _stored = StoredState() + + def __init__(self, *args): + super().__init__(*args) + InstallProgress.__init__(self) + + self._stored.set_default() + + # Basic hooks + self.framework.observe(self.on.install, self._on_install) + self.framework.observe(self.on.start, self._on_start) + self.framework.observe(self.on.stop, self._on_stop) + self.framework.observe(self.on.config_changed, self._on_config_changed) + self.framework.observe(self.on.update_status, self._on_update_status) + + # Actions hooks + + # Relations hooks + + # Override InstallProgress to update our status + def status_change(self, pkg, percent, status): + message = str(int(percent)) + "% " + status + self.unit.status = MaintenanceStatus(message) + + # Basic hooks + def _on_install(self, _): + self.unit.status = MaintenanceStatus("Installing apt packages") + install_apt(packages=APT_REQUIREMENTS, update=True, progress=self) + service_stop('xrdp') + + self.unit.status = MaintenanceStatus("Installing snaps") + for snap in SNAP_INSTALLS: + shell("sudo snap install " + snap) + + self.unit.status = MaintenanceStatus("Setting default display manager") + shell("echo /usr/sbin/lightdm | sudo tee /etc/X11/default-display-manager") + + self.unit.status = MaintenanceStatus("Adding XRDP to ssl-cert group") + shell("sudo adduser xrdp ssl-cert") + + self.unit.status = MaintenanceStatus("Generating Window Manager startup script") + with open(STARTWM_TEMPLATE, "r") as template: + content = Template(template.read()).render(command=WM_COMMAND) + with open(STARTWM_PATH, "w") as startwm: + startwm.write(content) + + self.unit.status = MaintenanceStatus("Generating Polkit files") + with open(POLKIT_TEMPLATE, "r") as template: + content = Template(template.read()).render() + with open(POLKIT_PATH, "w") as polkit: + polkit.write(content) + + self._stored.installed = True + + def _on_start(self, _): + self.unit.status = MaintenanceStatus("Starting XRDP server") + service_restart('xrdp') + self._stored.started = True + self.unit.status = self._get_current_status() + + def _on_stop(self, _): + service_stop('xrdp') + self._stored.started = False + self.unit.status = self._get_current_status() + + def _on_config_changed(self, _): + self.unit.status = self._get_current_status() + + def _on_update_status(self, _): + self.unit.status = self._get_current_status() + + # Action hooks + # Relation hooks + + # Private functions + def _get_current_status(self): + status_type = ActiveStatus + status_msg = "" + if self._stored.installed: + status_msg = "Ready" + return status_type(status_msg) + + +if __name__ == "__main__": + main(VirtualPCCharm) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/test.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/test.py new file mode 100644 index 00000000..f4cb4f75 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/test.py @@ -0,0 +1,17 @@ +from apt.progress.base import InstallProgress + +from utils import ( + install_apt, +) + + +class Progress(InstallProgress): + + def status_change(self, pkg, percent, status): + print("status change\n") + #print(str(int(percent)) + "% \n") + True + + +if __name__ == "__main__": + install_apt(packages=["mate-backgrounds"], update=True, progress=Progress()) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py new file mode 100644 index 00000000..a8dce1bf --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py @@ -0,0 +1,78 @@ +import apt +from apt.progress.base import OpProgress +import shutil +import subprocess +from typing import Dict, List, NoReturn + + +def service_active(service_name: str): + result = subprocess.run( + ["systemctl", "is-active", service_name], + stdout=subprocess.PIPE, + encoding="utf-8", + ) + return result.stdout == "active\n" + + +def all_values_set(dictionary: Dict[str, str]) -> bool: + return not any(v is None for v in dictionary.values()) + + +def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn: + + cache = apt.cache.Cache() + if update: + cache.update() + cache.open() + for package in packages: + pkg = cache[package] + if not pkg.is_installed: + pkg.mark_install() + cache.commit(install_progress=progress) + + +def remove_apt(packages: List, update: bool = False) -> NoReturn: + cache = apt.cache.Cache() + if update: + cache.update() + cache.open() + for package in packages: + pkg = cache[package] + if not pkg.is_installed: + pkg.mark_delete() + cache.commit() + + +def shell(command: str) -> NoReturn: + subprocess.run(command, shell=True).check_returncode() + + +def copy_files(origin: Dict[str, str], destination: Dict[str, str]) -> NoReturn: + for config, origin_path in origin.items(): + destination_path = destination[config] + shutil.copy(origin_path, destination_path) + + +# Service functions +def _systemctl(action: str, service_name: str) -> NoReturn: + subprocess.run(["systemctl", action, service_name]).check_returncode() + + +def service_start(service_name: str) -> NoReturn: + _systemctl("start", service_name) + + +def service_restart(service_name: str) -> NoReturn: + _systemctl("restart", service_name) + + +def service_stop(service_name: str) -> NoReturn: + _systemctl("stop", service_name) + + +def service_enable(service_name: str) -> NoReturn: + _systemctl("enable", service_name) + + +def systemctl_daemon_reload(): + subprocess.run(["systemctl", "daemon-reload"]).check_returncode() diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/color.pkla b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/color.pkla new file mode 100644 index 00000000..c8b94041 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/color.pkla @@ -0,0 +1,6 @@ +[Allow colord for all users] +Identity=unix-user:* +Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile +ResultAny=yes +ResultInactive=yes +ResultActive=yes \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/startwm.sh b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/startwm.sh new file mode 100644 index 00000000..0f3bdb21 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/templates/startwm.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# xrdp X session start script (c) 2015, 2017 mirabilos +# published under The MirOS Licence + +if test -r /etc/profile; then + . /etc/profile +fi + +if test -r /etc/default/locale; then + . /etc/default/locale + test -z "${LANG+x}" || export LANG + test -z "${LANGUAGE+x}" || export LANGUAGE + test -z "${LC_ADDRESS+x}" || export LC_ADDRESS + test -z "${LC_ALL+x}" || export LC_ALL + test -z "${LC_COLLATE+x}" || export LC_COLLATE + test -z "${LC_CTYPE+x}" || export LC_CTYPE + test -z "${LC_IDENTIFICATION+x}" || export LC_IDENTIFICATION + test -z "${LC_MEASUREMENT+x}" || export LC_MEASUREMENT + test -z "${LC_MESSAGES+x}" || export LC_MESSAGES + test -z "${LC_MONETARY+x}" || export LC_MONETARY + test -z "${LC_NAME+x}" || export LC_NAME + test -z "${LC_NUMERIC+x}" || export LC_NUMERIC + test -z "${LC_PAPER+x}" || export LC_PAPER + test -z "${LC_TELEPHONE+x}" || export LC_TELEPHONE + test -z "${LC_TIME+x}" || export LC_TIME + test -z "${LOCPATH+x}" || export LOCPATH +fi + +if test -r /etc/profile; then + . /etc/profile +fi + +{{ command }} diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/__init__.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/test_charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/test_charm.py new file mode 100644 index 00000000..4d456ec7 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/tests/test_charm.py @@ -0,0 +1,35 @@ +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. + +import unittest +from unittest.mock import Mock + +from ops.testing import Harness +from charm import SrsLteCharm + + +class TestCharm(unittest.TestCase): + def test_config_changed(self): + harness = Harness(SrsLteCharm) + self.addCleanup(harness.cleanup) + harness.begin() + self.assertEqual(list(harness.charm._stored.things), []) + harness.update_config({"thing": "foo"}) + self.assertEqual(list(harness.charm._stored.things), ["foo"]) + + def test_action(self): + harness = Harness(SrsLteCharm) + harness.begin() + # the harness doesn't (yet!) help much with actions themselves + action_event = Mock(params={"fail": ""}) + harness.charm._on_fortune_action(action_event) + + self.assertTrue(action_event.set_results.called) + + def test_action_fail(self): + harness = Harness(SrsLteCharm) + harness.begin() + action_event = Mock(params={"fail": "fail this"}) + harness.charm._on_fortune_action(action_event) + + self.assertEqual(action_event.fail.call_args, [("fail this",)]) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/LICENSE b/hackfest_virtual-pc_vnfd/charms/virtual-pc/LICENSE new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/README.md b/hackfest_virtual-pc_vnfd/charms/virtual-pc/README.md new file mode 100644 index 00000000..834c2b5b --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/README.md @@ -0,0 +1,55 @@ +# virtual-pc + +## Description + + +## Usage + +### Prepare the environment + +```bash +sudo snap install juju --classic --channel 2.8/stable +sudo snap install lxd +lxd.init +juju bootstrap lxd +juju add-model test-virtual-pc +``` + +### Deploy (from the Store) + +```bash +juju deploy cs:~charmed-osm/virtual-pc --channel edge +``` + +### Deploy (locally) + +Build the charm: + +```bash +virtualenv -p python3 venv +source venv/bin/activate +pip install -r requirements-dev.txt +pip install charmcraft +./venv/bin/charmcraft build +``` + +Deploy: + +```bash +juju deploy ./virtual-pc.charm +``` + +## Developing + +Create and activate a virtualenv with the development requirements: + + virtualenv -p python3 venv + source venv/bin/activate + pip install -r requirements-dev.txt + +## Testing + +The Python operator framework includes a very nice harness for testing +operator behaviour without full deployment. Just `run_tests`: + + ./run_tests diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml new file mode 100644 index 00000000..9a14be4d --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml @@ -0,0 +1,6 @@ +# Copyright 2020 ETSI OSM Contributors +# See LICENSE file for licensing details. +# +# This is only an example, and you should edit to suit your needs. +# If you don't need actions, you can remove the file entirely. +# It ties in to the example _on_fortune_action handler in src/charm.py diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/config.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc/config.yaml new file mode 100644 index 00000000..c2c67568 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/config.yaml @@ -0,0 +1,6 @@ +# Copyright 2020 ETSI OSM Contributors +# See LICENSE file for licensing details. +# +# This is only an example, and you should edit to suit your needs. +# If you don't need config, you can remove the file entirely. +options: diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/dispatch b/hackfest_virtual-pc_vnfd/charms/virtual-pc/dispatch new file mode 100755 index 00000000..fe31c056 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/dispatch @@ -0,0 +1,3 @@ +#!/bin/sh + +JUJU_DISPATCH_PATH="${JUJU_DISPATCH_PATH:-$0}" PYTHONPATH=lib:venv ./src/charm.py diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/install b/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/install new file mode 120000 index 00000000..8b970447 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/install @@ -0,0 +1 @@ +../dispatch \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/start b/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/start new file mode 120000 index 00000000..8b970447 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/start @@ -0,0 +1 @@ +../dispatch \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/upgrade-charm b/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/upgrade-charm new file mode 120000 index 00000000..8b970447 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/hooks/upgrade-charm @@ -0,0 +1 @@ +../dispatch \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/metadata.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc/metadata.yaml new file mode 100644 index 00000000..3d30a5b5 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/metadata.yaml @@ -0,0 +1,9 @@ +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. +name: virtual-pc +description: | + TODO: fill out the charm's description +summary: | + TODO: fill out the charm's summary +series: + - focal diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements-dev.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements-dev.txt new file mode 100644 index 00000000..34e6ef82 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements-dev.txt @@ -0,0 +1,3 @@ +-r requirements.txt +flake8 +charmcraft \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements.txt new file mode 100644 index 00000000..2d81d3bb --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/requirements.txt @@ -0,0 +1 @@ +ops diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/run_tests b/hackfest_virtual-pc_vnfd/charms/virtual-pc/run_tests new file mode 100755 index 00000000..08ec01e0 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/run_tests @@ -0,0 +1,16 @@ +#!/bin/sh -e +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. + +if [ -z "$VIRTUAL_ENV" -a -d venv/ ]; then + . venv/bin/activate +fi + +if [ -z "$PYTHONPATH" ]; then + export PYTHONPATH=src +else + export PYTHONPATH="src:$PYTHONPATH" +fi + +flake8 +python3 -m unittest -v "$@" diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py new file mode 100755 index 00000000..1d720012 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. + +from apt.progress.base import InstallProgress +import logging +import os +import shutil + +from jinja2 import Template +from ops.charm import CharmBase +from ops.framework import StoredState +from ops.main import main +from ops.model import ( + MaintenanceStatus, + ActiveStatus, + # BlockedStatus, +) +from utils import ( + service_stop, + service_restart, + install_apt, + shell, +) + + +# from typing import Dict, Any +logger = logging.getLogger(__name__) + +APT_REQUIREMENTS = [ + "firefox", + "mate-desktop", # 469 packages + "mate-applets", + "mate-applet-brisk-menu", + "mate-indicator-applet", + "mate-session-manager", + "indicator-applet-session", + "mate-terminal", + "xrdp", +] +SNAP_INSTALLS = [ + "code --classic", +] +POLKIT_TEMPLATE = "./templates/color.pkla" +POLKIT_PATH = "/etc/polkit-1/localauthority/50-local.d/color.pkla" +STARTWM_TEMPLATE = "./templates/startwm.sh" +STARTWM_PATH = "/etc/xrdp/startwm.sh" +# WM_COMMAND = "startxfce4" # xubuntu-desktop +# WM_COMMAND = "budgie-desktop" # budgie-desktop-environment +WM_COMMAND = "mate-session" # mate-desktop + + +class VirtualPCCharm(CharmBase, InstallProgress): + _stored = StoredState() + + def __init__(self, *args): + super().__init__(*args) + InstallProgress.__init__(self) + + self._stored.set_default() + + # Basic hooks + self.framework.observe(self.on.install, self._on_install) + self.framework.observe(self.on.start, self._on_start) + self.framework.observe(self.on.stop, self._on_stop) + self.framework.observe(self.on.config_changed, self._on_config_changed) + self.framework.observe(self.on.update_status, self._on_update_status) + + # Actions hooks + + # Relations hooks + + # Override InstallProgress to update our status + def status_change(self, pkg, percent, status): + message = str(int(percent)) + "% " + status + self.unit.status = MaintenanceStatus(message) + + # Basic hooks + def _on_install(self, _): + self.unit.status = MaintenanceStatus("Installing apt packages") + install_apt(packages=APT_REQUIREMENTS, update=True, progress=self) + service_stop('xrdp') + + self.unit.status = MaintenanceStatus("Installing snaps") + for snap in SNAP_INSTALLS: + shell("sudo snap install " + snap) + + self.unit.status = MaintenanceStatus("Setting default display manager") + shell("echo /usr/sbin/lightdm | sudo tee /etc/X11/default-display-manager") + + self.unit.status = MaintenanceStatus("Adding XRDP to ssl-cert group") + shell("sudo adduser xrdp ssl-cert") + + self.unit.status = MaintenanceStatus("Generating Window Manager startup script") + with open(STARTWM_TEMPLATE, "r") as template: + content = Template(template.read()).render(command=WM_COMMAND) + with open(STARTWM_PATH, "w") as startwm: + startwm.write(content) + + self.unit.status = MaintenanceStatus("Generating Polkit files") + with open(POLKIT_TEMPLATE, "r") as template: + content = Template(template.read()).render() + with open(POLKIT_PATH, "w") as polkit: + polkit.write(content) + + self._stored.installed = True + + def _on_start(self, _): + self.unit.status = MaintenanceStatus("Starting XRDP server") + service_restart('xrdp') + self._stored.started = True + self.unit.status = self._get_current_status() + + def _on_stop(self, _): + service_stop('xrdp') + self._stored.started = False + self.unit.status = self._get_current_status() + + def _on_config_changed(self, _): + self.unit.status = self._get_current_status() + + def _on_update_status(self, _): + self.unit.status = self._get_current_status() + + # Action hooks + # Relation hooks + + # Private functions + def _get_current_status(self): + status_type = ActiveStatus + status_msg = "" + if self._stored.installed: + status_msg = "Ready" + return status_type(status_msg) + + +if __name__ == "__main__": + main(VirtualPCCharm) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/test.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/test.py new file mode 100644 index 00000000..f4cb4f75 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/test.py @@ -0,0 +1,17 @@ +from apt.progress.base import InstallProgress + +from utils import ( + install_apt, +) + + +class Progress(InstallProgress): + + def status_change(self, pkg, percent, status): + print("status change\n") + #print(str(int(percent)) + "% \n") + True + + +if __name__ == "__main__": + install_apt(packages=["mate-backgrounds"], update=True, progress=Progress()) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py new file mode 100644 index 00000000..a8dce1bf --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py @@ -0,0 +1,78 @@ +import apt +from apt.progress.base import OpProgress +import shutil +import subprocess +from typing import Dict, List, NoReturn + + +def service_active(service_name: str): + result = subprocess.run( + ["systemctl", "is-active", service_name], + stdout=subprocess.PIPE, + encoding="utf-8", + ) + return result.stdout == "active\n" + + +def all_values_set(dictionary: Dict[str, str]) -> bool: + return not any(v is None for v in dictionary.values()) + + +def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn: + + cache = apt.cache.Cache() + if update: + cache.update() + cache.open() + for package in packages: + pkg = cache[package] + if not pkg.is_installed: + pkg.mark_install() + cache.commit(install_progress=progress) + + +def remove_apt(packages: List, update: bool = False) -> NoReturn: + cache = apt.cache.Cache() + if update: + cache.update() + cache.open() + for package in packages: + pkg = cache[package] + if not pkg.is_installed: + pkg.mark_delete() + cache.commit() + + +def shell(command: str) -> NoReturn: + subprocess.run(command, shell=True).check_returncode() + + +def copy_files(origin: Dict[str, str], destination: Dict[str, str]) -> NoReturn: + for config, origin_path in origin.items(): + destination_path = destination[config] + shutil.copy(origin_path, destination_path) + + +# Service functions +def _systemctl(action: str, service_name: str) -> NoReturn: + subprocess.run(["systemctl", action, service_name]).check_returncode() + + +def service_start(service_name: str) -> NoReturn: + _systemctl("start", service_name) + + +def service_restart(service_name: str) -> NoReturn: + _systemctl("restart", service_name) + + +def service_stop(service_name: str) -> NoReturn: + _systemctl("stop", service_name) + + +def service_enable(service_name: str) -> NoReturn: + _systemctl("enable", service_name) + + +def systemctl_daemon_reload(): + subprocess.run(["systemctl", "daemon-reload"]).check_returncode() diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/color.pkla b/hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/color.pkla new file mode 100644 index 00000000..c8b94041 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/color.pkla @@ -0,0 +1,6 @@ +[Allow colord for all users] +Identity=unix-user:* +Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile +ResultAny=yes +ResultInactive=yes +ResultActive=yes \ No newline at end of file diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/startwm.sh b/hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/startwm.sh new file mode 100644 index 00000000..0f3bdb21 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/templates/startwm.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# xrdp X session start script (c) 2015, 2017 mirabilos +# published under The MirOS Licence + +if test -r /etc/profile; then + . /etc/profile +fi + +if test -r /etc/default/locale; then + . /etc/default/locale + test -z "${LANG+x}" || export LANG + test -z "${LANGUAGE+x}" || export LANGUAGE + test -z "${LC_ADDRESS+x}" || export LC_ADDRESS + test -z "${LC_ALL+x}" || export LC_ALL + test -z "${LC_COLLATE+x}" || export LC_COLLATE + test -z "${LC_CTYPE+x}" || export LC_CTYPE + test -z "${LC_IDENTIFICATION+x}" || export LC_IDENTIFICATION + test -z "${LC_MEASUREMENT+x}" || export LC_MEASUREMENT + test -z "${LC_MESSAGES+x}" || export LC_MESSAGES + test -z "${LC_MONETARY+x}" || export LC_MONETARY + test -z "${LC_NAME+x}" || export LC_NAME + test -z "${LC_NUMERIC+x}" || export LC_NUMERIC + test -z "${LC_PAPER+x}" || export LC_PAPER + test -z "${LC_TELEPHONE+x}" || export LC_TELEPHONE + test -z "${LC_TIME+x}" || export LC_TIME + test -z "${LOCPATH+x}" || export LOCPATH +fi + +if test -r /etc/profile; then + . /etc/profile +fi + +{{ command }} diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/__init__.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/test_charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/test_charm.py new file mode 100644 index 00000000..4d456ec7 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/tests/test_charm.py @@ -0,0 +1,35 @@ +# Copyright 2020 David Garcia +# See LICENSE file for licensing details. + +import unittest +from unittest.mock import Mock + +from ops.testing import Harness +from charm import SrsLteCharm + + +class TestCharm(unittest.TestCase): + def test_config_changed(self): + harness = Harness(SrsLteCharm) + self.addCleanup(harness.cleanup) + harness.begin() + self.assertEqual(list(harness.charm._stored.things), []) + harness.update_config({"thing": "foo"}) + self.assertEqual(list(harness.charm._stored.things), ["foo"]) + + def test_action(self): + harness = Harness(SrsLteCharm) + harness.begin() + # the harness doesn't (yet!) help much with actions themselves + action_event = Mock(params={"fail": ""}) + harness.charm._on_fortune_action(action_event) + + self.assertTrue(action_event.set_results.called) + + def test_action_fail(self): + harness = Harness(SrsLteCharm) + harness.begin() + action_event = Mock(params={"fail": "fail this"}) + harness.charm._on_fortune_action(action_event) + + self.assertEqual(action_event.fail.call_args, [("fail this",)]) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/INSTALLER b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/LICENSE b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/LICENSE new file mode 100644 index 00000000..2f1b8e15 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2017-2021 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/METADATA b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/METADATA new file mode 100644 index 00000000..565f05b7 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/METADATA @@ -0,0 +1,46 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 5.4.1 +Summary: YAML parser and emitter for Python +Home-page: https://pyyaml.org/ +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: https://pypi.org/project/PyYAML/ +Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues +Project-URL: CI, https://github.com/yaml/pyyaml/actions +Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation +Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core +Project-URL: Source Code, https://github.com/yaml/pyyaml +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Cython +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.* + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistence. + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/RECORD b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/RECORD new file mode 100644 index 00000000..68ca4da2 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/RECORD @@ -0,0 +1,43 @@ +PyYAML-5.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-5.4.1.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 +PyYAML-5.4.1.dist-info/METADATA,sha256=XnrM5LY-uS85ica26gKUK0dGG-xmPjmGfDTSLpIHQFk,2087 +PyYAML-5.4.1.dist-info/RECORD,, +PyYAML-5.4.1.dist-info/WHEEL,sha256=Dh4w5P6PPWbqyqoE6MHlzbFQwZXlM-voWJDf2WUsS2g,108 +PyYAML-5.4.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402 +_yaml/__pycache__/__init__.cpython-38.pyc,, +yaml/__init__.py,sha256=gfp2CbRVhzknghkiiJD2l6Z0pI-mv_iZHPSJ4aj0-nY,13170 +yaml/__pycache__/__init__.cpython-38.pyc,sha256=n0YyVkjiOLmcjlR2NXE5TIZf7Z2clZ6sqQ5KlyuTWSI,11845 +yaml/__pycache__/composer.cpython-38.pyc,sha256=OVPzAKAvC2-Tiv4HUwUUG9JHCzG17nvsRQcFTCtY9xs,3563 +yaml/__pycache__/constructor.cpython-38.pyc,sha256=EXPDY7Prtv3F6QbXiJc5F4BvJQyCCGRu83WF4u6X7Vo,20822 +yaml/__pycache__/cyaml.cpython-38.pyc,sha256=wI01UFU-WhUcdnnczL5QpKu0ZNQTttSzXbleIvIfcvM,3411 +yaml/__pycache__/dumper.cpython-38.pyc,sha256=9wIctrlMpF4ksMWuCc5QAyZSenGiRVyrtU-1pAfj54U,1823 +yaml/__pycache__/emitter.cpython-38.pyc,sha256=kd_QGJd0GjpfgQPN9DlG_7HwKfJnJ24JxtdiUOxM9iE,25353 +yaml/__pycache__/error.cpython-38.pyc,sha256=j6mkXgDmzV0y0lo6FeUrvZL2vHN6Vkc52k0_R0oOn6g,2300 +yaml/__pycache__/events.cpython-38.pyc,sha256=NFsoAO36pPL_uxoCO-xRxKndQ3vx47mkStOYjfoQVZ8,3974 +yaml/__pycache__/loader.cpython-38.pyc,sha256=lEMB2brjPrfMjXXTJpCEx6-ct4eI6LYovD4hW5ZuGsw,2164 +yaml/__pycache__/nodes.cpython-38.pyc,sha256=Kkxh_oL04gQg-YFWwnfjpIoYspsXO4GEqKTr3NbxOD8,1725 +yaml/__pycache__/parser.cpython-38.pyc,sha256=0R9Qx0cBMUoOLzMOWeXCyXsC4S4KJ7oPHdmTVPQ4FbQ,11924 +yaml/__pycache__/reader.cpython-38.pyc,sha256=ZpOMJ6rZDc8EWffI4vZR_Fhcu3WmhgT_GAkDrKkEtPo,4537 +yaml/__pycache__/representer.cpython-38.pyc,sha256=tR9wWffCThWXwQe47uYFdHg2bCkqNjBcwmG7RSHmWS4,10069 +yaml/__pycache__/resolver.cpython-38.pyc,sha256=zsLBuCKn8KAJPVGo5J_xZSytifJktdTtkUNnltOt__I,5498 +yaml/__pycache__/scanner.cpython-38.pyc,sha256=N8ubxRd6bZBjoRna6CU8wK1Imb_7TWOsudzPh9JDDkQ,25269 +yaml/__pycache__/serializer.cpython-38.pyc,sha256=9JDH7ONP5zFlep0f2yNWRoOSZr5Y28jL012O1EIbuug,3320 +yaml/__pycache__/tokens.cpython-38.pyc,sha256=haBW6UBDhVFog2xIe63OkrAP_9JRFyNKCROFPRJiyu0,4935 +yaml/_yaml.cpython-38-x86_64-linux-gnu.so,sha256=fxjEXaSdzion1SMwhu9Ikx-JOVNtcl6KvW_pyGBt-cU,2342916 +yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 +yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639 +yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851 +yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 +yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 +yaml/representer.py,sha256=82UM3ZxUQKqsKAF4ltWOxCS6jGPIFtXpGs7mvqyv4Xs,14184 +yaml/resolver.py,sha256=Z1W8AOMA6Proy4gIO2OhUO4IPS_bFNAl0Ca3rwChpPg,8999 +yaml/scanner.py,sha256=KeQIKGNlSyPE8QDwionHxy9CgbqE5teJEz05FR9-nAg,51277 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/WHEEL b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/WHEEL new file mode 100644 index 00000000..69d594f0 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: false +Tag: cp38-cp38-manylinux1_x86_64 + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/top_level.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/top_level.txt new file mode 100644 index 00000000..e6475e91 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/PyYAML-5.4.1.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_yaml +yaml diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/_yaml/__init__.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/_yaml/__init__.py new file mode 100644 index 00000000..7baa8c4b --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/_yaml/__init__.py @@ -0,0 +1,33 @@ +# This is a stub package designed to roughly emulate the _yaml +# extension module, which previously existed as a standalone module +# and has been moved into the `yaml` package namespace. +# It does not perfectly mimic its old counterpart, but should get +# close enough for anyone who's relying on it even when they shouldn't. +import yaml + +# in some circumstances, the yaml module we imoprted may be from a different version, so we need +# to tread carefully when poking at it here (it may not have the attributes we expect) +if not getattr(yaml, '__with_libyaml__', False): + from sys import version_info + + exc = ModuleNotFoundError if version_info >= (3, 6) else ImportError + raise exc("No module named '_yaml'") +else: + from yaml._yaml import * + import warnings + warnings.warn( + 'The _yaml extension module is now located at yaml._yaml' + ' and its location is subject to change. To use the' + ' LibYAML-based parser and emitter, import from `yaml`:' + ' `from yaml import CLoader as Loader, CDumper as Dumper`.', + DeprecationWarning + ) + del warnings + # Don't `del yaml` here because yaml is actually an existing + # namespace member of _yaml. + +__name__ = '_yaml' +# If the module is top-level (i.e. not a part of any specific package) +# then the attribute should be set to ''. +# https://docs.python.org/3.8/library/types.html +__package__ = '' diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/INSTALLER b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/LICENSE.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/LICENSE.txt new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/METADATA b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/METADATA new file mode 100644 index 00000000..cd45af93 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/METADATA @@ -0,0 +1,263 @@ +Metadata-Version: 2.1 +Name: ops +Version: 1.1.0 +Summary: The Python library behind great charms +Home-page: https://github.com/canonical/operator +Author: The Charmcraft team at Canonical Ltd. +Author-email: charmcraft@lists.launchpad.net +License: Apache-2.0 +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: POSIX :: Linux +Requires-Python: >=3.5 +Description-Content-Type: text/markdown +Requires-Dist: PyYAML + +# The Operator Framework + +This Operator Framework simplifies [Kubernetes +operator](https://charmhub.io/about) development for +[model-driven application +management](https://juju.is/model-driven-operations). + +A Kubernetes operator is a container that drives lifecycle management, +configuration, integration and daily actions for an application. +Operators simplify software management and operations. They capture +reusable app domain knowledge from experts in a software component that +can be shared. + +This project extends the operator pattern to enable +[universal operators](https://juju.is/universal-operators), not just +for Kubernetes but also operators for traditional Linux or Windows +application management. + +Operators use an [Operator Lifecycle Manager +(OLM)](https://juju.is/operator-lifecycle-manager) to coordinate their +work in a cluster. The system uses Golang for concurrent event +processing under the hood, but enables the operators to be written in +Python. + +## Simple, composable operators + +Operators should 'do one thing and do it well'. Each operator drives a +single microservice and can be [composed with other +operators](https://juju.is/integration) to deliver a complex application. + +It is better to have small, reusable operators that each drive a single +microservice very well. The operator handles instantiation, scaling, +configuration, optimisation, networking, service mesh, observability, +and day-2 operations specific to that microservice. + +Operator composition takes place through declarative integration in +the OLM. Operators declare integration endpoints, and discover lines of +integration between those endpoints dynamically at runtime. + +## Pure Python operators + +The framework provides a standard Python library and object model that +represents the application graph, and an event distribution mechanism for +distributed system coordination and communication. + +The OLM is written in Golang for efficient concurrency in event handling +and distribution. Operators can be written in any language. We recommend +this Python framework for ease of design, development and collaboration. + +## Better collaboration + +Operator developers publish Python libraries that make it easy to integrate +your operator with their operator. The framework includes standard tools +to distribute these integration libraries and keep them up to date. + +Development collaboration happens at [Charmhub.io](https://charmhub.io/) where +operators are published along with integration libraries. Design and +code review discussions are hosted in the +[Charmhub forum](https://discourse.charmhub.io/). We recommend the +[Open Operator Manifesto](https://charmhub.io/manifesto) as a guideline for +high quality operator engineering. + +## Event serialization and operator services + +Distributed systems can be hard! So this framework exists to make it much +simpler to reason about operator behaviour, especially in complex deployments. +The OLM provides [operator services](https://juju.is/operator-services) such +as provisioning, event delivery, leader election and model management. + +Coordination between operators is provided by a cluster-wide event +distribution system. Events are serialized to avoid race conditions in any +given container or machine. This greatly simplifies the development of +operators for high availability, scale-out and integrated applications. + +## Model-driven Operator Lifecycle Manager + +A key goal of the project is to improve the user experience for admins +working with multiple different operators. + +We embrace [model-driven operations](https://juju.is/model-driven-operations) +in the Operator Lifecycle Manager. The model encompasses capacity, +storage, networking, the application graph and administrative access. + +Admins describe the application graph of integrated microservices, and +the OLM then drives instantiation. A change in the model is propagated +to all affected operators, reducing the duplication of effort and +repetition normally found in operating a complex topology of services. + +Administrative actions, updates, configuration and integration are all +driven through the OLM. + +# Getting started + +A package of operator code is called a charm. You will use `charmcraft` +to register your operator name, and publish it when you are ready. + +``` +$ sudo snap install charmcraft --beta +charmcraft (beta) 0.6.0 from John Lenton (chipaca) installed +``` + +Charms written using the operator framework are just Python code. The goal +is to feel natural for somebody used to coding in Python, and reasonably +easy to learn for somebody who is not a pythonista. + +The dependencies of the operator framework are kept as minimal as possible; +currently that's Python 3.5 or greater, and `PyYAML` (both are included by +default in Ubuntu's cloud images from 16.04 on). + +# A quick introduction + +Make an empty directory `my-charm` and cd into it. Then start a new charm +with: + +``` +$ charmcraft init +All done. +There are some notes about things we think you should do. +These are marked with ‘TODO:’, as is customary. Namely: + README.md: fill out the description + README.md: explain how to use the charm + metadata.yaml: fill out the charm's description + metadata.yaml: fill out the charm's summary +``` + +Charmed operators are just Python code. The entry point to your charm can +be any filename, by default this is `src/charm.py` which must be executable +(and probably have `#!/usr/bin/env python3` on the first line). + +You need a `metadata.yaml` to describe your charm, and if you will support +configuration of your charm then `config.yaml` files is required too. The +`requirements.txt` specifies any Python dependencies. + +``` +$ tree my-charm/ +my-charm/ +├── actions.yaml +├── config.yaml +├── LICENSE +├── metadata.yaml +├── README.md +├── requirements-dev.txt +├── requirements.txt +├── run_tests +├── src +│   └── charm.py +├── tests +│   ├── __init__.py +│   └── my_charm.py +``` + +`src/charm.py` here is the entry point to your charm code. At a minimum, it +needs to define a subclass of `CharmBase` and pass that into the framework +`main` function: + +```python +from ops.charm import CharmBase +from ops.main import main + +class MyCharm(CharmBase): + def __init__(self, *args): + super().__init__(*args) + self.framework.observe(self.on.start, self.on_start) + + def on_start(self, event): + # Handle the start event here. + +if __name__ == "__main__": + main(MyCharm) +``` + +That should be enough for you to be able to run + +``` +$ charmcraft build +Done, charm left in 'my-charm.charm' +$ juju deploy ./my-charm.charm +``` + +> 🛈 More information on [`charmcraft`](https://pypi.org/project/charmcraft/) can +> also be found on its [github page](https://github.com/canonical/charmcraft). + +Happy charming! + +# Testing your charms + +The operator framework provides a testing harness, so you can check your +charm does the right thing in different scenarios, without having to create +a full deployment. `pydoc3 ops.testing` has the details, including this +example: + +```python +harness = Harness(MyCharm) +# Do initial setup here +relation_id = harness.add_relation('db', 'postgresql') +# Now instantiate the charm to see events as the model changes +harness.begin() +harness.add_relation_unit(relation_id, 'postgresql/0') +harness.update_relation_data(relation_id, 'postgresql/0', {'key': 'val'}) +# Check that charm has properly handled the relation_joined event for postgresql/0 +self.assertEqual(harness.charm. ...) +``` + +## Talk to us + +If you need help, have ideas, or would just like to chat with us, reach out on +IRC: we're in [#smooth-operator] on freenode (or try the [webchat]). + +We also pay attention to [Charmhub discourse](https://discourse.charmhub.io/) + +You can also deep dive into the [API docs] if that's your thing. + +[webchat]: https://webchat.freenode.net/#smooth-operator +[#smooth-operator]: irc://chat.freenode.net/%23smooth-operator +[discourse]: https://discourse.juju.is/c/charming +[API docs]: https://ops.rtfd.io/ + +## Operator Framework development + +To work in the framework itself you will need Python >= 3.5 and the +dependencies in `requirements-dev.txt` installed in your system, or a +virtualenv: + + virtualenv --python=python3 env + source env/bin/activate + pip install -r requirements-dev.txt + +Then you can try `./run_tests`, it should all go green. + +For improved performance on the tests, ensure that you have PyYAML +installed with the correct extensions: + + apt-get install libyaml-dev + pip install --force-reinstall --no-cache-dir pyyaml + +If you want to build the documentation you'll need the requirements from +`docs/requirements.txt`, or in your virtualenv + + pip install -r docs/requirements.txt + +and then you can run `./build_docs`. + + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/RECORD b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/RECORD new file mode 100644 index 00000000..35eb15f5 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/RECORD @@ -0,0 +1,28 @@ +ops-1.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +ops-1.1.0.dist-info/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +ops-1.1.0.dist-info/METADATA,sha256=ffVuqPnEob6-iBYjEf3lPShSbToJL17obFFufoW2F4g,9485 +ops-1.1.0.dist-info/RECORD,, +ops-1.1.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +ops-1.1.0.dist-info/top_level.txt,sha256=enC05wWafSg8iDKIvj3gvtAtEP2kYCyN5Gmd689q-_I,4 +ops/__init__.py,sha256=WaHb0dfp1KEe6jFV8Pm_mcdJ3ModiWujnQ6xLjNzPNQ,819 +ops/__pycache__/__init__.cpython-38.pyc,, +ops/__pycache__/charm.cpython-38.pyc,, +ops/__pycache__/framework.cpython-38.pyc,, +ops/__pycache__/jujuversion.cpython-38.pyc,, +ops/__pycache__/log.cpython-38.pyc,, +ops/__pycache__/main.cpython-38.pyc,, +ops/__pycache__/model.cpython-38.pyc,, +ops/__pycache__/storage.cpython-38.pyc,, +ops/__pycache__/testing.cpython-38.pyc,, +ops/__pycache__/version.cpython-38.pyc,, +ops/charm.py,sha256=7KyaNNA0t_a0h0hrzehSEWm4xU_Y5JIqGWHTg747qfU,32817 +ops/framework.py,sha256=1ByOtFKRR6kRzOEbfWnGEMNevixOYf18U0oZxKq8LsA,43769 +ops/jujuversion.py,sha256=9wMlUmngcAENV9RkgVVLWtZsyRQaf6XNrQQqUeY_fHA,4139 +ops/lib/__init__.py,sha256=QizPpuRWXjqbH5Gv7mnH8CcPR9BX7q2YNFnxyoSsA0g,9213 +ops/lib/__pycache__/__init__.cpython-38.pyc,, +ops/log.py,sha256=JVpt_Vkf_lWO2cucUcJfXjAWVTattk4xBscSs65Sn3I,2155 +ops/main.py,sha256=BUJZM4soFpsY4bO6zJ1bSHQeWJcm028gq0MhJT3rC8M,15523 +ops/model.py,sha256=yvM1yhidNyGpVdxkG365jPJRhQuE42EiiojBHJ7tL3c,47930 +ops/storage.py,sha256=jEfszzQGYDrl5wa03I6txvea-7lI661Yq6n7sIPa0fU,14192 +ops/testing.py,sha256=sH8PoNzGmfPdVWM1lBjStxHcNfQHsasFjF-WzHfDhFA,34898 +ops/version.py,sha256=UuaLFU_UN-InNFu4I23Y22huxQdbsOgTQ_d_r623fx4,46 diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/WHEEL b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/WHEEL new file mode 100644 index 00000000..b552003f --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/top_level.txt b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/top_level.txt new file mode 100644 index 00000000..2d81d3bb --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops-1.1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +ops diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/__init__.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/__init__.py new file mode 100644 index 00000000..f17b2969 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/__init__.py @@ -0,0 +1,20 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""The Operator Framework.""" + +from .version import version as __version__ # noqa: F401 (imported but unused) + +# Import here the bare minimum to break the circular import between modules +from . import charm # noqa: F401 (imported but unused) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/charm.py new file mode 100644 index 00000000..82ed2fdd --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/charm.py @@ -0,0 +1,823 @@ +# Copyright 2019-2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Base objects for the Charm, events and metadata.""" + +import enum +import os +import pathlib +import typing + +import yaml + +from ops.framework import Object, EventSource, EventBase, Framework, ObjectEvents +from ops import model + + +def _loadYaml(source): + if yaml.__with_libyaml__: + return yaml.load(source, Loader=yaml.CSafeLoader) + return yaml.load(source, Loader=yaml.SafeLoader) + + +class HookEvent(EventBase): + """Events raised by Juju to progress a charm's lifecycle. + + Hooks are callback methods of a charm class (a subclass of + :class:`CharmBase`) that are invoked in response to events raised + by Juju. These callback methods are the means by which a charm + governs the lifecycle of its application. + + The :class:`HookEvent` class is the base of a type hierarchy of events + related to the charm's lifecycle. + + :class:`HookEvent` subtypes are grouped into the following categories + + - Core lifecycle events + - Relation events + - Storage events + - Metric events + """ + + +class ActionEvent(EventBase): + """Events raised by Juju when an administrator invokes a Juju Action. + + This class is the data type of events triggered when an administrator + invokes a Juju Action. Callbacks bound to these events may be used + for responding to the administrator's Juju Action request. + + To read the parameters for the action, see the instance variable :attr:`params`. + To respond with the result of the action, call :meth:`set_results`. To add + progress messages that are visible as the action is progressing use + :meth:`log`. + + Attributes: + params: The parameters passed to the action. + """ + + def defer(self): + """Action events are not deferable like other events. + + This is because an action runs synchronously and the administrator + is waiting for the result. + """ + raise RuntimeError('cannot defer action events') + + def restore(self, snapshot: dict) -> None: + """Used by the operator framework to record the action. + + Not meant to be called directly by charm code. + """ + env_action_name = os.environ.get('JUJU_ACTION_NAME') + event_action_name = self.handle.kind[:-len('_action')].replace('_', '-') + if event_action_name != env_action_name: + # This could only happen if the dev manually emits the action, or from a bug. + raise RuntimeError('action event kind does not match current action') + # Params are loaded at restore rather than __init__ because + # the model is not available in __init__. + self.params = self.framework.model._backend.action_get() + + def set_results(self, results: typing.Mapping) -> None: + """Report the result of the action. + + Args: + results: The result of the action as a Dict + """ + self.framework.model._backend.action_set(results) + + def log(self, message: str) -> None: + """Send a message that a user will see while the action is running. + + Args: + message: The message for the user. + """ + self.framework.model._backend.action_log(message) + + def fail(self, message: str = '') -> None: + """Report that this action has failed. + + Args: + message: Optional message to record why it has failed. + """ + self.framework.model._backend.action_fail(message) + + +class InstallEvent(HookEvent): + """Event triggered when a charm is installed. + + This event is triggered at the beginning of a charm's + lifecycle. Any associated callback method should be used to + perform one-time setup operations, such as installing prerequisite + software. + """ + + +class StartEvent(HookEvent): + """Event triggered immediately after first configuation change. + + This event is triggered immediately after the first + :class:`ConfigChangedEvent`. Callback methods bound to the event should be + used to ensure that the charm’s software is in a running state. Note that + the charm’s software should be configured so as to persist in this state + through reboots without further intervention on Juju’s part. + """ + + +class StopEvent(HookEvent): + """Event triggered when a charm is shut down. + + This event is triggered when an application's removal is requested + by the client. The event fires immediately before the end of the + unit’s destruction sequence. Callback methods bound to this event + should be used to ensure that the charm’s software is not running, + and that it will not start again on reboot. + """ + + +class RemoveEvent(HookEvent): + """Event triggered when a unit is about to be terminated. + + This event fires prior to Juju removing the charm and terminating its unit. + """ + + +class ConfigChangedEvent(HookEvent): + """Event triggered when a configuration change is requested. + + This event fires in several different situations. + + - immediately after the :class:`install ` event. + - after a :class:`relation is created `. + - after a :class:`leader is elected `. + - after changing charm configuration using the GUI or command line + interface + - when the charm :class:`starts `. + - when a new unit :class:`joins a relation `. + - when there is a :class:`change to an existing relation `. + + Any callback method bound to this event cannot assume that the + software has already been started; it should not start stopped + software, but should (if appropriate) restart running software to + take configuration changes into account. + """ + + +class UpdateStatusEvent(HookEvent): + """Event triggered by a status update request from Juju. + + This event is periodically triggered by Juju so that it can + provide constant feedback to the administrator about the status of + the application the charm is modeling. Any callback method bound + to this event should determine the "health" of the application and + set the status appropriately. + + The interval between :class:`update-status ` events can + be configured model-wide, e.g. ``juju model-config + update-status-hook-interval=1m``. + """ + + +class UpgradeCharmEvent(HookEvent): + """Event triggered by request to upgrade the charm. + + This event will be triggered when an administrator executes ``juju + upgrade-charm``. The event fires after Juju has unpacked the upgraded charm + code, and so this event will be handled by the callback method bound to the + event in the new codebase. The associated callback method is invoked + provided there is no existing error state. The callback method should be + used to reconcile current state written by an older version of the charm + into whatever form that is needed by the current charm version. + """ + + +class PreSeriesUpgradeEvent(HookEvent): + """Event triggered to prepare a unit for series upgrade. + + This event triggers when an administrator executes ``juju upgrade-series + MACHINE prepare``. The event will fire for each unit that is running on the + specified machine. Any callback method bound to this event must prepare the + charm for an upgrade to the series. This may include things like exporting + database content to a version neutral format, or evacuating running + instances to other machines. + + It can be assumed that only after all units on a machine have executed the + callback method associated with this event, the administrator will initiate + steps to actually upgrade the series. After the upgrade has been completed, + the :class:`PostSeriesUpgradeEvent` will fire. + """ + + +class PostSeriesUpgradeEvent(HookEvent): + """Event triggered after a series upgrade. + + This event is triggered after the administrator has done a distribution + upgrade (or rolled back and kept the same series). It is called in response + to ``juju upgrade-series MACHINE complete``. Associated charm callback + methods are expected to do whatever steps are necessary to reconfigure their + applications for the new series. This may include things like populating the + upgraded version of a database. Note however charms are expected to check if + the series has actually changed or whether it was rolled back to the + original series. + """ + + +class LeaderElectedEvent(HookEvent): + """Event triggered when a new leader has been elected. + + Juju will trigger this event when a new leader unit is chosen for + a given application. + + This event fires at least once after Juju selects a leader + unit. Callback methods bound to this event may take any action + required for the elected unit to assert leadership. Note that only + the elected leader unit will receive this event. + """ + + +class LeaderSettingsChangedEvent(HookEvent): + """Event triggered when leader changes any settings. + + DEPRECATED NOTICE + + This event has been deprecated in favor of using a Peer relation, + and having the leader set a value in the Application data bag for + that peer relation. (see :class:`RelationChangedEvent`). + """ + + +class CollectMetricsEvent(HookEvent): + """Event triggered by Juju to collect metrics. + + Juju fires this event every five minutes for the lifetime of the + unit. Callback methods bound to this event may use the :meth:`add_metrics` + method of this class to send measurements to Juju. + + Note that associated callback methods are currently sandboxed in + how they can interact with Juju. + """ + + def add_metrics(self, metrics: typing.Mapping, labels: typing.Mapping = None) -> None: + """Record metrics that have been gathered by the charm for this unit. + + Args: + metrics: A collection of {key: float} pairs that contains the + metrics that have been gathered + labels: {key:value} strings that can be applied to the + metrics that are being gathered + """ + self.framework.model._backend.add_metrics(metrics, labels) + + +class RelationEvent(HookEvent): + """A base class representing the various relation lifecycle events. + + Relation lifecycle events are generated when application units + participate in relations. Units can only participate in relations + after they have been "started", and before they have been + "stopped". Within that time window, the unit may participate in + several different relations at a time, including multiple + relations with the same name. + + Attributes: + relation: The :class:`~ops.model.Relation` involved in this event + app: The remote :class:`~ops.model.Application` that has triggered this + event + unit: The remote unit that has triggered this event. This may be + ``None`` if the relation event was triggered as an + :class:`~ops.model.Application` level event + + """ + + def __init__(self, handle, relation, app=None, unit=None): + super().__init__(handle) + + if unit is not None and unit.app != app: + raise RuntimeError( + 'cannot create RelationEvent with application {} and unit {}'.format(app, unit)) + + self.relation = relation + self.app = app + self.unit = unit + + def snapshot(self) -> dict: + """Used by the framework to serialize the event to disk. + + Not meant to be called by charm code. + """ + snapshot = { + 'relation_name': self.relation.name, + 'relation_id': self.relation.id, + } + if self.app: + snapshot['app_name'] = self.app.name + if self.unit: + snapshot['unit_name'] = self.unit.name + return snapshot + + def restore(self, snapshot: dict) -> None: + """Used by the framework to deserialize the event from disk. + + Not meant to be called by charm code. + """ + self.relation = self.framework.model.get_relation( + snapshot['relation_name'], snapshot['relation_id']) + + app_name = snapshot.get('app_name') + if app_name: + self.app = self.framework.model.get_app(app_name) + else: + self.app = None + + unit_name = snapshot.get('unit_name') + if unit_name: + self.unit = self.framework.model.get_unit(unit_name) + else: + self.unit = None + + +class RelationCreatedEvent(RelationEvent): + """Event triggered when a new relation is created. + + This is triggered when a new relation to another app is added in Juju. This + can occur before units for those applications have started. All existing + relations should be established before start. + """ + + +class RelationJoinedEvent(RelationEvent): + """Event triggered when a new unit joins a relation. + + This event is triggered whenever a new unit of a related + application joins the relation. The event fires only when that + remote unit is first observed by the unit. Callback methods bound + to this event may set any local unit settings that can be + determined using no more than the name of the joining unit and the + remote ``private-address`` setting, which is always available when + the relation is created and is by convention not deleted. + """ + + +class RelationChangedEvent(RelationEvent): + """Event triggered when relation data changes. + + This event is triggered whenever there is a change to the data bucket for a + related application or unit. Look at ``event.relation.data[event.unit/app]`` + to see the new information, where ``event`` is the event object passed to + the callback method bound to this event. + + This event always fires once, after :class:`RelationJoinedEvent`, and + will subsequently fire whenever that remote unit changes its settings for + the relation. Callback methods bound to this event should be the only ones + that rely on remote relation settings. They should not error if the settings + are incomplete, since it can be guaranteed that when the remote unit or + application changes its settings, the event will fire again. + + The settings that may be queried, or set, are determined by the relation’s + interface. + """ + + +class RelationDepartedEvent(RelationEvent): + """Event triggered when a unit leaves a relation. + + This is the inverse of the :class:`RelationJoinedEvent`, representing when a + unit is leaving the relation (the unit is being removed, the app is being + removed, the relation is being removed). It is fired once for each unit that + is going away. + + When the remote unit is known to be leaving the relation, this will result + in the :class:`RelationChangedEvent` firing at least once, after which the + :class:`RelationDepartedEvent` will fire. The :class:`RelationDepartedEvent` + will fire once only. Once the :class:`RelationDepartedEvent` has fired no + further :class:`RelationChangedEvent` will fire. + + Callback methods bound to this event may be used to remove all + references to the departing remote unit, because there’s no + guarantee that it’s still part of the system; it’s perfectly + probable (although not guaranteed) that the system running that + unit has already shut down. + + Once all callback methods bound to this event have been run for such a + relation, the unit agent will fire the :class:`RelationBrokenEvent`. + """ + + +class RelationBrokenEvent(RelationEvent): + """Event triggered when a relation is removed. + + If a relation is being removed (``juju remove-relation`` or ``juju + remove-application``), once all the units have been removed, this event will + fire to signal that the relationship has been fully terminated. + + The event indicates that the current relation is no longer valid, and that + the charm’s software must be configured as though the relation had never + existed. It will only be called after every callback method bound to + :class:`RelationDepartedEvent` has been run. If a callback method + bound to this event is being executed, it is gauranteed that no remote units + are currently known locally. + """ + + +class StorageEvent(HookEvent): + """Base class representing storage-related events. + + Juju can provide a variety of storage types to a charms. The + charms can define several different types of storage that are + allocated from Juju. Changes in state of storage trigger sub-types + of :class:`StorageEvent`. + """ + + +class StorageAttachedEvent(StorageEvent): + """Event triggered when new storage becomes available. + + This event is triggered when new storage is available for the + charm to use. + + Callback methods bound to this event allow the charm to run code + when storage has been added. Such methods will be run before the + :class:`InstallEvent` fires, so that the installation routine may + use the storage. The name prefix of this hook will depend on the + storage key defined in the ``metadata.yaml`` file. + """ + + +class StorageDetachingEvent(StorageEvent): + """Event triggered prior to removal of storage. + + This event is triggered when storage a charm has been using is + going away. + + Callback methods bound to this event allow the charm to run code + before storage is removed. Such methods will be run before storage + is detached, and always before the :class:`StopEvent` fires, thereby + allowing the charm to gracefully release resources before they are + removed and before the unit terminates. The name prefix of the + hook will depend on the storage key defined in the ``metadata.yaml`` + file. + """ + + +class CharmEvents(ObjectEvents): + """Events generated by Juju pertaining to application lifecycle. + + This class is used to create an event descriptor (``self.on``) attribute for + a charm class that inherits from :class:`CharmBase`. The event descriptor + may be used to set up event handlers for corresponding events. + + By default the following events will be provided through + :class:`CharmBase`:: + + self.on.install + self.on.start + self.on.remove + self.on.update_status + self.on.config_changed + self.on.upgrade_charm + self.on.pre_series_upgrade + self.on.post_series_upgrade + self.on.leader_elected + self.on.collect_metrics + + + In addition to these, depending on the charm's metadata (``metadata.yaml``), + named relation and storage events may also be defined. These named events + are created by :class:`CharmBase` using charm metadata. The named events may be + accessed as ``self.on[].`` + """ + + install = EventSource(InstallEvent) + start = EventSource(StartEvent) + stop = EventSource(StopEvent) + remove = EventSource(RemoveEvent) + update_status = EventSource(UpdateStatusEvent) + config_changed = EventSource(ConfigChangedEvent) + upgrade_charm = EventSource(UpgradeCharmEvent) + pre_series_upgrade = EventSource(PreSeriesUpgradeEvent) + post_series_upgrade = EventSource(PostSeriesUpgradeEvent) + leader_elected = EventSource(LeaderElectedEvent) + leader_settings_changed = EventSource(LeaderSettingsChangedEvent) + collect_metrics = EventSource(CollectMetricsEvent) + + +class CharmBase(Object): + """Base class that represents the charm overall. + + :class:`CharmBase` is used to create a charm. This is done by inheriting + from :class:`CharmBase` and customising the sub class as required. So to + create your own charm, say ``MyCharm``, define a charm class and set up the + required event handlers (“hooks”) in its constructor:: + + import logging + + from ops.charm import CharmBase + from ops.main import main + + logger = logging.getLogger(__name__) + + def MyCharm(CharmBase): + def __init__(self, *args): + logger.debug('Initializing Charm') + + super().__init__(*args) + + self.framework.observe(self.on.config_changed, self._on_config_changed) + self.framework.observe(self.on.stop, self._on_stop) + # ... + + if __name__ == "__main__": + main(MyCharm) + + As shown in the example above, a charm class is instantiated by + :func:`~ops.main.main` rather than charm authors directly instantiating a + charm. + + Args: + framework: The framework responsible for managing the Model and events for this + charm. + key: Ignored; will remove after deprecation period of the signature change. + + """ + + # note that without the #: below, sphinx will copy the whole of CharmEvents + # docstring inline which is less than ideal. + #: Used to set up event handlers; see :class:`CharmEvents`. + on = CharmEvents() + + def __init__(self, framework: Framework, key: typing.Optional = None): + super().__init__(framework, None) + + for relation_name in self.framework.meta.relations: + relation_name = relation_name.replace('-', '_') + self.on.define_event(relation_name + '_relation_created', RelationCreatedEvent) + self.on.define_event(relation_name + '_relation_joined', RelationJoinedEvent) + self.on.define_event(relation_name + '_relation_changed', RelationChangedEvent) + self.on.define_event(relation_name + '_relation_departed', RelationDepartedEvent) + self.on.define_event(relation_name + '_relation_broken', RelationBrokenEvent) + + for storage_name in self.framework.meta.storages: + storage_name = storage_name.replace('-', '_') + self.on.define_event(storage_name + '_storage_attached', StorageAttachedEvent) + self.on.define_event(storage_name + '_storage_detaching', StorageDetachingEvent) + + for action_name in self.framework.meta.actions: + action_name = action_name.replace('-', '_') + self.on.define_event(action_name + '_action', ActionEvent) + + @property + def app(self) -> model.Application: + """Application that this unit is part of.""" + return self.framework.model.app + + @property + def unit(self) -> model.Unit: + """Unit that this execution is responsible for.""" + return self.framework.model.unit + + @property + def meta(self) -> 'CharmMeta': + """Metadata of this charm.""" + return self.framework.meta + + @property + def charm_dir(self) -> pathlib.Path: + """Root directory of the charm as it is running.""" + return self.framework.charm_dir + + @property + def config(self) -> model.ConfigData: + """A mapping containing the charm's config and current values.""" + return self.model.config + + +class CharmMeta: + """Object containing the metadata for the charm. + + This is read from ``metadata.yaml`` and/or ``actions.yaml``. Generally + charms will define this information, rather than reading it at runtime. This + class is mostly for the framework to understand what the charm has defined. + + The :attr:`maintainers`, :attr:`tags`, :attr:`terms`, :attr:`series`, and + :attr:`extra_bindings` attributes are all lists of strings. The + :attr:`requires`, :attr:`provides`, :attr:`peers`, :attr:`relations`, + :attr:`storages`, :attr:`resources`, and :attr:`payloads` attributes are all + mappings of names to instances of the respective :class:`RelationMeta`, + :class:`StorageMeta`, :class:`ResourceMeta`, or :class:`PayloadMeta`. + + The :attr:`relations` attribute is a convenience accessor which includes all + of the ``requires``, ``provides``, and ``peers`` :class:`RelationMeta` + items. If needed, the role of the relation definition can be obtained from + its :attr:`role ` attribute. + + Attributes: + name: The name of this charm + summary: Short description of what this charm does + description: Long description for this charm + maintainers: A list of strings of the email addresses of the maintainers + of this charm. + tags: Charm store tag metadata for categories associated with this charm. + terms: Charm store terms that should be agreed to before this charm can + be deployed. (Used for things like licensing issues.) + series: The list of supported OS series that this charm can support. + The first entry in the list is the default series that will be + used by deploy if no other series is requested by the user. + subordinate: True/False whether this charm is intended to be used as a + subordinate charm. + min_juju_version: If supplied, indicates this charm needs features that + are not available in older versions of Juju. + requires: A dict of {name: :class:`RelationMeta` } for each 'requires' relation. + provides: A dict of {name: :class:`RelationMeta` } for each 'provides' relation. + peers: A dict of {name: :class:`RelationMeta` } for each 'peer' relation. + relations: A dict containing all :class:`RelationMeta` attributes (merged from other + sections) + storages: A dict of {name: :class:`StorageMeta`} for each defined storage. + resources: A dict of {name: :class:`ResourceMeta`} for each defined resource. + payloads: A dict of {name: :class:`PayloadMeta`} for each defined payload. + extra_bindings: A dict of additional named bindings that a charm can use + for network configuration. + actions: A dict of {name: :class:`ActionMeta`} for actions that the charm has defined. + Args: + raw: a mapping containing the contents of metadata.yaml + actions_raw: a mapping containing the contents of actions.yaml + + """ + + def __init__(self, raw: dict = {}, actions_raw: dict = {}): + self.name = raw.get('name', '') + self.summary = raw.get('summary', '') + self.description = raw.get('description', '') + self.maintainers = [] + if 'maintainer' in raw: + self.maintainers.append(raw['maintainer']) + if 'maintainers' in raw: + self.maintainers.extend(raw['maintainers']) + self.tags = raw.get('tags', []) + self.terms = raw.get('terms', []) + self.series = raw.get('series', []) + self.subordinate = raw.get('subordinate', False) + self.min_juju_version = raw.get('min-juju-version') + self.requires = {name: RelationMeta(RelationRole.requires, name, rel) + for name, rel in raw.get('requires', {}).items()} + self.provides = {name: RelationMeta(RelationRole.provides, name, rel) + for name, rel in raw.get('provides', {}).items()} + self.peers = {name: RelationMeta(RelationRole.peer, name, rel) + for name, rel in raw.get('peers', {}).items()} + self.relations = {} + self.relations.update(self.requires) + self.relations.update(self.provides) + self.relations.update(self.peers) + self.storages = {name: StorageMeta(name, storage) + for name, storage in raw.get('storage', {}).items()} + self.resources = {name: ResourceMeta(name, res) + for name, res in raw.get('resources', {}).items()} + self.payloads = {name: PayloadMeta(name, payload) + for name, payload in raw.get('payloads', {}).items()} + self.extra_bindings = raw.get('extra-bindings', {}) + self.actions = {name: ActionMeta(name, action) for name, action in actions_raw.items()} + + @classmethod + def from_yaml( + cls, metadata: typing.Union[str, typing.TextIO], + actions: typing.Optional[typing.Union[str, typing.TextIO]] = None): + """Instantiate a CharmMeta from a YAML description of metadata.yaml. + + Args: + metadata: A YAML description of charm metadata (name, relations, etc.) + This can be a simple string, or a file-like object. (passed to `yaml.safe_load`). + actions: YAML description of Actions for this charm (eg actions.yaml) + """ + meta = _loadYaml(metadata) + raw_actions = {} + if actions is not None: + raw_actions = _loadYaml(actions) + if raw_actions is None: + raw_actions = {} + return cls(meta, raw_actions) + + +class RelationRole(enum.Enum): + """An annotation for a charm's role in a relation. + + For each relation a charm's role may be + + - A Peer + - A service consumer in the relation ('requires') + - A service provider in the relation ('provides') + """ + peer = 'peer' + requires = 'requires' + provides = 'provides' + + def is_peer(self) -> bool: + """Return whether the current role is peer. + + A convenience to avoid having to import charm. + """ + return self is RelationRole.peer + + +class RelationMeta: + """Object containing metadata about a relation definition. + + Should not be constructed directly by charm code. Is gotten from one of + :attr:`CharmMeta.peers`, :attr:`CharmMeta.requires`, :attr:`CharmMeta.provides`, + or :attr:`CharmMeta.relations`. + + Attributes: + role: This is :class:`RelationRole`; one of peer/requires/provides + relation_name: Name of this relation from metadata.yaml + interface_name: Optional definition of the interface protocol. + scope: "global" or "container" scope based on how the relation should be used. + """ + + def __init__(self, role: RelationRole, relation_name: str, raw: dict): + if not isinstance(role, RelationRole): + raise TypeError("role should be a Role, not {!r}".format(role)) + self.role = role + self.relation_name = relation_name + self.interface_name = raw['interface'] + self.scope = raw.get('scope') + + +class StorageMeta: + """Object containing metadata about a storage definition. + + Attributes: + storage_name: Name of storage + type: Storage type + description: A text description of the storage + read_only: Whether or not the storage is read only + minimum_size: Minimum size of storage + location: Mount point of storage + multiple_range: Range of numeric qualifiers when multiple storage units are used + """ + + def __init__(self, name, raw): + self.storage_name = name + self.type = raw['type'] + self.description = raw.get('description', '') + self.shared = raw.get('shared', False) + self.read_only = raw.get('read-only', False) + self.minimum_size = raw.get('minimum-size') + self.location = raw.get('location') + self.multiple_range = None + if 'multiple' in raw: + range = raw['multiple']['range'] + if '-' not in range: + self.multiple_range = (int(range), int(range)) + else: + range = range.split('-') + self.multiple_range = (int(range[0]), int(range[1]) if range[1] else None) + + +class ResourceMeta: + """Object containing metadata about a resource definition. + + Attributes: + resource_name: Name of resource + filename: Name of file + description: A text description of resource + """ + + def __init__(self, name, raw): + self.resource_name = name + self.type = raw['type'] + self.filename = raw.get('filename', None) + self.description = raw.get('description', '') + + +class PayloadMeta: + """Object containing metadata about a payload definition. + + Attributes: + payload_name: Name of payload + type: Payload type + """ + + def __init__(self, name, raw): + self.payload_name = name + self.type = raw['type'] + + +class ActionMeta: + """Object containing metadata about an action's definition.""" + + def __init__(self, name, raw=None): + raw = raw or {} + self.name = name + self.title = raw.get('title', '') + self.description = raw.get('description', '') + self.parameters = raw.get('params', {}) # {: } + self.required = raw.get('required', []) # [, ...] diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/framework.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/framework.py new file mode 100644 index 00000000..d20c0007 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/framework.py @@ -0,0 +1,1199 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""The Operator Framework infrastructure.""" + +import collections +import collections.abc +import inspect +import keyword +import logging +import marshal +import os +import pathlib +import pdb +import re +import sys +import types +import weakref + +from ops import charm +from ops.storage import ( + NoSnapshotError, + SQLiteStorage, +) + +logger = logging.getLogger(__name__) + + +class Handle: + """Handle defines a name for an object in the form of a hierarchical path. + + The provided parent is the object (or that object's handle) that this handle + sits under, or None if the object identified by this handle stands by itself + as the root of its own hierarchy. + + The handle kind is a string that defines a namespace so objects with the + same parent and kind will have unique keys. + + The handle key is a string uniquely identifying the object. No other objects + under the same parent and kind may have the same key. + """ + + def __init__(self, parent, kind, key): + if parent and not isinstance(parent, Handle): + parent = parent.handle + self._parent = parent + self._kind = kind + self._key = key + if parent: + if key: + self._path = "{}/{}[{}]".format(parent, kind, key) + else: + self._path = "{}/{}".format(parent, kind) + else: + if key: + self._path = "{}[{}]".format(kind, key) + else: + self._path = "{}".format(kind) + + def nest(self, kind, key): + """Create a new handle as child of the current one.""" + return Handle(self, kind, key) + + def __hash__(self): + return hash((self.parent, self.kind, self.key)) + + def __eq__(self, other): + return (self.parent, self.kind, self.key) == (other.parent, other.kind, other.key) + + def __str__(self): + return self.path + + @property + def parent(self): + """Return own parent handle.""" + return self._parent + + @property + def kind(self): + """Return the handle's kind.""" + return self._kind + + @property + def key(self): + """Return the handle's key.""" + return self._key + + @property + def path(self): + """Return the handle's path.""" + return self._path + + @classmethod + def from_path(cls, path): + """Build a handle from the indicated path.""" + handle = None + for pair in path.split("/"): + pair = pair.split("[") + good = False + if len(pair) == 1: + kind, key = pair[0], None + good = True + elif len(pair) == 2: + kind, key = pair + if key and key[-1] == ']': + key = key[:-1] + good = True + if not good: + raise RuntimeError("attempted to restore invalid handle path {}".format(path)) + handle = Handle(handle, kind, key) + return handle + + +class EventBase: + """The base for all the different Events. + + Inherit this and override 'snapshot' and 'restore' methods to build a custom event. + """ + + def __init__(self, handle): + self.handle = handle + self.deferred = False + + def __repr__(self): + return "<%s via %s>" % (self.__class__.__name__, self.handle) + + def defer(self): + """Defer the event to the future. + + Deferring an event from a handler puts that handler into a queue, to be + called again the next time the charm is invoked. This invocation may be + the result of an action, or any event other than metric events. The + queue of events will be dispatched before the new event is processed. + + From the above you may deduce, but it's important to point out: + + * ``defer()`` does not interrupt the execution of the current event + handler. In almost all cases, a call to ``defer()`` should be followed + by an explicit ``return`` from the handler; + + * the re-execution of the deferred event handler starts from the top of + the handler method (not where defer was called); + + * only the handlers that actually called ``defer()`` are called again + (that is: despite talking about “deferring an event” it is actually + the handler/event combination that is deferred); and + + * any deferred events get processed before the event (or action) that + caused the current invocation of the charm. + + The general desire to call ``defer()`` happens when some precondition + isn't yet met. However, care should be exercised as to whether it is + better to defer this event so that you see it again, or whether it is + better to just wait for the event that indicates the precondition has + been met. + + For example, if ``config-changed`` is fired, and you are waiting for + different config, there is no reason to defer the event because there + will be a *different* ``config-changed`` event when the config actually + changes, rather than checking to see if maybe config has changed prior + to every other event that occurs. + + Similarly, if you need 2 events to occur before you are ready to + proceed (say event A and B). When you see event A, you could chose to + ``defer()`` it because you haven't seen B yet. However, that leads to: + + 1. event A fires, calls defer() + + 2. event B fires, event A handler is called first, still hasn't seen B + happen, so is deferred again. Then B happens, which progresses since + it has seen A. + + 3. At some future time, event C happens, which also checks if A can + proceed. + + """ + logger.debug("Deferring %s.", self) + self.deferred = True + + def snapshot(self): + """Return the snapshot data that should be persisted. + + Subclasses must override to save any custom state. + """ + return None + + def restore(self, snapshot): + """Restore the value state from the given snapshot. + + Subclasses must override to restore their custom state. + """ + self.deferred = False + + +class EventSource: + """EventSource wraps an event type with a descriptor to facilitate observing and emitting. + + It is generally used as: + + class SomethingHappened(EventBase): + pass + + class SomeObject(Object): + something_happened = EventSource(SomethingHappened) + + With that, instances of that type will offer the someobj.something_happened + attribute which is a BoundEvent and may be used to emit and observe the event. + """ + + def __init__(self, event_type): + if not isinstance(event_type, type) or not issubclass(event_type, EventBase): + raise RuntimeError( + 'Event requires a subclass of EventBase as an argument, got {}'.format(event_type)) + self.event_type = event_type + self.event_kind = None + self.emitter_type = None + + def _set_name(self, emitter_type, event_kind): + if self.event_kind is not None: + raise RuntimeError( + 'EventSource({}) reused as {}.{} and {}.{}'.format( + self.event_type.__name__, + self.emitter_type.__name__, + self.event_kind, + emitter_type.__name__, + event_kind, + )) + self.event_kind = event_kind + self.emitter_type = emitter_type + + def __get__(self, emitter, emitter_type=None): + if emitter is None: + return self + # Framework might not be available if accessed as CharmClass.on.event + # rather than charm_instance.on.event, but in that case it couldn't be + # emitted anyway, so there's no point to registering it. + framework = getattr(emitter, 'framework', None) + if framework is not None: + framework.register_type(self.event_type, emitter, self.event_kind) + return BoundEvent(emitter, self.event_type, self.event_kind) + + +class BoundEvent: + """Event bound to an Object.""" + + def __repr__(self): + return ''.format( + self.event_type.__name__, + type(self.emitter).__name__, + self.event_kind, + hex(id(self)), + ) + + def __init__(self, emitter, event_type, event_kind): + self.emitter = emitter + self.event_type = event_type + self.event_kind = event_kind + + def emit(self, *args, **kwargs): + """Emit event to all registered observers. + + The current storage state is committed before and after each observer is notified. + """ + framework = self.emitter.framework + key = framework._next_event_key() + event = self.event_type(Handle(self.emitter, self.event_kind, key), *args, **kwargs) + framework._emit(event) + + +class HandleKind: + """Helper descriptor to define the Object.handle_kind field. + + The handle_kind for an object defaults to its type name, but it may + be explicitly overridden if desired. + """ + + def __get__(self, obj, obj_type): + kind = obj_type.__dict__.get("handle_kind") + if kind: + return kind + return obj_type.__name__ + + +class _Metaclass(type): + """Helper class to ensure proper instantiation of Object-derived classes. + + This class currently has a single purpose: events derived from EventSource + that are class attributes of Object-derived classes need to be told what + their name is in that class. For example, in + + class SomeObject(Object): + something_happened = EventSource(SomethingHappened) + + the instance of EventSource needs to know it's called 'something_happened'. + + Starting from python 3.6 we could use __set_name__ on EventSource for this, + but until then this (meta)class does the equivalent work. + + TODO: when we drop support for 3.5 drop this class, and rename _set_name in + EventSource to __set_name__; everything should continue to work. + + """ + + def __new__(typ, *a, **kw): + k = super().__new__(typ, *a, **kw) + # k is now the Object-derived class; loop over its class attributes + for n, v in vars(k).items(): + # we could do duck typing here if we want to support + # non-EventSource-derived shenanigans. We don't. + if isinstance(v, EventSource): + # this is what 3.6+ does automatically for us: + v._set_name(k, n) + return k + + +class Object(metaclass=_Metaclass): + """Base class of all the charm-related objects.""" + + handle_kind = HandleKind() + + def __init__(self, parent, key): + kind = self.handle_kind + if isinstance(parent, Framework): + self.framework = parent + # Avoid Framework instances having a circular reference to themselves. + if self.framework is self: + self.framework = weakref.proxy(self.framework) + self.handle = Handle(None, kind, key) + else: + self.framework = parent.framework + self.handle = Handle(parent, kind, key) + self.framework._track(self) + + # TODO Detect conflicting handles here. + + @property + def model(self): + """Shortcut for more simple access the model.""" + return self.framework.model + + +class ObjectEvents(Object): + """Convenience type to allow defining .on attributes at class level.""" + + handle_kind = "on" + + def __init__(self, parent=None, key=None): + if parent is not None: + super().__init__(parent, key) + else: + self._cache = weakref.WeakKeyDictionary() + + def __get__(self, emitter, emitter_type): + if emitter is None: + return self + instance = self._cache.get(emitter) + if instance is None: + # Same type, different instance, more data. Doing this unusual construct + # means people can subclass just this one class to have their own 'on'. + instance = self._cache[emitter] = type(self)(emitter) + return instance + + @classmethod + def define_event(cls, event_kind, event_type): + """Define an event on this type at runtime. + + cls: a type to define an event on. + + event_kind: an attribute name that will be used to access the + event. Must be a valid python identifier, not be a keyword + or an existing attribute. + + event_type: a type of the event to define. + + """ + prefix = 'unable to define an event with event_kind that ' + if not event_kind.isidentifier(): + raise RuntimeError(prefix + 'is not a valid python identifier: ' + event_kind) + elif keyword.iskeyword(event_kind): + raise RuntimeError(prefix + 'is a python keyword: ' + event_kind) + try: + getattr(cls, event_kind) + raise RuntimeError( + prefix + 'overlaps with an existing type {} attribute: {}'.format(cls, event_kind)) + except AttributeError: + pass + + event_descriptor = EventSource(event_type) + event_descriptor._set_name(cls, event_kind) + setattr(cls, event_kind, event_descriptor) + + def _event_kinds(self): + event_kinds = [] + # We have to iterate over the class rather than instance to allow for properties which + # might call this method (e.g., event views), leading to infinite recursion. + for attr_name, attr_value in inspect.getmembers(type(self)): + if isinstance(attr_value, EventSource): + # We actually care about the bound_event, however, since it + # provides the most info for users of this method. + event_kinds.append(attr_name) + return event_kinds + + def events(self): + """Return a mapping of event_kinds to bound_events for all available events.""" + return {event_kind: getattr(self, event_kind) for event_kind in self._event_kinds()} + + def __getitem__(self, key): + return PrefixedEvents(self, key) + + def __repr__(self): + k = type(self) + event_kinds = ', '.join(sorted(self._event_kinds())) + return '<{}.{}: {}>'.format(k.__module__, k.__qualname__, event_kinds) + + +class PrefixedEvents: + """Events to be found in all events using a specific prefix.""" + + def __init__(self, emitter, key): + self._emitter = emitter + self._prefix = key.replace("-", "_") + '_' + + def __getattr__(self, name): + return getattr(self._emitter, self._prefix + name) + + +class PreCommitEvent(EventBase): + """Events that will be emited first on commit.""" + + +class CommitEvent(EventBase): + """Events that will be emited second on commit.""" + + +class FrameworkEvents(ObjectEvents): + """Manager of all framework events.""" + pre_commit = EventSource(PreCommitEvent) + commit = EventSource(CommitEvent) + + +class NoTypeError(Exception): + """No class to hold it was found when restoring an event.""" + + def __init__(self, handle_path): + self.handle_path = handle_path + + def __str__(self): + return "cannot restore {} since no class was registered for it".format(self.handle_path) + + +# the message to show to the user when a pdb breakpoint goes active +_BREAKPOINT_WELCOME_MESSAGE = """ +Starting pdb to debug charm operator. +Run `h` for help, `c` to continue, or `exit`/CTRL-d to abort. +Future breakpoints may interrupt execution again. +More details at https://discourse.jujucharms.com/t/debugging-charm-hooks + +""" + + +_event_regex = r'^(|.*/)on/[a-zA-Z_]+\[\d+\]$' + + +class Framework(Object): + """Main interface to from the Charm to the Operator Framework internals.""" + + on = FrameworkEvents() + + # Override properties from Object so that we can set them in __init__. + model = None + meta = None + charm_dir = None + + def __init__(self, storage, charm_dir, meta, model): + + super().__init__(self, None) + + self.charm_dir = charm_dir + self.meta = meta + self.model = model + self._observers = [] # [(observer_path, method_name, parent_path, event_key)] + self._observer = weakref.WeakValueDictionary() # {observer_path: observer} + self._objects = weakref.WeakValueDictionary() + self._type_registry = {} # {(parent_path, kind): cls} + self._type_known = set() # {cls} + + if isinstance(storage, (str, pathlib.Path)): + logger.warning( + "deprecated: Framework now takes a Storage not a path") + storage = SQLiteStorage(storage) + self._storage = storage + + # We can't use the higher-level StoredState because it relies on events. + self.register_type(StoredStateData, None, StoredStateData.handle_kind) + stored_handle = Handle(None, StoredStateData.handle_kind, '_stored') + try: + self._stored = self.load_snapshot(stored_handle) + except NoSnapshotError: + self._stored = StoredStateData(self, '_stored') + self._stored['event_count'] = 0 + + # Flag to indicate that we already presented the welcome message in a debugger breakpoint + self._breakpoint_welcomed = False + + # Parse the env var once, which may be used multiple times later + debug_at = os.environ.get('JUJU_DEBUG_AT') + self._juju_debug_at = debug_at.split(',') if debug_at else () + + def set_breakpointhook(self): + """Hook into sys.breakpointhook so the builtin breakpoint() works as expected. + + This method is called by ``main``, and is not intended to be + called by users of the framework itself outside of perhaps + some testing scenarios. + + It returns the old value of sys.excepthook. + + The breakpoint function is a Python >= 3.7 feature. + + This method was added in ops 1.0; before that, it was done as + part of the Framework's __init__. + """ + old_breakpointhook = getattr(sys, 'breakpointhook', None) + if old_breakpointhook is not None: + # Hook into builtin breakpoint, so if Python >= 3.7, devs will be able to just do + # breakpoint() + sys.breakpointhook = self.breakpoint + return old_breakpointhook + + def close(self): + """Close the underlying backends.""" + self._storage.close() + + def _track(self, obj): + """Track object and ensure it is the only object created using its handle path.""" + if obj is self: + # Framework objects don't track themselves + return + if obj.handle.path in self.framework._objects: + raise RuntimeError( + 'two objects claiming to be {} have been created'.format(obj.handle.path)) + self._objects[obj.handle.path] = obj + + def _forget(self, obj): + """Stop tracking the given object. See also _track.""" + self._objects.pop(obj.handle.path, None) + + def commit(self): + """Save changes to the underlying backends.""" + # Give a chance for objects to persist data they want to before a commit is made. + self.on.pre_commit.emit() + # Make sure snapshots are saved by instances of StoredStateData. Any possible state + # modifications in on_commit handlers of instances of other classes will not be persisted. + self.on.commit.emit() + # Save our event count after all events have been emitted. + self.save_snapshot(self._stored) + self._storage.commit() + + def register_type(self, cls, parent, kind=None): + """Register a type to a handle.""" + if parent and not isinstance(parent, Handle): + parent = parent.handle + if parent: + parent_path = parent.path + else: + parent_path = None + if not kind: + kind = cls.handle_kind + self._type_registry[(parent_path, kind)] = cls + self._type_known.add(cls) + + def save_snapshot(self, value): + """Save a persistent snapshot of the provided value. + + The provided value must implement the following interface: + + value.handle = Handle(...) + value.snapshot() => {...} # Simple builtin types only. + value.restore(snapshot) # Restore custom state from prior snapshot. + """ + if type(value) not in self._type_known: + raise RuntimeError( + 'cannot save {} values before registering that type'.format(type(value).__name__)) + data = value.snapshot() + + # Use marshal as a validator, enforcing the use of simple types, as we later the + # information is really pickled, which is too error prone for future evolution of the + # stored data (e.g. if the developer stores a custom object and later changes its + # class name; when unpickling the original class will not be there and event + # data loading will fail). + try: + marshal.dumps(data) + except ValueError: + msg = "unable to save the data for {}, it must contain only simple types: {!r}" + raise ValueError(msg.format(value.__class__.__name__, data)) + + self._storage.save_snapshot(value.handle.path, data) + + def load_snapshot(self, handle): + """Load a persistent snapshot.""" + parent_path = None + if handle.parent: + parent_path = handle.parent.path + cls = self._type_registry.get((parent_path, handle.kind)) + if not cls: + raise NoTypeError(handle.path) + data = self._storage.load_snapshot(handle.path) + obj = cls.__new__(cls) + obj.framework = self + obj.handle = handle + obj.restore(data) + self._track(obj) + return obj + + def drop_snapshot(self, handle): + """Discard a persistent snapshot.""" + self._storage.drop_snapshot(handle.path) + + def observe(self, bound_event: BoundEvent, observer: types.MethodType): + """Register observer to be called when bound_event is emitted. + + The bound_event is generally provided as an attribute of the object that emits + the event, and is created in this style:: + + class SomeObject: + something_happened = Event(SomethingHappened) + + That event may be observed as:: + + framework.observe(someobj.something_happened, self._on_something_happened) + + Raises: + RuntimeError: if bound_event or observer are the wrong type. + """ + if not isinstance(bound_event, BoundEvent): + raise RuntimeError( + 'Framework.observe requires a BoundEvent as second parameter, got {}'.format( + bound_event)) + if not isinstance(observer, types.MethodType): + # help users of older versions of the framework + if isinstance(observer, charm.CharmBase): + raise TypeError( + 'observer methods must now be explicitly provided;' + ' please replace observe(self.on.{0}, self)' + ' with e.g. observe(self.on.{0}, self._on_{0})'.format( + bound_event.event_kind)) + raise RuntimeError( + 'Framework.observe requires a method as third parameter, got {}'.format(observer)) + + event_type = bound_event.event_type + event_kind = bound_event.event_kind + emitter = bound_event.emitter + + self.register_type(event_type, emitter, event_kind) + + if hasattr(emitter, "handle"): + emitter_path = emitter.handle.path + else: + raise RuntimeError( + 'event emitter {} must have a "handle" attribute'.format(type(emitter).__name__)) + + # Validate that the method has an acceptable call signature. + sig = inspect.signature(observer) + # Self isn't included in the params list, so the first arg will be the event. + extra_params = list(sig.parameters.values())[1:] + + method_name = observer.__name__ + observer = observer.__self__ + if not sig.parameters: + raise TypeError( + '{}.{} must accept event parameter'.format(type(observer).__name__, method_name)) + elif any(param.default is inspect.Parameter.empty for param in extra_params): + # Allow for additional optional params, since there's no reason to exclude them, but + # required params will break. + raise TypeError( + '{}.{} has extra required parameter'.format(type(observer).__name__, method_name)) + + # TODO Prevent the exact same parameters from being registered more than once. + + self._observer[observer.handle.path] = observer + self._observers.append((observer.handle.path, method_name, emitter_path, event_kind)) + + def _next_event_key(self): + """Return the next event key that should be used, incrementing the internal counter.""" + # Increment the count first; this means the keys will start at 1, and 0 + # means no events have been emitted. + self._stored['event_count'] += 1 + return str(self._stored['event_count']) + + def _emit(self, event): + """See BoundEvent.emit for the public way to call this.""" + saved = False + event_path = event.handle.path + event_kind = event.handle.kind + parent_path = event.handle.parent.path + # TODO Track observers by (parent_path, event_kind) rather than as a list of + # all observers. Avoiding linear search through all observers for every event + for observer_path, method_name, _parent_path, _event_kind in self._observers: + if _parent_path != parent_path: + continue + if _event_kind and _event_kind != event_kind: + continue + if not saved: + # Save the event for all known observers before the first notification + # takes place, so that either everyone interested sees it, or nobody does. + self.save_snapshot(event) + saved = True + # Again, only commit this after all notices are saved. + self._storage.save_notice(event_path, observer_path, method_name) + if saved: + self._reemit(event_path) + + def reemit(self): + """Reemit previously deferred events to the observers that deferred them. + + Only the specific observers that have previously deferred the event will be + notified again. Observers that asked to be notified about events after it's + been first emitted won't be notified, as that would mean potentially observing + events out of order. + """ + self._reemit() + + def _reemit(self, single_event_path=None): + last_event_path = None + deferred = True + for event_path, observer_path, method_name in self._storage.notices(single_event_path): + event_handle = Handle.from_path(event_path) + + if last_event_path != event_path: + if not deferred and last_event_path is not None: + self._storage.drop_snapshot(last_event_path) + last_event_path = event_path + deferred = False + + try: + event = self.load_snapshot(event_handle) + except NoTypeError: + self._storage.drop_notice(event_path, observer_path, method_name) + continue + + event.deferred = False + observer = self._observer.get(observer_path) + if observer: + if single_event_path is None: + logger.debug("Re-emitting %s.", event) + custom_handler = getattr(observer, method_name, None) + if custom_handler: + event_is_from_juju = isinstance(event, charm.HookEvent) + event_is_action = isinstance(event, charm.ActionEvent) + if (event_is_from_juju or event_is_action) and 'hook' in self._juju_debug_at: + # Present the welcome message and run under PDB. + self._show_debug_code_message() + pdb.runcall(custom_handler, event) + else: + # Regular call to the registered method. + custom_handler(event) + + if event.deferred: + deferred = True + else: + self._storage.drop_notice(event_path, observer_path, method_name) + # We intentionally consider this event to be dead and reload it from + # scratch in the next path. + self.framework._forget(event) + + if not deferred and last_event_path is not None: + self._storage.drop_snapshot(last_event_path) + + def _show_debug_code_message(self): + """Present the welcome message (only once!) when using debugger functionality.""" + if not self._breakpoint_welcomed: + self._breakpoint_welcomed = True + print(_BREAKPOINT_WELCOME_MESSAGE, file=sys.stderr, end='') + + def breakpoint(self, name=None): + """Add breakpoint, optionally named, at the place where this method is called. + + For the breakpoint to be activated the JUJU_DEBUG_AT environment variable + must be set to "all" or to the specific name parameter provided, if any. In every + other situation calling this method does nothing. + + The framework also provides a standard breakpoint named "hook", that will + stop execution when a hook event is about to be handled. + + For those reasons, the "all" and "hook" breakpoint names are reserved. + """ + # If given, validate the name comply with all the rules + if name is not None: + if not isinstance(name, str): + raise TypeError('breakpoint names must be strings') + if name in ('hook', 'all'): + raise ValueError('breakpoint names "all" and "hook" are reserved') + if not re.match(r'^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$', name): + raise ValueError('breakpoint names must look like "foo" or "foo-bar"') + + indicated_breakpoints = self._juju_debug_at + if not indicated_breakpoints: + return + + if 'all' in indicated_breakpoints or name in indicated_breakpoints: + self._show_debug_code_message() + + # If we call set_trace() directly it will open the debugger *here*, so indicating + # it to use our caller's frame + code_frame = inspect.currentframe().f_back + pdb.Pdb().set_trace(code_frame) + else: + logger.warning( + "Breakpoint %r skipped (not found in the requested breakpoints: %s)", + name, indicated_breakpoints) + + def remove_unreferenced_events(self): + """Remove events from storage that are not referenced. + + In older versions of the framework, events that had no observers would get recorded but + never deleted. This makes a best effort to find these events and remove them from the + database. + """ + event_regex = re.compile(_event_regex) + to_remove = [] + for handle_path in self._storage.list_snapshots(): + if event_regex.match(handle_path): + notices = self._storage.notices(handle_path) + if next(notices, None) is None: + # There are no notices for this handle_path, it is valid to remove it + to_remove.append(handle_path) + for handle_path in to_remove: + self._storage.drop_snapshot(handle_path) + + +class StoredStateData(Object): + """Manager of the stored data.""" + + def __init__(self, parent, attr_name): + super().__init__(parent, attr_name) + self._cache = {} + self.dirty = False + + def __getitem__(self, key): + return self._cache.get(key) + + def __setitem__(self, key, value): + self._cache[key] = value + self.dirty = True + + def __contains__(self, key): + return key in self._cache + + def snapshot(self): + """Return the current state.""" + return self._cache + + def restore(self, snapshot): + """Restore current state to the given snapshot.""" + self._cache = snapshot + self.dirty = False + + def on_commit(self, event): + """Save changes to the storage backend.""" + if self.dirty: + self.framework.save_snapshot(self) + self.dirty = False + + +class BoundStoredState: + """Stored state data bound to a specific Object.""" + + def __init__(self, parent, attr_name): + parent.framework.register_type(StoredStateData, parent) + + handle = Handle(parent, StoredStateData.handle_kind, attr_name) + try: + data = parent.framework.load_snapshot(handle) + except NoSnapshotError: + data = StoredStateData(parent, attr_name) + + # __dict__ is used to avoid infinite recursion. + self.__dict__["_data"] = data + self.__dict__["_attr_name"] = attr_name + + parent.framework.observe(parent.framework.on.commit, self._data.on_commit) + + def __getattr__(self, key): + # "on" is the only reserved key that can't be used in the data map. + if key == "on": + return self._data.on + if key not in self._data: + raise AttributeError("attribute '{}' is not stored".format(key)) + return _wrap_stored(self._data, self._data[key]) + + def __setattr__(self, key, value): + if key == "on": + raise AttributeError("attribute 'on' is reserved and cannot be set") + + value = _unwrap_stored(self._data, value) + + if not isinstance(value, (type(None), int, float, str, bytes, list, dict, set)): + raise AttributeError( + 'attribute {!r} cannot be a {}: must be int/float/dict/list/etc'.format( + key, type(value).__name__)) + + self._data[key] = _unwrap_stored(self._data, value) + + def set_default(self, **kwargs): + """Set the value of any given key if it has not already been set.""" + for k, v in kwargs.items(): + if k not in self._data: + self._data[k] = v + + +class StoredState: + """A class used to store data the charm needs persisted across invocations. + + Example:: + + class MyClass(Object): + _stored = StoredState() + + Instances of `MyClass` can transparently save state between invocations by + setting attributes on `_stored`. Initial state should be set with + `set_default` on the bound object, that is:: + + class MyClass(Object): + _stored = StoredState() + + def __init__(self, parent, key): + super().__init__(parent, key) + self._stored.set_default(seen=set()) + self.framework.observe(self.on.seen, self._on_seen) + + def _on_seen(self, event): + self._stored.seen.add(event.uuid) + + """ + + def __init__(self): + self.parent_type = None + self.attr_name = None + + def __get__(self, parent, parent_type=None): + if self.parent_type is not None and self.parent_type not in parent_type.mro(): + # the StoredState instance is being shared between two unrelated classes + # -> unclear what is exepcted of us -> bail out + raise RuntimeError( + 'StoredState shared by {} and {}'.format( + self.parent_type.__name__, parent_type.__name__)) + + if parent is None: + # accessing via the class directly (e.g. MyClass.stored) + return self + + bound = None + if self.attr_name is not None: + bound = parent.__dict__.get(self.attr_name) + if bound is not None: + # we already have the thing from a previous pass, huzzah + return bound + + # need to find ourselves amongst the parent's bases + for cls in parent_type.mro(): + for attr_name, attr_value in cls.__dict__.items(): + if attr_value is not self: + continue + # we've found ourselves! is it the first time? + if bound is not None: + # the StoredState instance is being stored in two different + # attributes -> unclear what is expected of us -> bail out + raise RuntimeError("StoredState shared by {0}.{1} and {0}.{2}".format( + cls.__name__, self.attr_name, attr_name)) + # we've found ourselves for the first time; save where, and bind the object + self.attr_name = attr_name + self.parent_type = cls + bound = BoundStoredState(parent, attr_name) + + if bound is not None: + # cache the bound object to avoid the expensive lookup the next time + # (don't use setattr, to keep things symmetric with the fast-path lookup above) + parent.__dict__[self.attr_name] = bound + return bound + + raise AttributeError( + 'cannot find {} attribute in type {}'.format( + self.__class__.__name__, parent_type.__name__)) + + +def _wrap_stored(parent_data, value): + t = type(value) + if t is dict: + return StoredDict(parent_data, value) + if t is list: + return StoredList(parent_data, value) + if t is set: + return StoredSet(parent_data, value) + return value + + +def _unwrap_stored(parent_data, value): + t = type(value) + if t is StoredDict or t is StoredList or t is StoredSet: + return value._under + return value + + +def _wrapped_repr(obj): + t = type(obj) + if obj._under: + return "{}.{}({!r})".format(t.__module__, t.__name__, obj._under) + else: + return "{}.{}()".format(t.__module__, t.__name__) + + +class StoredDict(collections.abc.MutableMapping): + """A dict-like object that uses the StoredState as backend.""" + + def __init__(self, stored_data, under): + self._stored_data = stored_data + self._under = under + + def __getitem__(self, key): + return _wrap_stored(self._stored_data, self._under[key]) + + def __setitem__(self, key, value): + self._under[key] = _unwrap_stored(self._stored_data, value) + self._stored_data.dirty = True + + def __delitem__(self, key): + del self._under[key] + self._stored_data.dirty = True + + def __iter__(self): + return self._under.__iter__() + + def __len__(self): + return len(self._under) + + def __eq__(self, other): + if isinstance(other, StoredDict): + return self._under == other._under + elif isinstance(other, collections.abc.Mapping): + return self._under == other + else: + return NotImplemented + + __repr__ = _wrapped_repr + + +class StoredList(collections.abc.MutableSequence): + """A list-like object that uses the StoredState as backend.""" + + def __init__(self, stored_data, under): + self._stored_data = stored_data + self._under = under + + def __getitem__(self, index): + return _wrap_stored(self._stored_data, self._under[index]) + + def __setitem__(self, index, value): + self._under[index] = _unwrap_stored(self._stored_data, value) + self._stored_data.dirty = True + + def __delitem__(self, index): + del self._under[index] + self._stored_data.dirty = True + + def __len__(self): + return len(self._under) + + def insert(self, index, value): + """Insert value before index.""" + self._under.insert(index, value) + self._stored_data.dirty = True + + def append(self, value): + """Append value to the end of the list.""" + self._under.append(value) + self._stored_data.dirty = True + + def __eq__(self, other): + if isinstance(other, StoredList): + return self._under == other._under + elif isinstance(other, collections.abc.Sequence): + return self._under == other + else: + return NotImplemented + + def __lt__(self, other): + if isinstance(other, StoredList): + return self._under < other._under + elif isinstance(other, collections.abc.Sequence): + return self._under < other + else: + return NotImplemented + + def __le__(self, other): + if isinstance(other, StoredList): + return self._under <= other._under + elif isinstance(other, collections.abc.Sequence): + return self._under <= other + else: + return NotImplemented + + def __gt__(self, other): + if isinstance(other, StoredList): + return self._under > other._under + elif isinstance(other, collections.abc.Sequence): + return self._under > other + else: + return NotImplemented + + def __ge__(self, other): + if isinstance(other, StoredList): + return self._under >= other._under + elif isinstance(other, collections.abc.Sequence): + return self._under >= other + else: + return NotImplemented + + __repr__ = _wrapped_repr + + +class StoredSet(collections.abc.MutableSet): + """A set-like object that uses the StoredState as backend.""" + + def __init__(self, stored_data, under): + self._stored_data = stored_data + self._under = under + + def add(self, key): + """Add a key to a set. + + This has no effect if the key is already present. + """ + self._under.add(key) + self._stored_data.dirty = True + + def discard(self, key): + """Remove a key from a set if it is a member. + + If the key is not a member, do nothing. + """ + self._under.discard(key) + self._stored_data.dirty = True + + def __contains__(self, key): + return key in self._under + + def __iter__(self): + return self._under.__iter__() + + def __len__(self): + return len(self._under) + + @classmethod + def _from_iterable(cls, it): + """Construct an instance of the class from any iterable input. + + Per https://docs.python.org/3/library/collections.abc.html + if the Set mixin is being used in a class with a different constructor signature, + you will need to override _from_iterable() with a classmethod that can construct + new instances from an iterable argument. + """ + return set(it) + + def __le__(self, other): + if isinstance(other, StoredSet): + return self._under <= other._under + elif isinstance(other, collections.abc.Set): + return self._under <= other + else: + return NotImplemented + + def __ge__(self, other): + if isinstance(other, StoredSet): + return self._under >= other._under + elif isinstance(other, collections.abc.Set): + return self._under >= other + else: + return NotImplemented + + def __eq__(self, other): + if isinstance(other, StoredSet): + return self._under == other._under + elif isinstance(other, collections.abc.Set): + return self._under == other + else: + return NotImplemented + + __repr__ = _wrapped_repr diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/jujuversion.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/jujuversion.py new file mode 100644 index 00000000..61d420d3 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/jujuversion.py @@ -0,0 +1,114 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A helper to work with the Juju version.""" + +import os +import re +from functools import total_ordering + + +@total_ordering +class JujuVersion: + """Helper to work with the Juju version. + + It knows how to parse the ``JUJU_VERSION`` environment variable, and exposes different + capabilities according to the specific version, allowing also to compare with other + versions. + """ + + PATTERN = r'''^ + (?P\d{1,9})\.(?P\d{1,9}) # and numbers are always there + ((?:\.|-(?P[a-z]+))(?P\d{1,9}))? # sometimes with . or - + (\.(?P\d{1,9}))?$ # and sometimes with a number. + ''' + + def __init__(self, version): + m = re.match(self.PATTERN, version, re.VERBOSE) + if not m: + raise RuntimeError('"{}" is not a valid Juju version string'.format(version)) + + d = m.groupdict() + self.major = int(m.group('major')) + self.minor = int(m.group('minor')) + self.tag = d['tag'] or '' + self.patch = int(d['patch'] or 0) + self.build = int(d['build'] or 0) + + def __repr__(self): + if self.tag: + s = '{}.{}-{}{}'.format(self.major, self.minor, self.tag, self.patch) + else: + s = '{}.{}.{}'.format(self.major, self.minor, self.patch) + if self.build > 0: + s += '.{}'.format(self.build) + return s + + def __eq__(self, other): + if self is other: + return True + if isinstance(other, str): + other = type(self)(other) + elif not isinstance(other, JujuVersion): + raise RuntimeError('cannot compare Juju version "{}" with "{}"'.format(self, other)) + return ( + self.major == other.major + and self.minor == other.minor + and self.tag == other.tag + and self.build == other.build + and self.patch == other.patch) + + def __lt__(self, other): + if self is other: + return False + if isinstance(other, str): + other = type(self)(other) + elif not isinstance(other, JujuVersion): + raise RuntimeError('cannot compare Juju version "{}" with "{}"'.format(self, other)) + + if self.major != other.major: + return self.major < other.major + elif self.minor != other.minor: + return self.minor < other.minor + elif self.tag != other.tag: + if not self.tag: + return False + elif not other.tag: + return True + return self.tag < other.tag + elif self.patch != other.patch: + return self.patch < other.patch + elif self.build != other.build: + return self.build < other.build + return False + + @classmethod + def from_environ(cls) -> 'JujuVersion': + """Build a JujuVersion from JUJU_VERSION.""" + v = os.environ.get('JUJU_VERSION') + if v is None: + v = '0.0.0' + return cls(v) + + def has_app_data(self) -> bool: + """Determine whether this juju version knows about app data.""" + return (self.major, self.minor, self.patch) >= (2, 7, 0) + + def is_dispatch_aware(self) -> bool: + """Determine whether this juju version knows about dispatch.""" + return (self.major, self.minor, self.patch) >= (2, 8, 0) + + def has_controller_storage(self) -> bool: + """Determine whether this juju version supports controller-side storage.""" + return (self.major, self.minor, self.patch) >= (2, 8, 0) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/lib/__init__.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/lib/__init__.py new file mode 100644 index 00000000..22b5a84e --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/lib/__init__.py @@ -0,0 +1,264 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Infrastructure for the opslib functionality.""" + +import logging +import os +import re +import sys + +from ast import literal_eval +from importlib.util import module_from_spec +from importlib.machinery import ModuleSpec +from pkgutil import get_importer +from types import ModuleType +from typing import List + +__all__ = ('use', 'autoimport') + +logger = logging.getLogger(__name__) + +_libraries = None + +_libline_re = re.compile(r'''^LIB([A-Z]+)\s*=\s*([0-9]+|['"][a-zA-Z0-9_.\-@]+['"])''') +_libname_re = re.compile(r'''^[a-z][a-z0-9]+$''') + +# Not perfect, but should do for now. +_libauthor_re = re.compile(r'''^[A-Za-z0-9_+.-]+@[a-z0-9_-]+(?:\.[a-z0-9_-]+)*\.[a-z]{2,3}$''') + + +def use(name: str, api: int, author: str) -> ModuleType: + """Use a library from the ops libraries. + + Args: + name: the name of the library requested. + api: the API version of the library. + author: the author of the library. If not given, requests the + one in the standard library. + + Raises: + ImportError: if the library cannot be found. + TypeError: if the name, api, or author are the wrong type. + ValueError: if the name, api, or author are invalid. + """ + if not isinstance(name, str): + raise TypeError("invalid library name: {!r} (must be a str)".format(name)) + if not isinstance(author, str): + raise TypeError("invalid library author: {!r} (must be a str)".format(author)) + if not isinstance(api, int): + raise TypeError("invalid library API: {!r} (must be an int)".format(api)) + if api < 0: + raise ValueError('invalid library api: {} (must be ≥0)'.format(api)) + if not _libname_re.match(name): + raise ValueError("invalid library name: {!r} (chars and digits only)".format(name)) + if not _libauthor_re.match(author): + raise ValueError("invalid library author email: {!r}".format(author)) + + if _libraries is None: + autoimport() + + versions = _libraries.get((name, author), ()) + for lib in versions: + if lib.api == api: + return lib.import_module() + + others = ', '.join(str(lib.api) for lib in versions) + if others: + msg = 'cannot find "{}" from "{}" with API version {} (have {})'.format( + name, author, api, others) + else: + msg = 'cannot find library "{}" from "{}"'.format(name, author) + + raise ImportError(msg, name=name) + + +def autoimport(): + """Find all libs in the path and enable use of them. + + You only need to call this if you've installed a package or + otherwise changed sys.path in the current run, and need to see the + changes. Otherwise libraries are found on first call of `use`. + """ + global _libraries + _libraries = {} + for spec in _find_all_specs(sys.path): + lib = _parse_lib(spec) + if lib is None: + continue + + versions = _libraries.setdefault((lib.name, lib.author), []) + versions.append(lib) + versions.sort(reverse=True) + + +def _find_all_specs(path): + for sys_dir in path: + if sys_dir == "": + sys_dir = "." + try: + top_dirs = os.listdir(sys_dir) + except (FileNotFoundError, NotADirectoryError): + continue + except OSError as e: + logger.debug("Tried to look for ops.lib packages under '%s': %s", sys_dir, e) + continue + logger.debug("Looking for ops.lib packages under '%s'", sys_dir) + for top_dir in top_dirs: + opslib = os.path.join(sys_dir, top_dir, 'opslib') + try: + lib_dirs = os.listdir(opslib) + except (FileNotFoundError, NotADirectoryError): + continue + except OSError as e: + logger.debug(" Tried '%s': %s", opslib, e) # *lots* of things checked here + continue + else: + logger.debug(" Trying '%s'", opslib) + finder = get_importer(opslib) + if finder is None: + logger.debug(" Finder for '%s' is None", opslib) + continue + if not hasattr(finder, 'find_spec'): + logger.debug(" Finder for '%s' has no find_spec", opslib) + continue + for lib_dir in lib_dirs: + spec_name = "{}.opslib.{}".format(top_dir, lib_dir) + spec = finder.find_spec(spec_name) + if spec is None: + logger.debug(" No spec for %r", spec_name) + continue + if spec.loader is None: + # a namespace package; not supported + logger.debug(" No loader for %r (probably a namespace package)", spec_name) + continue + + logger.debug(" Found %r", spec_name) + yield spec + + +# only the first this many lines of a file are looked at for the LIB* constants +_MAX_LIB_LINES = 99 +# these keys, with these types, are needed to have an opslib +_NEEDED_KEYS = {'NAME': str, 'AUTHOR': str, 'API': int, 'PATCH': int} + + +def _join_and(keys: List[str]) -> str: + if len(keys) == 0: + return "" + if len(keys) == 1: + return keys[0] + return ", ".join(keys[:-1]) + ", and " + keys[-1] + + +class _Missing: + """Helper to get the difference between what was found and what was needed when logging.""" + + def __init__(self, found): + self._found = found + + def __str__(self): + exp = set(_NEEDED_KEYS) + got = set(self._found) + if len(got) == 0: + return "missing {}".format(_join_and(sorted(exp))) + return "got {}, but missing {}".format( + _join_and(sorted(got)), + _join_and(sorted(exp - got))) + + +def _parse_lib(spec): + if spec.origin is None: + # "can't happen" + logger.warning("No origin for %r (no idea why; please report)", spec.name) + return None + + logger.debug(" Parsing %r", spec.name) + + try: + with open(spec.origin, 'rt', encoding='utf-8') as f: + libinfo = {} + for n, line in enumerate(f): + if len(libinfo) == len(_NEEDED_KEYS): + break + if n > _MAX_LIB_LINES: + logger.debug( + " Missing opslib metadata after reading to line %d: %s", + _MAX_LIB_LINES, _Missing(libinfo)) + return None + m = _libline_re.match(line) + if m is None: + continue + key, value = m.groups() + if key in _NEEDED_KEYS: + value = literal_eval(value) + if not isinstance(value, _NEEDED_KEYS[key]): + logger.debug( + " Bad type for %s: expected %s, got %s", + key, _NEEDED_KEYS[key].__name__, type(value).__name__) + return None + libinfo[key] = value + else: + if len(libinfo) != len(_NEEDED_KEYS): + logger.debug( + " Missing opslib metadata after reading to end of file: %s", + _Missing(libinfo)) + return None + except Exception as e: + logger.debug(" Failed: %s", e) + return None + + lib = _Lib(spec, libinfo['NAME'], libinfo['AUTHOR'], libinfo['API'], libinfo['PATCH']) + logger.debug(" Success: found library %s", lib) + + return lib + + +class _Lib: + + def __init__(self, spec: ModuleSpec, name: str, author: str, api: int, patch: int): + self.spec = spec + self.name = name + self.author = author + self.api = api + self.patch = patch + + self._module = None + + def __repr__(self): + return "<_Lib {}>".format(self) + + def __str__(self): + return "{0.name} by {0.author}, API {0.api}, patch {0.patch}".format(self) + + def import_module(self) -> ModuleType: + if self._module is None: + module = module_from_spec(self.spec) + self.spec.loader.exec_module(module) + self._module = module + return self._module + + def __eq__(self, other): + if not isinstance(other, _Lib): + return NotImplemented + a = (self.name, self.author, self.api, self.patch) + b = (other.name, other.author, other.api, other.patch) + return a == b + + def __lt__(self, other): + if not isinstance(other, _Lib): + return NotImplemented + a = (self.name, self.author, self.api, self.patch) + b = (other.name, other.author, other.api, other.patch) + return a < b diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/log.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/log.py new file mode 100644 index 00000000..b47013dd --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/log.py @@ -0,0 +1,58 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Interface to emit messages to the Juju logging system.""" + +import sys +import logging + + +class JujuLogHandler(logging.Handler): + """A handler for sending logs to Juju via juju-log.""" + + def __init__(self, model_backend, level=logging.DEBUG): + super().__init__(level) + self.model_backend = model_backend + + def emit(self, record): + """Send the specified logging record to the Juju backend. + + This method is not used directly by the Operator Framework code, but by + :class:`logging.Handler` itself as part of the logging machinery. + """ + self.model_backend.juju_log(record.levelname, self.format(record)) + + +def setup_root_logging(model_backend, debug=False): + """Setup python logging to forward messages to juju-log. + + By default, logging is set to DEBUG level, and messages will be filtered by Juju. + Charmers can also set their own default log level with:: + + logging.getLogger().setLevel(logging.INFO) + + model_backend -- a ModelBackend to use for juju-log + debug -- if True, write logs to stderr as well as to juju-log. + """ + logger = logging.getLogger() + logger.setLevel(logging.DEBUG) + logger.addHandler(JujuLogHandler(model_backend)) + if debug: + handler = logging.StreamHandler() + formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s') + handler.setFormatter(formatter) + logger.addHandler(handler) + + sys.excepthook = lambda etype, value, tb: logger.error( + "Uncaught exception while in charm code:", exc_info=(etype, value, tb)) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/main.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/main.py new file mode 100644 index 00000000..f18f88ae --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/main.py @@ -0,0 +1,406 @@ +# Copyright 2019-2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Main entry point to the Operator Framework.""" + +import inspect +import logging +import os +import shutil +import subprocess +import sys +import typing +import warnings +from pathlib import Path + +import yaml + +import ops.charm +import ops.framework +import ops.model +import ops.storage + +from ops.log import setup_root_logging +from ops.jujuversion import JujuVersion + +CHARM_STATE_FILE = '.unit-state.db' + + +logger = logging.getLogger() + + +def _exe_path(path: Path) -> typing.Optional[Path]: + """Find and return the full path to the given binary. + + Here path is the absolute path to a binary, but might be missing an extension. + """ + p = shutil.which(path.name, mode=os.F_OK, path=str(path.parent)) + if p is None: + return None + return Path(p) + + +def _get_charm_dir(): + charm_dir = os.environ.get("JUJU_CHARM_DIR") + if charm_dir is None: + # Assume $JUJU_CHARM_DIR/lib/op/main.py structure. + charm_dir = Path('{}/../../..'.format(__file__)).resolve() + else: + charm_dir = Path(charm_dir).resolve() + return charm_dir + + +def _create_event_link(charm, bound_event, link_to): + """Create a symlink for a particular event. + + charm -- A charm object. + bound_event -- An event for which to create a symlink. + link_to -- What the event link should point to + """ + if issubclass(bound_event.event_type, ops.charm.HookEvent): + event_dir = charm.framework.charm_dir / 'hooks' + event_path = event_dir / bound_event.event_kind.replace('_', '-') + elif issubclass(bound_event.event_type, ops.charm.ActionEvent): + if not bound_event.event_kind.endswith("_action"): + raise RuntimeError( + 'action event name {} needs _action suffix'.format(bound_event.event_kind)) + event_dir = charm.framework.charm_dir / 'actions' + # The event_kind is suffixed with "_action" while the executable is not. + event_path = event_dir / bound_event.event_kind[:-len('_action')].replace('_', '-') + else: + raise RuntimeError( + 'cannot create a symlink: unsupported event type {}'.format(bound_event.event_type)) + + event_dir.mkdir(exist_ok=True) + if not event_path.exists(): + target_path = os.path.relpath(link_to, str(event_dir)) + + # Ignore the non-symlink files or directories + # assuming the charm author knows what they are doing. + logger.debug( + 'Creating a new relative symlink at %s pointing to %s', + event_path, target_path) + event_path.symlink_to(target_path) + + +def _setup_event_links(charm_dir, charm): + """Set up links for supported events that originate from Juju. + + Whether a charm can handle an event or not can be determined by + introspecting which events are defined on it. + + Hooks or actions are created as symlinks to the charm code file + which is determined by inspecting symlinks provided by the charm + author at hooks/install or hooks/start. + + charm_dir -- A root directory of the charm. + charm -- An instance of the Charm class. + + """ + # XXX: on windows this function does not accomplish what it wants to: + # it creates symlinks with no extension pointing to a .py + # and juju only knows how to handle .exe, .bat, .cmd, and .ps1 + # so it does its job, but does not accomplish anything as the + # hooks aren't 'callable'. + link_to = os.path.realpath(os.environ.get("JUJU_DISPATCH_PATH", sys.argv[0])) + for bound_event in charm.on.events().values(): + # Only events that originate from Juju need symlinks. + if issubclass(bound_event.event_type, (ops.charm.HookEvent, ops.charm.ActionEvent)): + _create_event_link(charm, bound_event, link_to) + + +def _emit_charm_event(charm, event_name): + """Emits a charm event based on a Juju event name. + + charm -- A charm instance to emit an event from. + event_name -- A Juju event name to emit on a charm. + """ + event_to_emit = None + try: + event_to_emit = getattr(charm.on, event_name) + except AttributeError: + logger.debug("Event %s not defined for %s.", event_name, charm) + + # If the event is not supported by the charm implementation, do + # not error out or try to emit it. This is to support rollbacks. + if event_to_emit is not None: + args, kwargs = _get_event_args(charm, event_to_emit) + logger.debug('Emitting Juju event %s.', event_name) + event_to_emit.emit(*args, **kwargs) + + +def _get_event_args(charm, bound_event): + event_type = bound_event.event_type + model = charm.framework.model + + if issubclass(event_type, ops.charm.RelationEvent): + relation_name = os.environ['JUJU_RELATION'] + relation_id = int(os.environ['JUJU_RELATION_ID'].split(':')[-1]) + relation = model.get_relation(relation_name, relation_id) + else: + relation = None + + remote_app_name = os.environ.get('JUJU_REMOTE_APP', '') + remote_unit_name = os.environ.get('JUJU_REMOTE_UNIT', '') + if remote_app_name or remote_unit_name: + if not remote_app_name: + if '/' not in remote_unit_name: + raise RuntimeError('invalid remote unit name: {}'.format(remote_unit_name)) + remote_app_name = remote_unit_name.split('/')[0] + args = [relation, model.get_app(remote_app_name)] + if remote_unit_name: + args.append(model.get_unit(remote_unit_name)) + return args, {} + elif relation: + return [relation], {} + return [], {} + + +class _Dispatcher: + """Encapsulate how to figure out what event Juju wants us to run. + + Also knows how to run “legacy” hooks when Juju called us via a top-level + ``dispatch`` binary. + + Args: + charm_dir: the toplevel directory of the charm + + Attributes: + event_name: the name of the event to run + is_dispatch_aware: are we running under a Juju that knows about the + dispatch binary, and is that binary present? + + """ + + def __init__(self, charm_dir: Path): + self._charm_dir = charm_dir + self._exec_path = Path(os.environ.get('JUJU_DISPATCH_PATH', sys.argv[0])) + + dispatch = charm_dir / 'dispatch' + if JujuVersion.from_environ().is_dispatch_aware() and _exe_path(dispatch) is not None: + self._init_dispatch() + else: + self._init_legacy() + + def ensure_event_links(self, charm): + """Make sure necessary symlinks are present on disk.""" + if self.is_dispatch_aware: + # links aren't needed + return + + # When a charm is force-upgraded and a unit is in an error state Juju + # does not run upgrade-charm and instead runs the failed hook followed + # by config-changed. Given the nature of force-upgrading the hook setup + # code is not triggered on config-changed. + # + # 'start' event is included as Juju does not fire the install event for + # K8s charms (see LP: #1854635). + if (self.event_name in ('install', 'start', 'upgrade_charm') + or self.event_name.endswith('_storage_attached')): + _setup_event_links(self._charm_dir, charm) + + def run_any_legacy_hook(self): + """Run any extant legacy hook. + + If there is both a dispatch file and a legacy hook for the + current event, run the wanted legacy hook. + """ + if not self.is_dispatch_aware: + # we *are* the legacy hook + return + + dispatch_path = _exe_path(self._charm_dir / self._dispatch_path) + if dispatch_path is None: + logger.debug("Legacy %s does not exist.", self._dispatch_path) + return + + # super strange that there isn't an is_executable + if not os.access(str(dispatch_path), os.X_OK): + logger.warning("Legacy %s exists but is not executable.", self._dispatch_path) + return + + if dispatch_path.resolve() == Path(sys.argv[0]).resolve(): + logger.debug("Legacy %s is just a link to ourselves.", self._dispatch_path) + return + + argv = sys.argv.copy() + argv[0] = str(dispatch_path) + logger.info("Running legacy %s.", self._dispatch_path) + try: + subprocess.run(argv, check=True) + except subprocess.CalledProcessError as e: + logger.warning("Legacy %s exited with status %d.", self._dispatch_path, e.returncode) + sys.exit(e.returncode) + except OSError as e: + logger.warning("Unable to run legacy %s: %s", self._dispatch_path, e) + sys.exit(1) + else: + logger.debug("Legacy %s exited with status 0.", self._dispatch_path) + + def _set_name_from_path(self, path: Path): + """Sets the name attribute to that which can be inferred from the given path.""" + name = path.name.replace('-', '_') + if path.parent.name == 'actions': + name = '{}_action'.format(name) + self.event_name = name + + def _init_legacy(self): + """Set up the 'legacy' dispatcher. + + The current Juju doesn't know about 'dispatch' and calls hooks + explicitly. + """ + self.is_dispatch_aware = False + self._set_name_from_path(self._exec_path) + + def _init_dispatch(self): + """Set up the new 'dispatch' dispatcher. + + The current Juju will run 'dispatch' if it exists, and otherwise fall + back to the old behaviour. + + JUJU_DISPATCH_PATH will be set to the wanted hook, e.g. hooks/install, + in both cases. + """ + self._dispatch_path = Path(os.environ['JUJU_DISPATCH_PATH']) + + if 'OPERATOR_DISPATCH' in os.environ: + logger.debug("Charm called itself via %s.", self._dispatch_path) + sys.exit(0) + os.environ['OPERATOR_DISPATCH'] = '1' + + self.is_dispatch_aware = True + self._set_name_from_path(self._dispatch_path) + + def is_restricted_context(self): + """Return True if we are running in a restricted Juju context. + + When in a restricted context, most commands (relation-get, config-get, + state-get) are not available. As such, we change how we interact with + Juju. + """ + return self.event_name in ('collect_metrics',) + + +def _should_use_controller_storage(db_path: Path, meta: ops.charm.CharmMeta) -> bool: + """Figure out whether we want to use controller storage or not.""" + # if you've previously used local state, carry on using that + if db_path.exists(): + logger.debug("Using local storage: %s already exists", db_path) + return False + + # if you're not in k8s you don't need controller storage + if 'kubernetes' not in meta.series: + logger.debug("Using local storage: not a kubernetes charm") + return False + + # are we in a new enough Juju? + cur_version = JujuVersion.from_environ() + + if cur_version.has_controller_storage(): + logger.debug("Using controller storage: JUJU_VERSION=%s", cur_version) + return True + else: + logger.debug("Using local storage: JUJU_VERSION=%s", cur_version) + return False + + +def main(charm_class: ops.charm.CharmBase, use_juju_for_storage: bool = None): + """Setup the charm and dispatch the observed event. + + The event name is based on the way this executable was called (argv[0]). + + Args: + charm_class: your charm class. + use_juju_for_storage: whether to use controller-side storage. If not specified + then kubernetes charms that haven't previously used local storage and that + are running on a new enough Juju default to controller-side storage, + otherwise local storage is used. + """ + charm_dir = _get_charm_dir() + + model_backend = ops.model._ModelBackend() + debug = ('JUJU_DEBUG' in os.environ) + setup_root_logging(model_backend, debug=debug) + logger.debug("Operator Framework %s up and running.", ops.__version__) + + dispatcher = _Dispatcher(charm_dir) + dispatcher.run_any_legacy_hook() + + metadata = (charm_dir / 'metadata.yaml').read_text() + actions_meta = charm_dir / 'actions.yaml' + if actions_meta.exists(): + actions_metadata = actions_meta.read_text() + else: + actions_metadata = None + + if not yaml.__with_libyaml__: + logger.debug('yaml does not have libyaml extensions, using slower pure Python yaml loader') + meta = ops.charm.CharmMeta.from_yaml(metadata, actions_metadata) + model = ops.model.Model(meta, model_backend) + + charm_state_path = charm_dir / CHARM_STATE_FILE + + if use_juju_for_storage and not ops.storage.juju_backend_available(): + # raise an exception; the charm is broken and needs fixing. + msg = 'charm set use_juju_for_storage=True, but Juju version {} does not support it' + raise RuntimeError(msg.format(JujuVersion.from_environ())) + + if use_juju_for_storage is None: + use_juju_for_storage = _should_use_controller_storage(charm_state_path, meta) + + if use_juju_for_storage: + if dispatcher.is_restricted_context(): + # TODO: jam 2020-06-30 This unconditionally avoids running a collect metrics event + # Though we eventually expect that juju will run collect-metrics in a + # non-restricted context. Once we can determine that we are running collect-metrics + # in a non-restricted context, we should fire the event as normal. + logger.debug('"%s" is not supported when using Juju for storage\n' + 'see: https://github.com/canonical/operator/issues/348', + dispatcher.event_name) + # Note that we don't exit nonzero, because that would cause Juju to rerun the hook + return + store = ops.storage.JujuStorage() + else: + store = ops.storage.SQLiteStorage(charm_state_path) + framework = ops.framework.Framework(store, charm_dir, meta, model) + framework.set_breakpointhook() + try: + sig = inspect.signature(charm_class) + try: + sig.bind(framework) + except TypeError: + msg = ( + "the second argument, 'key', has been deprecated and will be " + "removed after the 0.7 release") + warnings.warn(msg, DeprecationWarning) + charm = charm_class(framework, None) + else: + charm = charm_class(framework) + dispatcher.ensure_event_links(charm) + + # TODO: Remove the collect_metrics check below as soon as the relevant + # Juju changes are made. Also adjust the docstring on + # EventBase.defer(). + # + # Skip reemission of deferred events for collect-metrics events because + # they do not have the full access to all hook tools. + if not dispatcher.is_restricted_context(): + framework.reemit() + + _emit_charm_event(charm, dispatcher.event_name) + + framework.commit() + finally: + framework.close() diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/model.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/model.py new file mode 100644 index 00000000..d446d636 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/model.py @@ -0,0 +1,1314 @@ +# Copyright 2019 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Representations of Juju's model, application, unit, and other entities.""" + +import datetime +import decimal +import ipaddress +import json +import os +import re +import shutil +import tempfile +import time +import typing +import weakref + +from abc import ABC, abstractmethod +from collections.abc import Mapping, MutableMapping +from pathlib import Path +from subprocess import run, PIPE, CalledProcessError +import yaml + +import ops +from ops.jujuversion import JujuVersion + + +if yaml.__with_libyaml__: + _DefaultDumper = yaml.CSafeDumper +else: + _DefaultDumper = yaml.SafeDumper + + +class Model: + """Represents the Juju Model as seen from this unit. + + This should not be instantiated directly by Charmers, but can be accessed as `self.model` + from any class that derives from Object. + """ + + def __init__(self, meta: 'ops.charm.CharmMeta', backend: '_ModelBackend'): + self._cache = _ModelCache(backend) + self._backend = backend + self._unit = self.get_unit(self._backend.unit_name) + self._relations = RelationMapping(meta.relations, self.unit, self._backend, self._cache) + self._config = ConfigData(self._backend) + self._resources = Resources(list(meta.resources), self._backend) + self._pod = Pod(self._backend) + self._storages = StorageMapping(list(meta.storages), self._backend) + self._bindings = BindingMapping(self._backend) + + @property + def unit(self) -> 'Unit': + """A :class:`Unit` that represents the unit that is running this code (eg yourself).""" + return self._unit + + @property + def app(self): + """A :class:`Application` that represents the application this unit is a part of.""" + return self._unit.app + + @property + def relations(self) -> 'RelationMapping': + """Mapping of endpoint to list of :class:`Relation`. + + Answers the question "what am I currently related to". + See also :meth:`.get_relation`. + """ + return self._relations + + @property + def config(self) -> 'ConfigData': + """Return a mapping of config for the current application.""" + return self._config + + @property + def resources(self) -> 'Resources': + """Access to resources for this charm. + + Use ``model.resources.fetch(resource_name)`` to get the path on disk + where the resource can be found. + """ + return self._resources + + @property + def storages(self) -> 'StorageMapping': + """Mapping of storage_name to :class:`Storage` as defined in metadata.yaml.""" + return self._storages + + @property + def pod(self) -> 'Pod': + """Use ``model.pod.set_spec`` to set the container specification for Kubernetes charms.""" + return self._pod + + @property + def name(self) -> str: + """Return the name of the Model that this unit is running in. + + This is read from the environment variable ``JUJU_MODEL_NAME``. + """ + return self._backend.model_name + + def get_unit(self, unit_name: str) -> 'Unit': + """Get an arbitrary unit by name. + + Internally this uses a cache, so asking for the same unit two times will + return the same object. + """ + return self._cache.get(Unit, unit_name) + + def get_app(self, app_name: str) -> 'Application': + """Get an application by name. + + Internally this uses a cache, so asking for the same application two times will + return the same object. + """ + return self._cache.get(Application, app_name) + + def get_relation( + self, relation_name: str, + relation_id: typing.Optional[int] = None) -> 'Relation': + """Get a specific Relation instance. + + If relation_id is not given, this will return the Relation instance if the + relation is established only once or None if it is not established. If this + same relation is established multiple times the error TooManyRelatedAppsError is raised. + + Args: + relation_name: The name of the endpoint for this charm + relation_id: An identifier for a specific relation. Used to disambiguate when a + given application has more than one relation on a given endpoint. + + Raises: + TooManyRelatedAppsError: is raised if there is more than one relation to the + supplied relation_name and no relation_id was supplied + """ + return self.relations._get_unique(relation_name, relation_id) + + def get_binding(self, binding_key: typing.Union[str, 'Relation']) -> 'Binding': + """Get a network space binding. + + Args: + binding_key: The relation name or instance to obtain bindings for. + + Returns: + If ``binding_key`` is a relation name, the method returns the default binding + for that relation. If a relation instance is provided, the method first looks + up a more specific binding for that specific relation ID, and if none is found + falls back to the default binding for the relation name. + """ + return self._bindings.get(binding_key) + + +class _ModelCache: + + def __init__(self, backend): + self._backend = backend + self._weakrefs = weakref.WeakValueDictionary() + + def get(self, entity_type, *args): + key = (entity_type,) + args + entity = self._weakrefs.get(key) + if entity is None: + entity = entity_type(*args, backend=self._backend, cache=self) + self._weakrefs[key] = entity + return entity + + +class Application: + """Represents a named application in the model. + + This might be your application, or might be an application that you are related to. + Charmers should not instantiate Application objects directly, but should use + :meth:`Model.get_app` if they need a reference to a given application. + + Attributes: + name: The name of this application (eg, 'mysql'). This name may differ from the name of + the charm, if the user has deployed it to a different name. + """ + + def __init__(self, name, backend, cache): + self.name = name + self._backend = backend + self._cache = cache + self._is_our_app = self.name == self._backend.app_name + self._status = None + + def _invalidate(self): + self._status = None + + @property + def status(self) -> 'StatusBase': + """Used to report or read the status of the overall application. + + Can only be read and set by the lead unit of the application. + + The status of remote units is always Unknown. + + Raises: + RuntimeError: if you try to set the status of another application, or if you try to + set the status of this application as a unit that is not the leader. + InvalidStatusError: if you try to set the status to something that is not a + :class:`StatusBase` + + Example:: + + self.model.app.status = BlockedStatus('I need a human to come help me') + """ + if not self._is_our_app: + return UnknownStatus() + + if not self._backend.is_leader(): + raise RuntimeError('cannot get application status as a non-leader unit') + + if self._status: + return self._status + + s = self._backend.status_get(is_app=True) + self._status = StatusBase.from_name(s['status'], s['message']) + return self._status + + @status.setter + def status(self, value: 'StatusBase'): + if not isinstance(value, StatusBase): + raise InvalidStatusError( + 'invalid value provided for application {} status: {}'.format(self, value) + ) + + if not self._is_our_app: + raise RuntimeError('cannot to set status for a remote application {}'.format(self)) + + if not self._backend.is_leader(): + raise RuntimeError('cannot set application status as a non-leader unit') + + self._backend.status_set(value.name, value.message, is_app=True) + self._status = value + + def __repr__(self): + return '<{}.{} {}>'.format(type(self).__module__, type(self).__name__, self.name) + + +class Unit: + """Represents a named unit in the model. + + This might be your unit, another unit of your application, or a unit of another application + that you are related to. + + Attributes: + name: The name of the unit (eg, 'mysql/0') + app: The Application the unit is a part of. + """ + + def __init__(self, name, backend, cache): + self.name = name + + app_name = name.split('/')[0] + self.app = cache.get(Application, app_name) + + self._backend = backend + self._cache = cache + self._is_our_unit = self.name == self._backend.unit_name + self._status = None + + def _invalidate(self): + self._status = None + + @property + def status(self) -> 'StatusBase': + """Used to report or read the status of a specific unit. + + The status of any unit other than yourself is always Unknown. + + Raises: + RuntimeError: if you try to set the status of a unit other than yourself. + InvalidStatusError: if you try to set the status to something other than + a :class:`StatusBase` + Example:: + + self.model.unit.status = MaintenanceStatus('reconfiguring the frobnicators') + """ + if not self._is_our_unit: + return UnknownStatus() + + if self._status: + return self._status + + s = self._backend.status_get(is_app=False) + self._status = StatusBase.from_name(s['status'], s['message']) + return self._status + + @status.setter + def status(self, value: 'StatusBase'): + if not isinstance(value, StatusBase): + raise InvalidStatusError( + 'invalid value provided for unit {} status: {}'.format(self, value) + ) + + if not self._is_our_unit: + raise RuntimeError('cannot set status for a remote unit {}'.format(self)) + + self._backend.status_set(value.name, value.message, is_app=False) + self._status = value + + def __repr__(self): + return '<{}.{} {}>'.format(type(self).__module__, type(self).__name__, self.name) + + def is_leader(self) -> bool: + """Return whether this unit is the leader of its application. + + This can only be called for your own unit. + + Returns: + True if you are the leader, False otherwise + Raises: + RuntimeError: if called for a unit that is not yourself + """ + if self._is_our_unit: + # This value is not cached as it is not guaranteed to persist for the whole duration + # of a hook execution. + return self._backend.is_leader() + else: + raise RuntimeError( + 'leadership status of remote units ({}) is not visible to other' + ' applications'.format(self) + ) + + def set_workload_version(self, version: str) -> None: + """Record the version of the software running as the workload. + + This shouldn't be confused with the revision of the charm. This is informative only; + shown in the output of 'juju status'. + """ + if not isinstance(version, str): + raise TypeError("workload version must be a str, not {}: {!r}".format( + type(version).__name__, version)) + self._backend.application_version_set(version) + + +class LazyMapping(Mapping, ABC): + """Represents a dict that isn't populated until it is accessed. + + Charm authors should generally never need to use this directly, but it forms + the basis for many of the dicts that the framework tracks. + """ + + _lazy_data = None + + @abstractmethod + def _load(self): + raise NotImplementedError() + + @property + def _data(self): + data = self._lazy_data + if data is None: + data = self._lazy_data = self._load() + return data + + def _invalidate(self): + self._lazy_data = None + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def __repr__(self): + return repr(self._data) + + +class RelationMapping(Mapping): + """Map of relation names to lists of :class:`Relation` instances.""" + + def __init__(self, relations_meta, our_unit, backend, cache): + self._peers = set() + for name, relation_meta in relations_meta.items(): + if relation_meta.role.is_peer(): + self._peers.add(name) + self._our_unit = our_unit + self._backend = backend + self._cache = cache + self._data = {relation_name: None for relation_name in relations_meta} + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, relation_name): + is_peer = relation_name in self._peers + relation_list = self._data[relation_name] + if relation_list is None: + relation_list = self._data[relation_name] = [] + for rid in self._backend.relation_ids(relation_name): + relation = Relation(relation_name, rid, is_peer, + self._our_unit, self._backend, self._cache) + relation_list.append(relation) + return relation_list + + def _invalidate(self, relation_name): + """Used to wipe the cache of a given relation_name. + + Not meant to be used by Charm authors. The content of relation data is + static for the lifetime of a hook, so it is safe to cache in memory once + accessed. + """ + self._data[relation_name] = None + + def _get_unique(self, relation_name, relation_id=None): + if relation_id is not None: + if not isinstance(relation_id, int): + raise ModelError('relation id {} must be int or None not {}'.format( + relation_id, + type(relation_id).__name__)) + for relation in self[relation_name]: + if relation.id == relation_id: + return relation + else: + # The relation may be dead, but it is not forgotten. + is_peer = relation_name in self._peers + return Relation(relation_name, relation_id, is_peer, + self._our_unit, self._backend, self._cache) + num_related = len(self[relation_name]) + if num_related == 0: + return None + elif num_related == 1: + return self[relation_name][0] + else: + # TODO: We need something in the framework to catch and gracefully handle + # errors, ideally integrating the error catching with Juju's mechanisms. + raise TooManyRelatedAppsError(relation_name, num_related, 1) + + +class BindingMapping: + """Mapping of endpoints to network bindings. + + Charm authors should not instantiate this directly, but access it via + :meth:`Model.get_binding` + """ + + def __init__(self, backend): + self._backend = backend + self._data = {} + + def get(self, binding_key: typing.Union[str, 'Relation']) -> 'Binding': + """Get a specific Binding for an endpoint/relation. + + Not used directly by Charm authors. See :meth:`Model.get_binding` + """ + if isinstance(binding_key, Relation): + binding_name = binding_key.name + relation_id = binding_key.id + elif isinstance(binding_key, str): + binding_name = binding_key + relation_id = None + else: + raise ModelError('binding key must be str or relation instance, not {}' + ''.format(type(binding_key).__name__)) + binding = self._data.get(binding_key) + if binding is None: + binding = Binding(binding_name, relation_id, self._backend) + self._data[binding_key] = binding + return binding + + +class Binding: + """Binding to a network space. + + Attributes: + name: The name of the endpoint this binding represents (eg, 'db') + """ + + def __init__(self, name, relation_id, backend): + self.name = name + self._relation_id = relation_id + self._backend = backend + self._network = None + + @property + def network(self) -> 'Network': + """The network information for this binding.""" + if self._network is None: + try: + self._network = Network(self._backend.network_get(self.name, self._relation_id)) + except RelationNotFoundError: + if self._relation_id is None: + raise + # If a relation is dead, we can still get network info associated with an + # endpoint itself + self._network = Network(self._backend.network_get(self.name)) + return self._network + + +class Network: + """Network space details. + + Charm authors should not instantiate this directly, but should get access to the Network + definition from :meth:`Model.get_binding` and its ``network`` attribute. + + Attributes: + interfaces: A list of :class:`NetworkInterface` details. This includes the + information about how your application should be configured (eg, what + IP addresses should you bind to.) + Note that multiple addresses for a single interface are represented as multiple + interfaces. (eg, ``[NetworkInfo('ens1', '10.1.1.1/32'), + NetworkInfo('ens1', '10.1.2.1/32'])``) + ingress_addresses: A list of :class:`ipaddress.ip_address` objects representing the IP + addresses that other units should use to get in touch with you. + egress_subnets: A list of :class:`ipaddress.ip_network` representing the subnets that + other units will see you connecting from. Due to things like NAT it isn't always + possible to narrow it down to a single address, but when it is clear, the CIDRs + will be constrained to a single address. (eg, 10.0.0.1/32) + Args: + network_info: A dict of network information as returned by ``network-get``. + """ + + def __init__(self, network_info: dict): + self.interfaces = [] + # Treat multiple addresses on an interface as multiple logical + # interfaces with the same name. + for interface_info in network_info.get('bind-addresses', []): + interface_name = interface_info.get('interface-name') + for address_info in interface_info.get('addresses', []): + self.interfaces.append(NetworkInterface(interface_name, address_info)) + self.ingress_addresses = [] + for address in network_info.get('ingress-addresses', []): + self.ingress_addresses.append(ipaddress.ip_address(address)) + self.egress_subnets = [] + for subnet in network_info.get('egress-subnets', []): + self.egress_subnets.append(ipaddress.ip_network(subnet)) + + @property + def bind_address(self): + """A single address that your application should bind() to. + + For the common case where there is a single answer. This represents a single + address from :attr:`.interfaces` that can be used to configure where your + application should bind() and listen(). + """ + if self.interfaces: + return self.interfaces[0].address + else: + return None + + @property + def ingress_address(self): + """The address other applications should use to connect to your unit. + + Due to things like public/private addresses, NAT and tunneling, the address you bind() + to is not always the address other people can use to connect() to you. + This is just the first address from :attr:`.ingress_addresses`. + """ + if self.ingress_addresses: + return self.ingress_addresses[0] + else: + return None + + +class NetworkInterface: + """Represents a single network interface that the charm needs to know about. + + Charmers should not instantiate this type directly. Instead use :meth:`Model.get_binding` + to get the network information for a given endpoint. + + Attributes: + name: The name of the interface (eg. 'eth0', or 'ens1') + subnet: An :class:`ipaddress.ip_network` representation of the IP for the network + interface. This may be a single address (eg '10.0.1.2/32') + """ + + def __init__(self, name: str, address_info: dict): + self.name = name + # TODO: expose a hardware address here, see LP: #1864070. + address = address_info.get('value') + # The value field may be empty. + if address: + self.address = ipaddress.ip_address(address) + else: + self.address = None + cidr = address_info.get('cidr') + # The cidr field may be empty, see LP: #1864102. + if cidr: + self.subnet = ipaddress.ip_network(cidr) + elif address: + # If we have an address, convert it to a /32 or /128 IP network. + self.subnet = ipaddress.ip_network(address) + else: + self.subnet = None + # TODO: expose a hostname/canonical name for the address here, see LP: #1864086. + + +class Relation: + """Represents an established relation between this application and another application. + + This class should not be instantiated directly, instead use :meth:`Model.get_relation` + or :attr:`ops.charm.RelationEvent.relation`. + + Attributes: + name: The name of the local endpoint of the relation (eg 'db') + id: The identifier for a particular relation (integer) + app: An :class:`Application` representing the remote application of this relation. + For peer relations this will be the local application. + units: A set of :class:`Unit` for units that have started and joined this relation. + data: A :class:`RelationData` holding the data buckets for each entity + of a relation. Accessed via eg Relation.data[unit]['foo'] + """ + + def __init__( + self, relation_name: str, relation_id: int, is_peer: bool, our_unit: Unit, + backend: '_ModelBackend', cache: '_ModelCache'): + self.name = relation_name + self.id = relation_id + self.app = None + self.units = set() + + # For peer relations, both the remote and the local app are the same. + if is_peer: + self.app = our_unit.app + try: + for unit_name in backend.relation_list(self.id): + unit = cache.get(Unit, unit_name) + self.units.add(unit) + if self.app is None: + self.app = unit.app + except RelationNotFoundError: + # If the relation is dead, just treat it as if it has no remote units. + pass + self.data = RelationData(self, our_unit, backend) + + def __repr__(self): + return '<{}.{} {}:{}>'.format(type(self).__module__, + type(self).__name__, + self.name, + self.id) + + +class RelationData(Mapping): + """Represents the various data buckets of a given relation. + + Each unit and application involved in a relation has their own data bucket. + Eg: ``{entity: RelationDataContent}`` + where entity can be either a :class:`Unit` or a :class:`Application`. + + Units can read and write their own data, and if they are the leader, + they can read and write their application data. They are allowed to read + remote unit and application data. + + This class should not be created directly. It should be accessed via + :attr:`Relation.data` + """ + + def __init__(self, relation: Relation, our_unit: Unit, backend: '_ModelBackend'): + self.relation = weakref.proxy(relation) + self._data = { + our_unit: RelationDataContent(self.relation, our_unit, backend), + our_unit.app: RelationDataContent(self.relation, our_unit.app, backend), + } + self._data.update({ + unit: RelationDataContent(self.relation, unit, backend) + for unit in self.relation.units}) + # The relation might be dead so avoid a None key here. + if self.relation.app is not None: + self._data.update({ + self.relation.app: RelationDataContent(self.relation, self.relation.app, backend), + }) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def __repr__(self): + return repr(self._data) + + +# We mix in MutableMapping here to get some convenience implementations, but whether it's actually +# mutable or not is controlled by the flag. +class RelationDataContent(LazyMapping, MutableMapping): + """Data content of a unit or application in a relation.""" + + def __init__(self, relation, entity, backend): + self.relation = relation + self._entity = entity + self._backend = backend + self._is_app = isinstance(entity, Application) + + def _load(self): + """Load the data from the current entity / relation.""" + try: + return self._backend.relation_get(self.relation.id, self._entity.name, self._is_app) + except RelationNotFoundError: + # Dead relations tell no tales (and have no data). + return {} + + def _is_mutable(self): + """Return if the data content can be modified.""" + if self._is_app: + is_our_app = self._backend.app_name == self._entity.name + if not is_our_app: + return False + # Whether the application data bag is mutable or not depends on + # whether this unit is a leader or not, but this is not guaranteed + # to be always true during the same hook execution. + return self._backend.is_leader() + else: + is_our_unit = self._backend.unit_name == self._entity.name + if is_our_unit: + return True + return False + + def __setitem__(self, key, value): + if not self._is_mutable(): + raise RelationDataError('cannot set relation data for {}'.format(self._entity.name)) + if not isinstance(value, str): + raise RelationDataError('relation data values must be strings') + + self._backend.relation_set(self.relation.id, key, value, self._is_app) + + # Don't load data unnecessarily if we're only updating. + if self._lazy_data is not None: + if value == '': + # Match the behavior of Juju, which is that setting the value to an + # empty string will remove the key entirely from the relation data. + self._data.pop(key, None) + else: + self._data[key] = value + + def __delitem__(self, key): + # Match the behavior of Juju, which is that setting the value to an empty + # string will remove the key entirely from the relation data. + self.__setitem__(key, '') + + +class ConfigData(LazyMapping): + """Configuration data. + + This class should not be created directly. It should be accessed via :attr:`Model.config`. + """ + + def __init__(self, backend): + self._backend = backend + + def _load(self): + return self._backend.config_get() + + +class StatusBase: + """Status values specific to applications and units. + + To access a status by name, see :meth:`StatusBase.from_name`, most use cases will just + directly use the child class to indicate their status. + """ + + _statuses = {} + name = None + + def __init__(self, message: str): + self.message = message + + def __new__(cls, *args, **kwargs): + """Forbid the usage of StatusBase directly.""" + if cls is StatusBase: + raise TypeError("cannot instantiate a base class") + return super().__new__(cls) + + def __eq__(self, other): + if not isinstance(self, type(other)): + return False + return self.message == other.message + + def __repr__(self): + return "{.__class__.__name__}({!r})".format(self, self.message) + + @classmethod + def from_name(cls, name: str, message: str): + """Get the specific Status for the name (or UnknownStatus if not registered).""" + if name == 'unknown': + # unknown is special + return UnknownStatus() + else: + return cls._statuses[name](message) + + @classmethod + def register(cls, child): + """Register a Status for the child's name.""" + if child.name is None: + raise AttributeError('cannot register a Status which has no name') + cls._statuses[child.name] = child + return child + + +@StatusBase.register +class UnknownStatus(StatusBase): + """The unit status is unknown. + + A unit-agent has finished calling install, config-changed and start, but the + charm has not called status-set yet. + + """ + name = 'unknown' + + def __init__(self): + # Unknown status cannot be set and does not have a message associated with it. + super().__init__('') + + def __repr__(self): + return "UnknownStatus()" + + +@StatusBase.register +class ActiveStatus(StatusBase): + """The unit is ready. + + The unit believes it is correctly offering all the services it has been asked to offer. + """ + name = 'active' + + def __init__(self, message: str = ''): + super().__init__(message) + + +@StatusBase.register +class BlockedStatus(StatusBase): + """The unit requires manual intervention. + + An operator has to manually intervene to unblock the unit and let it proceed. + """ + name = 'blocked' + + +@StatusBase.register +class MaintenanceStatus(StatusBase): + """The unit is performing maintenance tasks. + + The unit is not yet providing services, but is actively doing work in preparation + for providing those services. This is a "spinning" state, not an error state. It + reflects activity on the unit itself, not on peers or related units. + + """ + name = 'maintenance' + + +@StatusBase.register +class WaitingStatus(StatusBase): + """A unit is unable to progress. + + The unit is unable to progress to an active state because an application to which + it is related is not running. + + """ + name = 'waiting' + + +class Resources: + """Object representing resources for the charm.""" + + def __init__(self, names: typing.Iterable[str], backend: '_ModelBackend'): + self._backend = backend + self._paths = {name: None for name in names} + + def fetch(self, name: str) -> Path: + """Fetch the resource from the controller or store. + + If successfully fetched, this returns a Path object to where the resource is stored + on disk, otherwise it raises a ModelError. + """ + if name not in self._paths: + raise RuntimeError('invalid resource name: {}'.format(name)) + if self._paths[name] is None: + self._paths[name] = Path(self._backend.resource_get(name)) + return self._paths[name] + + +class Pod: + """Represents the definition of a pod spec in Kubernetes models. + + Currently only supports simple access to setting the Juju pod spec via :attr:`.set_spec`. + """ + + def __init__(self, backend: '_ModelBackend'): + self._backend = backend + + def set_spec(self, spec: typing.Mapping, k8s_resources: typing.Mapping = None): + """Set the specification for pods that Juju should start in kubernetes. + + See `juju help-tool pod-spec-set` for details of what should be passed. + + Args: + spec: The mapping defining the pod specification + k8s_resources: Additional kubernetes specific specification. + + Returns: + None + """ + if not self._backend.is_leader(): + raise ModelError('cannot set a pod spec as this unit is not a leader') + self._backend.pod_spec_set(spec, k8s_resources) + + +class StorageMapping(Mapping): + """Map of storage names to lists of Storage instances.""" + + def __init__(self, storage_names: typing.Iterable[str], backend: '_ModelBackend'): + self._backend = backend + self._storage_map = {storage_name: None for storage_name in storage_names} + + def __contains__(self, key: str): + return key in self._storage_map + + def __len__(self): + return len(self._storage_map) + + def __iter__(self): + return iter(self._storage_map) + + def __getitem__(self, storage_name: str) -> typing.List['Storage']: + storage_list = self._storage_map[storage_name] + if storage_list is None: + storage_list = self._storage_map[storage_name] = [] + for storage_id in self._backend.storage_list(storage_name): + storage_list.append(Storage(storage_name, storage_id, self._backend)) + return storage_list + + def request(self, storage_name: str, count: int = 1): + """Requests new storage instances of a given name. + + Uses storage-add tool to request additional storage. Juju will notify the unit + via -storage-attached events when it becomes available. + """ + if storage_name not in self._storage_map: + raise ModelError(('cannot add storage {!r}:' + ' it is not present in the charm metadata').format(storage_name)) + self._backend.storage_add(storage_name, count) + + +class Storage: + """Represents a storage as defined in metadata.yaml. + + Attributes: + name: Simple string name of the storage + id: The provider id for storage + """ + + def __init__(self, storage_name, storage_id, backend): + self.name = storage_name + self.id = storage_id + self._backend = backend + self._location = None + + @property + def location(self): + """Return the location of the storage.""" + if self._location is None: + raw = self._backend.storage_get('{}/{}'.format(self.name, self.id), "location") + self._location = Path(raw) + return self._location + + +class ModelError(Exception): + """Base class for exceptions raised when interacting with the Model.""" + pass + + +class TooManyRelatedAppsError(ModelError): + """Raised by :meth:`Model.get_relation` if there is more than one related application.""" + + def __init__(self, relation_name, num_related, max_supported): + super().__init__('Too many remote applications on {} ({} > {})'.format( + relation_name, num_related, max_supported)) + self.relation_name = relation_name + self.num_related = num_related + self.max_supported = max_supported + + +class RelationDataError(ModelError): + """Raised by ``Relation.data[entity][key] = 'foo'`` if the data is invalid. + + This is raised if you're either trying to set a value to something that isn't a string, + or if you are trying to set a value in a bucket that you don't have access to. (eg, + another application/unit or setting your application data but you aren't the leader.) + """ + + +class RelationNotFoundError(ModelError): + """Backend error when querying juju for a given relation and that relation doesn't exist.""" + + +class InvalidStatusError(ModelError): + """Raised if trying to set an Application or Unit status to something invalid.""" + + +class _ModelBackend: + """Represents the connection between the Model representation and talking to Juju. + + Charm authors should not directly interact with the ModelBackend, it is a private + implementation of Model. + """ + + LEASE_RENEWAL_PERIOD = datetime.timedelta(seconds=30) + + def __init__(self, unit_name=None, model_name=None): + if unit_name is None: + self.unit_name = os.environ['JUJU_UNIT_NAME'] + else: + self.unit_name = unit_name + if model_name is None: + model_name = os.environ.get('JUJU_MODEL_NAME') + self.model_name = model_name + self.app_name = self.unit_name.split('/')[0] + + self._is_leader = None + self._leader_check_time = None + + def _run(self, *args, return_output=False, use_json=False): + kwargs = dict(stdout=PIPE, stderr=PIPE, check=True) + args = (shutil.which(args[0]),) + args[1:] + if use_json: + args += ('--format=json',) + try: + result = run(args, **kwargs) + except CalledProcessError as e: + raise ModelError(e.stderr) + if return_output: + if result.stdout is None: + return '' + else: + text = result.stdout.decode('utf8') + if use_json: + return json.loads(text) + else: + return text + + def relation_ids(self, relation_name): + relation_ids = self._run('relation-ids', relation_name, return_output=True, use_json=True) + return [int(relation_id.split(':')[-1]) for relation_id in relation_ids] + + def relation_list(self, relation_id): + try: + return self._run('relation-list', '-r', str(relation_id), + return_output=True, use_json=True) + except ModelError as e: + if 'relation not found' in str(e): + raise RelationNotFoundError() from e + raise + + def relation_get(self, relation_id, member_name, is_app): + if not isinstance(is_app, bool): + raise TypeError('is_app parameter to relation_get must be a boolean') + + if is_app: + version = JujuVersion.from_environ() + if not version.has_app_data(): + raise RuntimeError( + 'getting application data is not supported on Juju version {}'.format(version)) + + args = ['relation-get', '-r', str(relation_id), '-', member_name] + if is_app: + args.append('--app') + + try: + return self._run(*args, return_output=True, use_json=True) + except ModelError as e: + if 'relation not found' in str(e): + raise RelationNotFoundError() from e + raise + + def relation_set(self, relation_id, key, value, is_app): + if not isinstance(is_app, bool): + raise TypeError('is_app parameter to relation_set must be a boolean') + + if is_app: + version = JujuVersion.from_environ() + if not version.has_app_data(): + raise RuntimeError( + 'setting application data is not supported on Juju version {}'.format(version)) + + args = ['relation-set', '-r', str(relation_id), '{}={}'.format(key, value)] + if is_app: + args.append('--app') + + try: + return self._run(*args) + except ModelError as e: + if 'relation not found' in str(e): + raise RelationNotFoundError() from e + raise + + def config_get(self): + return self._run('config-get', return_output=True, use_json=True) + + def is_leader(self): + """Obtain the current leadership status for the unit the charm code is executing on. + + The value is cached for the duration of a lease which is 30s in Juju. + """ + now = time.monotonic() + if self._leader_check_time is None: + check = True + else: + time_since_check = datetime.timedelta(seconds=now - self._leader_check_time) + check = (time_since_check > self.LEASE_RENEWAL_PERIOD or self._is_leader is None) + if check: + # Current time MUST be saved before running is-leader to ensure the cache + # is only used inside the window that is-leader itself asserts. + self._leader_check_time = now + self._is_leader = self._run('is-leader', return_output=True, use_json=True) + + return self._is_leader + + def resource_get(self, resource_name): + return self._run('resource-get', resource_name, return_output=True).strip() + + def pod_spec_set(self, spec, k8s_resources): + tmpdir = Path(tempfile.mkdtemp('-pod-spec-set')) + try: + spec_path = tmpdir / 'spec.yaml' + with spec_path.open("wt", encoding="utf8") as f: + yaml.dump(spec, stream=f, Dumper=_DefaultDumper) + args = ['--file', str(spec_path)] + if k8s_resources: + k8s_res_path = tmpdir / 'k8s-resources.yaml' + with k8s_res_path.open("wt", encoding="utf8") as f: + yaml.dump(k8s_resources, stream=f, Dumper=_DefaultDumper) + args.extend(['--k8s-resources', str(k8s_res_path)]) + self._run('pod-spec-set', *args) + finally: + shutil.rmtree(str(tmpdir)) + + def status_get(self, *, is_app=False): + """Get a status of a unit or an application. + + Args: + is_app: A boolean indicating whether the status should be retrieved for a unit + or an application. + """ + content = self._run( + 'status-get', '--include-data', '--application={}'.format(is_app), + use_json=True, + return_output=True) + # Unit status looks like (in YAML): + # message: 'load: 0.28 0.26 0.26' + # status: active + # status-data: {} + # Application status looks like (in YAML): + # application-status: + # message: 'load: 0.28 0.26 0.26' + # status: active + # status-data: {} + # units: + # uo/0: + # message: 'load: 0.28 0.26 0.26' + # status: active + # status-data: {} + + if is_app: + return {'status': content['application-status']['status'], + 'message': content['application-status']['message']} + else: + return content + + def status_set(self, status, message='', *, is_app=False): + """Set a status of a unit or an application. + + Args: + status: The status to set. + message: The message to set in the status. + is_app: A boolean indicating whether the status should be set for a unit or an + application. + """ + if not isinstance(is_app, bool): + raise TypeError('is_app parameter must be boolean') + return self._run('status-set', '--application={}'.format(is_app), status, message) + + def storage_list(self, name): + return [int(s.split('/')[1]) for s in self._run('storage-list', name, + return_output=True, use_json=True)] + + def storage_get(self, storage_name_id, attribute): + return self._run('storage-get', '-s', storage_name_id, attribute, + return_output=True, use_json=True) + + def storage_add(self, name, count=1): + if not isinstance(count, int) or isinstance(count, bool): + raise TypeError('storage count must be integer, got: {} ({})'.format(count, + type(count))) + self._run('storage-add', '{}={}'.format(name, count)) + + def action_get(self): + return self._run('action-get', return_output=True, use_json=True) + + def action_set(self, results): + self._run('action-set', *["{}={}".format(k, v) for k, v in results.items()]) + + def action_log(self, message): + self._run('action-log', message) + + def action_fail(self, message=''): + self._run('action-fail', message) + + def application_version_set(self, version): + self._run('application-version-set', '--', version) + + def juju_log(self, level, message): + self._run('juju-log', '--log-level', level, "--", message) + + def network_get(self, binding_name, relation_id=None): + """Return network info provided by network-get for a given binding. + + Args: + binding_name: A name of a binding (relation name or extra-binding name). + relation_id: An optional relation id to get network info for. + """ + cmd = ['network-get', binding_name] + if relation_id is not None: + cmd.extend(['-r', str(relation_id)]) + try: + return self._run(*cmd, return_output=True, use_json=True) + except ModelError as e: + if 'relation not found' in str(e): + raise RelationNotFoundError() from e + raise + + def add_metrics(self, metrics, labels=None): + cmd = ['add-metric'] + + if labels: + label_args = [] + for k, v in labels.items(): + _ModelBackendValidator.validate_metric_label(k) + _ModelBackendValidator.validate_label_value(k, v) + label_args.append('{}={}'.format(k, v)) + cmd.extend(['--labels', ','.join(label_args)]) + + metric_args = [] + for k, v in metrics.items(): + _ModelBackendValidator.validate_metric_key(k) + metric_value = _ModelBackendValidator.format_metric_value(v) + metric_args.append('{}={}'.format(k, metric_value)) + cmd.extend(metric_args) + self._run(*cmd) + + +class _ModelBackendValidator: + """Provides facilities for validating inputs and formatting them for model backends.""" + + METRIC_KEY_REGEX = re.compile(r'^[a-zA-Z](?:[a-zA-Z0-9-_]*[a-zA-Z0-9])?$') + + @classmethod + def validate_metric_key(cls, key): + if cls.METRIC_KEY_REGEX.match(key) is None: + raise ModelError( + 'invalid metric key {!r}: must match {}'.format( + key, cls.METRIC_KEY_REGEX.pattern)) + + @classmethod + def validate_metric_label(cls, label_name): + if cls.METRIC_KEY_REGEX.match(label_name) is None: + raise ModelError( + 'invalid metric label name {!r}: must match {}'.format( + label_name, cls.METRIC_KEY_REGEX.pattern)) + + @classmethod + def format_metric_value(cls, value): + try: + decimal_value = decimal.Decimal.from_float(value) + except TypeError as e: + e2 = ModelError('invalid metric value {!r} provided:' + ' must be a positive finite float'.format(value)) + raise e2 from e + if decimal_value.is_nan() or decimal_value.is_infinite() or decimal_value < 0: + raise ModelError('invalid metric value {!r} provided:' + ' must be a positive finite float'.format(value)) + return str(decimal_value) + + @classmethod + def validate_label_value(cls, label, value): + # Label values cannot be empty, contain commas or equal signs as those are + # used by add-metric as separators. + if not value: + raise ModelError( + 'metric label {} has an empty value, which is not allowed'.format(label)) + v = str(value) + if re.search('[,=]', v) is not None: + raise ModelError( + 'metric label values must not contain "," or "=": {}={!r}'.format(label, value)) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/storage.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/storage.py new file mode 100644 index 00000000..562cde77 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/storage.py @@ -0,0 +1,374 @@ +# Copyright 2019-2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Structures to offer storage to the charm (through Juju or locally).""" + +from datetime import timedelta +import pickle +import shutil +import subprocess +import sqlite3 +import typing + +import yaml + + +def _run(args, **kw): + cmd = shutil.which(args[0]) + if cmd is None: + raise FileNotFoundError(args[0]) + return subprocess.run([cmd, *args[1:]], **kw) + + +class SQLiteStorage: + """Storage using SQLite backend.""" + + DB_LOCK_TIMEOUT = timedelta(hours=1) + + def __init__(self, filename): + # The isolation_level argument is set to None such that the implicit + # transaction management behavior of the sqlite3 module is disabled. + self._db = sqlite3.connect(str(filename), + isolation_level=None, + timeout=self.DB_LOCK_TIMEOUT.total_seconds()) + self._setup() + + def _setup(self): + """Make the database ready to be used as storage.""" + # Make sure that the database is locked until the connection is closed, + # not until the transaction ends. + self._db.execute("PRAGMA locking_mode=EXCLUSIVE") + c = self._db.execute("BEGIN") + c.execute("SELECT count(name) FROM sqlite_master WHERE type='table' AND name='snapshot'") + if c.fetchone()[0] == 0: + # Keep in mind what might happen if the process dies somewhere below. + # The system must not be rendered permanently broken by that. + self._db.execute("CREATE TABLE snapshot (handle TEXT PRIMARY KEY, data BLOB)") + self._db.execute(''' + CREATE TABLE notice ( + sequence INTEGER PRIMARY KEY AUTOINCREMENT, + event_path TEXT, + observer_path TEXT, + method_name TEXT) + ''') + self._db.commit() + + def close(self): + """Part of the Storage API, close the storage backend.""" + self._db.close() + + def commit(self): + """Part of the Storage API, commit latest changes in the storage backend.""" + self._db.commit() + + # There's commit but no rollback. For abort to be supported, we'll need logic that + # can rollback decisions made by third-party code in terms of the internal state + # of objects that have been snapshotted, and hooks to let them know about it and + # take the needed actions to undo their logic until the last snapshot. + # This is doable but will increase significantly the chances for mistakes. + + def save_snapshot(self, handle_path: str, snapshot_data: typing.Any) -> None: + """Part of the Storage API, persist a snapshot data under the given handle. + + Args: + handle_path: The string identifying the snapshot. + snapshot_data: The data to be persisted. (as returned by Object.snapshot()). This + might be a dict/tuple/int, but must only contain 'simple' python types. + """ + # Use pickle for serialization, so the value remains portable. + raw_data = pickle.dumps(snapshot_data) + self._db.execute("REPLACE INTO snapshot VALUES (?, ?)", (handle_path, raw_data)) + + def load_snapshot(self, handle_path: str) -> typing.Any: + """Part of the Storage API, retrieve a snapshot that was previously saved. + + Args: + handle_path: The string identifying the snapshot. + + Raises: + NoSnapshotError: if there is no snapshot for the given handle_path. + """ + c = self._db.cursor() + c.execute("SELECT data FROM snapshot WHERE handle=?", (handle_path,)) + row = c.fetchone() + if row: + return pickle.loads(row[0]) + raise NoSnapshotError(handle_path) + + def drop_snapshot(self, handle_path: str): + """Part of the Storage API, remove a snapshot that was previously saved. + + Dropping a snapshot that doesn't exist is treated as a no-op. + """ + self._db.execute("DELETE FROM snapshot WHERE handle=?", (handle_path,)) + + def list_snapshots(self) -> typing.Generator[str, None, None]: + """Return the name of all snapshots that are currently saved.""" + c = self._db.cursor() + c.execute("SELECT handle FROM snapshot") + while True: + rows = c.fetchmany() + if not rows: + break + for row in rows: + yield row[0] + + def save_notice(self, event_path: str, observer_path: str, method_name: str) -> None: + """Part of the Storage API, record an notice (event and observer).""" + self._db.execute('INSERT INTO notice VALUES (NULL, ?, ?, ?)', + (event_path, observer_path, method_name)) + + def drop_notice(self, event_path: str, observer_path: str, method_name: str) -> None: + """Part of the Storage API, remove a notice that was previously recorded.""" + self._db.execute(''' + DELETE FROM notice + WHERE event_path=? + AND observer_path=? + AND method_name=? + ''', (event_path, observer_path, method_name)) + + def notices(self, event_path: str = None) ->\ + typing.Generator[typing.Tuple[str, str, str], None, None]: + """Part of the Storage API, return all notices that begin with event_path. + + Args: + event_path: If supplied, will only yield events that match event_path. If not + supplied (or None/'') will return all events. + + Returns: + Iterable of (event_path, observer_path, method_name) tuples + """ + if event_path: + c = self._db.execute(''' + SELECT event_path, observer_path, method_name + FROM notice + WHERE event_path=? + ORDER BY sequence + ''', (event_path,)) + else: + c = self._db.execute(''' + SELECT event_path, observer_path, method_name + FROM notice + ORDER BY sequence + ''') + while True: + rows = c.fetchmany() + if not rows: + break + for row in rows: + yield tuple(row) + + +class JujuStorage: + """Storing the content tracked by the Framework in Juju. + + This uses :class:`_JujuStorageBackend` to interact with state-get/state-set + as the way to store state for the framework and for components. + """ + + NOTICE_KEY = "#notices#" + + def __init__(self, backend: '_JujuStorageBackend' = None): + self._backend = backend + if backend is None: + self._backend = _JujuStorageBackend() + + def close(self): + """Part of the Storage API, close the storage backend. + + Nothing to be done for Juju backend, as it's transactional. + """ + + def commit(self): + """Part of the Storage API, commit latest changes in the storage backend. + + Nothing to be done for Juju backend, as it's transactional. + """ + + def save_snapshot(self, handle_path: str, snapshot_data: typing.Any) -> None: + """Part of the Storage API, persist a snapshot data under the given handle. + + Args: + handle_path: The string identifying the snapshot. + snapshot_data: The data to be persisted. (as returned by Object.snapshot()). This + might be a dict/tuple/int, but must only contain 'simple' python types. + """ + self._backend.set(handle_path, snapshot_data) + + def load_snapshot(self, handle_path): + """Part of the Storage API, retrieve a snapshot that was previously saved. + + Args: + handle_path: The string identifying the snapshot. + + Raises: + NoSnapshotError: if there is no snapshot for the given handle_path. + """ + try: + content = self._backend.get(handle_path) + except KeyError: + raise NoSnapshotError(handle_path) + return content + + def drop_snapshot(self, handle_path): + """Part of the Storage API, remove a snapshot that was previously saved. + + Dropping a snapshot that doesn't exist is treated as a no-op. + """ + self._backend.delete(handle_path) + + def save_notice(self, event_path: str, observer_path: str, method_name: str): + """Part of the Storage API, record an notice (event and observer).""" + notice_list = self._load_notice_list() + notice_list.append([event_path, observer_path, method_name]) + self._save_notice_list(notice_list) + + def drop_notice(self, event_path: str, observer_path: str, method_name: str): + """Part of the Storage API, remove a notice that was previously recorded.""" + notice_list = self._load_notice_list() + notice_list.remove([event_path, observer_path, method_name]) + self._save_notice_list(notice_list) + + def notices(self, event_path: str = None): + """Part of the Storage API, return all notices that begin with event_path. + + Args: + event_path: If supplied, will only yield events that match event_path. If not + supplied (or None/'') will return all events. + + Returns: + Iterable of (event_path, observer_path, method_name) tuples + """ + notice_list = self._load_notice_list() + for row in notice_list: + if event_path and row[0] != event_path: + continue + yield tuple(row) + + def _load_notice_list(self) -> typing.List[typing.Tuple[str]]: + """Load a notice list from current key. + + Returns: + List of (event_path, observer_path, method_name) tuples; empty if no key or is None. + """ + try: + notice_list = self._backend.get(self.NOTICE_KEY) + except KeyError: + return [] + if notice_list is None: + return [] + return notice_list + + def _save_notice_list(self, notices: typing.List[typing.Tuple[str]]) -> None: + """Save a notice list under current key. + + Args: + notices: List of (event_path, observer_path, method_name) tuples. + """ + self._backend.set(self.NOTICE_KEY, notices) + + +class _SimpleLoader(getattr(yaml, 'CSafeLoader', yaml.SafeLoader)): + """Handle a couple basic python types. + + yaml.SafeLoader can handle all the basic int/float/dict/set/etc that we want. The only one + that it *doesn't* handle is tuples. We don't want to support arbitrary types, so we just + subclass SafeLoader and add tuples back in. + """ + # Taken from the example at: + # https://stackoverflow.com/questions/9169025/how-can-i-add-a-python-tuple-to-a-yaml-file-using-pyyaml + + construct_python_tuple = yaml.Loader.construct_python_tuple + + +_SimpleLoader.add_constructor( + u'tag:yaml.org,2002:python/tuple', + _SimpleLoader.construct_python_tuple) + + +class _SimpleDumper(getattr(yaml, 'CSafeDumper', yaml.SafeDumper)): + """Add types supported by 'marshal'. + + YAML can support arbitrary types, but that is generally considered unsafe (like pickle). So + we want to only support dumping out types that are safe to load. + """ + + +_SimpleDumper.represent_tuple = yaml.Dumper.represent_tuple +_SimpleDumper.add_representer(tuple, _SimpleDumper.represent_tuple) + + +def juju_backend_available() -> bool: + """Check if Juju state storage is available.""" + p = shutil.which('state-get') + return p is not None + + +class _JujuStorageBackend: + """Implements the interface from the Operator framework to Juju's state-get/set/etc.""" + + def set(self, key: str, value: typing.Any) -> None: + """Set a key to a given value. + + Args: + key: The string key that will be used to find the value later + value: Arbitrary content that will be returned by get(). + + Raises: + CalledProcessError: if 'state-set' returns an error code. + """ + # default_flow_style=None means that it can use Block for + # complex types (types that have nested types) but use flow + # for simple types (like an array). Not all versions of PyYAML + # have the same default style. + encoded_value = yaml.dump(value, Dumper=_SimpleDumper, default_flow_style=None) + content = yaml.dump( + {key: encoded_value}, encoding='utf8', default_style='|', + default_flow_style=False, + Dumper=_SimpleDumper) + _run(["state-set", "--file", "-"], input=content, check=True) + + def get(self, key: str) -> typing.Any: + """Get the bytes value associated with a given key. + + Args: + key: The string key that will be used to find the value + Raises: + CalledProcessError: if 'state-get' returns an error code. + """ + # We don't capture stderr here so it can end up in debug logs. + p = _run(["state-get", key], stdout=subprocess.PIPE, check=True, universal_newlines=True) + if p.stdout == '' or p.stdout == '\n': + raise KeyError(key) + return yaml.load(p.stdout, Loader=_SimpleLoader) + + def delete(self, key: str) -> None: + """Remove a key from being tracked. + + Args: + key: The key to stop storing + Raises: + CalledProcessError: if 'state-delete' returns an error code. + """ + _run(["state-delete", key], check=True) + + +class NoSnapshotError(Exception): + """Exception to flag that there is no snapshot for the given handle_path.""" + + def __init__(self, handle_path): + self.handle_path = handle_path + + def __str__(self): + return 'no snapshot data found for {} object'.format(self.handle_path) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/testing.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/testing.py new file mode 100644 index 00000000..e70bc98f --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/testing.py @@ -0,0 +1,826 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Infrastructure to build unittests for Charms using the Operator Framework.""" + +import inspect +import pathlib +import random +import tempfile +import typing +import yaml +from contextlib import contextmanager +from textwrap import dedent + +from ops import ( + charm, + framework, + model, + storage, +) + + +# OptionalYAML is something like metadata.yaml or actions.yaml. You can +# pass in a file-like object or the string directly. +OptionalYAML = typing.Optional[typing.Union[str, typing.TextIO]] + + +# noinspection PyProtectedMember +class Harness: + """This class represents a way to build up the model that will drive a test suite. + + The model that is created is from the viewpoint of the charm that you are testing. + + Example:: + + harness = Harness(MyCharm) + # Do initial setup here + relation_id = harness.add_relation('db', 'postgresql') + # Now instantiate the charm to see events as the model changes + harness.begin() + harness.add_relation_unit(relation_id, 'postgresql/0') + harness.update_relation_data(relation_id, 'postgresql/0', {'key': 'val'}) + # Check that charm has properly handled the relation_joined event for postgresql/0 + self.assertEqual(harness.charm. ...) + + Args: + charm_cls: The Charm class that you'll be testing. + meta: charm.CharmBase is a A string or file-like object containing the contents of + metadata.yaml. If not supplied, we will look for a 'metadata.yaml' file in the + parent directory of the Charm, and if not found fall back to a trivial + 'name: test-charm' metadata. + actions: A string or file-like object containing the contents of + actions.yaml. If not supplied, we will look for a 'actions.yaml' file in the + parent directory of the Charm. + config: A string or file-like object containing the contents of + config.yaml. If not supplied, we will look for a 'config.yaml' file in the + parent directory of the Charm. + """ + + def __init__( + self, + charm_cls: typing.Type[charm.CharmBase], + *, + meta: OptionalYAML = None, + actions: OptionalYAML = None, + config: OptionalYAML = None): + self._charm_cls = charm_cls + self._charm = None + self._charm_dir = 'no-disk-path' # this may be updated by _create_meta + self._meta = self._create_meta(meta, actions) + self._unit_name = self._meta.name + '/0' + self._framework = None + self._hooks_enabled = True + self._relation_id_counter = 0 + self._backend = _TestingModelBackend(self._unit_name, self._meta) + self._model = model.Model(self._meta, self._backend) + self._storage = storage.SQLiteStorage(':memory:') + self._oci_resources = {} + self._framework = framework.Framework( + self._storage, self._charm_dir, self._meta, self._model) + self._update_config(key_values=self._load_config_defaults(config)) + + @property + def charm(self) -> charm.CharmBase: + """Return the instance of the charm class that was passed to __init__. + + Note that the Charm is not instantiated until you have called + :meth:`.begin()`. + """ + return self._charm + + @property + def model(self) -> model.Model: + """Return the :class:`~ops.model.Model` that is being driven by this Harness.""" + return self._model + + @property + def framework(self) -> framework.Framework: + """Return the Framework that is being driven by this Harness.""" + return self._framework + + def begin(self) -> None: + """Instantiate the Charm and start handling events. + + Before calling :meth:`begin`, there is no Charm instance, so changes to the Model won't + emit events. You must call :meth:`.begin` before :attr:`.charm` is valid. + """ + if self._charm is not None: + raise RuntimeError('cannot call the begin method on the harness more than once') + + # The Framework adds attributes to class objects for events, etc. As such, we can't re-use + # the original class against multiple Frameworks. So create a locally defined class + # and register it. + # TODO: jam 2020-03-16 We are looking to changes this to Instance attributes instead of + # Class attributes which should clean up this ugliness. The API can stay the same + class TestEvents(self._charm_cls.on.__class__): + pass + + TestEvents.__name__ = self._charm_cls.on.__class__.__name__ + + class TestCharm(self._charm_cls): + on = TestEvents() + + # Note: jam 2020-03-01 This is so that errors in testing say MyCharm has no attribute foo, + # rather than TestCharm has no attribute foo. + TestCharm.__name__ = self._charm_cls.__name__ + self._charm = TestCharm(self._framework) + + def begin_with_initial_hooks(self) -> None: + """Called when you want the Harness to fire the same hooks that Juju would fire at startup. + + This triggers install, relation-created, config-changed, start, and any relation-joined + hooks. Based on what relations have been defined before you called begin(). + Note that all of these are fired before returning control to the test suite, so if you + want to introspect what happens at each step, you need to fire them directly + (eg Charm.on.install.emit()). + + To use this with all the normal hooks, you should instantiate the harness, setup any + relations that you want active when the charm starts, and then call this method. + + Example:: + + harness = Harness(MyCharm) + # Do initial setup here + relation_id = harness.add_relation('db', 'postgresql') + harness.add_relation_unit(relation_id, 'postgresql/0') + harness.update_relation_data(relation_id, 'postgresql/0', {'key': 'val'}) + harness.set_leader(True) + harness.update_config({'initial': 'config'}) + harness.begin_with_initial_hooks() + # This will cause + # install, db-relation-created('postgresql'), leader-elected, config-changed, start + # db-relation-joined('postrgesql/0'), db-relation-changed('postgresql/0') + # To be fired. + """ + self.begin() + # TODO: jam 2020-08-03 This should also handle storage-attached hooks once we have support + # for dealing with storage. + self._charm.on.install.emit() + # Juju itself iterates what relation to fire based on a map[int]relation, so it doesn't + # guarantee a stable ordering between relation events. It *does* give a stable ordering + # of joined units for a given relation. + items = list(self._meta.relations.items()) + random.shuffle(items) + this_app_name = self._meta.name + for relname, rel_meta in items: + if rel_meta.role == charm.RelationRole.peer: + # If the user has directly added a relation, leave it be, but otherwise ensure + # that peer relations are always established at before leader-elected. + rel_ids = self._backend._relation_ids_map.get(relname) + if rel_ids is None: + self.add_relation(relname, self._meta.name) + else: + random.shuffle(rel_ids) + for rel_id in rel_ids: + self._emit_relation_created(relname, rel_id, this_app_name) + else: + rel_ids = self._backend._relation_ids_map.get(relname, []) + random.shuffle(rel_ids) + for rel_id in rel_ids: + app_name = self._backend._relation_app_and_units[rel_id]["app"] + self._emit_relation_created(relname, rel_id, app_name) + if self._backend._is_leader: + self._charm.on.leader_elected.emit() + else: + self._charm.on.leader_settings_changed.emit() + self._charm.on.config_changed.emit() + self._charm.on.start.emit() + all_ids = list(self._backend._relation_names.items()) + random.shuffle(all_ids) + for rel_id, rel_name in all_ids: + rel_app_and_units = self._backend._relation_app_and_units[rel_id] + app_name = rel_app_and_units["app"] + # Note: Juju *does* fire relation events for a given relation in the sorted order of + # the unit names. It also always fires relation-changed immediately after + # relation-joined for the same unit. + # Juju only fires relation-changed (app) if there is data for the related application + relation = self._model.get_relation(rel_name, rel_id) + if self._backend._relation_data[rel_id].get(app_name): + app = self._model.get_app(app_name) + self._charm.on[rel_name].relation_changed.emit( + relation, app, None) + for unit_name in sorted(rel_app_and_units["units"]): + remote_unit = self._model.get_unit(unit_name) + self._charm.on[rel_name].relation_joined.emit( + relation, remote_unit.app, remote_unit) + self._charm.on[rel_name].relation_changed.emit( + relation, remote_unit.app, remote_unit) + + def cleanup(self) -> None: + """Called by your test infrastructure to cleanup any temporary directories/files/etc. + + Currently this only needs to be called if you test with resources. But it is reasonable + to always include a `testcase.addCleanup(harness.cleanup)` just in case. + """ + self._backend._cleanup() + + def _create_meta(self, charm_metadata, action_metadata): + """Create a CharmMeta object. + + Handle the cases where a user doesn't supply explicit metadata snippets. + """ + filename = inspect.getfile(self._charm_cls) + charm_dir = pathlib.Path(filename).parents[1] + + if charm_metadata is None: + metadata_path = charm_dir / 'metadata.yaml' + if metadata_path.is_file(): + charm_metadata = metadata_path.read_text() + self._charm_dir = charm_dir + else: + # The simplest of metadata that the framework can support + charm_metadata = 'name: test-charm' + elif isinstance(charm_metadata, str): + charm_metadata = dedent(charm_metadata) + + if action_metadata is None: + actions_path = charm_dir / 'actions.yaml' + if actions_path.is_file(): + action_metadata = actions_path.read_text() + self._charm_dir = charm_dir + elif isinstance(action_metadata, str): + action_metadata = dedent(action_metadata) + + return charm.CharmMeta.from_yaml(charm_metadata, action_metadata) + + def _load_config_defaults(self, charm_config): + """Load default values from config.yaml. + + Handle the case where a user doesn't supply explicit config snippets. + """ + filename = inspect.getfile(self._charm_cls) + charm_dir = pathlib.Path(filename).parents[1] + + if charm_config is None: + config_path = charm_dir / 'config.yaml' + if config_path.is_file(): + charm_config = config_path.read_text() + self._charm_dir = charm_dir + else: + # The simplest of config that the framework can support + charm_config = '{}' + elif isinstance(charm_config, str): + charm_config = dedent(charm_config) + charm_config = yaml.load(charm_config, Loader=yaml.SafeLoader) + charm_config = charm_config.get('options', {}) + return {key: value['default'] for key, value in charm_config.items() + if 'default' in value} + + def add_oci_resource(self, resource_name: str, + contents: typing.Mapping[str, str] = None) -> None: + """Add oci resources to the backend. + + This will register an oci resource and create a temporary file for processing metadata + about the resource. A default set of values will be used for all the file contents + unless a specific contents dict is provided. + + Args: + resource_name: Name of the resource to add custom contents to. + contents: Optional custom dict to write for the named resource. + """ + if not contents: + contents = {'registrypath': 'registrypath', + 'username': 'username', + 'password': 'password', + } + if resource_name not in self._meta.resources.keys(): + raise RuntimeError('Resource {} is not a defined resources'.format(resource_name)) + if self._meta.resources[resource_name].type != "oci-image": + raise RuntimeError('Resource {} is not an OCI Image'.format(resource_name)) + + as_yaml = yaml.dump(contents, Dumper=yaml.SafeDumper) + self._backend._resources_map[resource_name] = ('contents.yaml', as_yaml) + + def add_resource(self, resource_name: str, content: typing.AnyStr) -> None: + """Add content for a resource to the backend. + + This will register the content, so that a call to `Model.resources.fetch(resource_name)` + will return a path to a file containing that content. + + Args: + resource_name: The name of the resource being added + content: Either string or bytes content, which will be the content of the filename + returned by resource-get. If contents is a string, it will be encoded in utf-8 + """ + if resource_name not in self._meta.resources.keys(): + raise RuntimeError('Resource {} is not a defined resources'.format(resource_name)) + record = self._meta.resources[resource_name] + if record.type != "file": + raise RuntimeError( + 'Resource {} is not a file, but actually {}'.format(resource_name, record.type)) + filename = record.filename + if filename is None: + filename = resource_name + + self._backend._resources_map[resource_name] = (filename, content) + + def populate_oci_resources(self) -> None: + """Populate all OCI resources.""" + for name, data in self._meta.resources.items(): + if data.type == "oci-image": + self.add_oci_resource(name) + + def disable_hooks(self) -> None: + """Stop emitting hook events when the model changes. + + This can be used by developers to stop changes to the model from emitting events that + the charm will react to. Call :meth:`.enable_hooks` + to re-enable them. + """ + self._hooks_enabled = False + + def enable_hooks(self) -> None: + """Re-enable hook events from charm.on when the model is changed. + + By default hook events are enabled once you call :meth:`.begin`, + but if you have used :meth:`.disable_hooks`, this can be used to + enable them again. + """ + self._hooks_enabled = True + + @contextmanager + def hooks_disabled(self): + """A context manager to run code with hooks disabled. + + Example:: + + with harness.hooks_disabled(): + # things in here don't fire events + harness.set_leader(True) + harness.update_config(unset=['foo', 'bar']) + # things here will again fire events + """ + if self._hooks_enabled: + self.disable_hooks() + try: + yield None + finally: + self.enable_hooks() + else: + yield None + + def _next_relation_id(self): + rel_id = self._relation_id_counter + self._relation_id_counter += 1 + return rel_id + + def add_relation(self, relation_name: str, remote_app: str) -> int: + """Declare that there is a new relation between this app and `remote_app`. + + Args: + relation_name: The relation on Charm that is being related to + remote_app: The name of the application that is being related to + + Return: + The relation_id created by this add_relation. + """ + rel_id = self._next_relation_id() + self._backend._relation_ids_map.setdefault(relation_name, []).append(rel_id) + self._backend._relation_names[rel_id] = relation_name + self._backend._relation_list_map[rel_id] = [] + self._backend._relation_data[rel_id] = { + remote_app: {}, + self._backend.unit_name: {}, + self._backend.app_name: {}, + } + self._backend._relation_app_and_units[rel_id] = { + "app": remote_app, + "units": [], + } + # Reload the relation_ids list + if self._model is not None: + self._model.relations._invalidate(relation_name) + self._emit_relation_created(relation_name, rel_id, remote_app) + return rel_id + + def _emit_relation_created(self, relation_name: str, relation_id: int, + remote_app: str) -> None: + """Trigger relation-created for a given relation with a given remote application.""" + if self._charm is None or not self._hooks_enabled: + return + if self._charm is None or not self._hooks_enabled: + return + relation = self._model.get_relation(relation_name, relation_id) + app = self._model.get_app(remote_app) + self._charm.on[relation_name].relation_created.emit( + relation, app) + + def add_relation_unit(self, relation_id: int, remote_unit_name: str) -> None: + """Add a new unit to a relation. + + Example:: + + rel_id = harness.add_relation('db', 'postgresql') + harness.add_relation_unit(rel_id, 'postgresql/0') + + This will trigger a `relation_joined` event. This would naturally be + followed by a `relation_changed` event, which you can trigger with + :meth:`.update_relation_data`. This separation is artificial in the + sense that Juju will always fire the two, but is intended to make + testing relations and their data bags slightly more natural. + + Args: + relation_id: The integer relation identifier (as returned by add_relation). + remote_unit_name: A string representing the remote unit that is being added. + + Return: + None + """ + self._backend._relation_list_map[relation_id].append(remote_unit_name) + self._backend._relation_data[relation_id][remote_unit_name] = {} + # TODO: jam 2020-08-03 This is where we could assert that the unit name matches the + # application name (eg you don't have a relation to 'foo' but add units of 'bar/0' + self._backend._relation_app_and_units[relation_id]["units"].append(remote_unit_name) + relation_name = self._backend._relation_names[relation_id] + # Make sure that the Model reloads the relation_list for this relation_id, as well as + # reloading the relation data for this unit. + if self._model is not None: + remote_unit = self._model.get_unit(remote_unit_name) + relation = self._model.get_relation(relation_name, relation_id) + unit_cache = relation.data.get(remote_unit, None) + if unit_cache is not None: + unit_cache._invalidate() + self._model.relations._invalidate(relation_name) + if self._charm is None or not self._hooks_enabled: + return + self._charm.on[relation_name].relation_joined.emit( + relation, remote_unit.app, remote_unit) + + def get_relation_data(self, relation_id: int, app_or_unit: str) -> typing.Mapping: + """Get the relation data bucket for a single app or unit in a given relation. + + This ignores all of the safety checks of who can and can't see data in relations (eg, + non-leaders can't read their own application's relation data because there are no events + that keep that data up-to-date for the unit). + + Args: + relation_id: The relation whose content we want to look at. + app_or_unit: The name of the application or unit whose data we want to read + Return: + a dict containing the relation data for `app_or_unit` or None. + + Raises: + KeyError: if relation_id doesn't exist + """ + return self._backend._relation_data[relation_id].get(app_or_unit, None) + + def get_pod_spec(self) -> (typing.Mapping, typing.Mapping): + """Return the content of the pod spec as last set by the charm. + + This returns both the pod spec and any k8s_resources that were supplied. + See the signature of Model.pod.set_spec + """ + return self._backend._pod_spec + + def get_workload_version(self) -> str: + """Read the workload version that was set by the unit.""" + return self._backend._workload_version + + def set_model_name(self, name: str) -> None: + """Set the name of the Model that this is representing. + + This cannot be called once begin() has been called. But it lets you set the value that + will be returned by Model.name. + """ + if self._charm is not None: + raise RuntimeError('cannot set the Model name after begin()') + self._backend.model_name = name + + def update_relation_data( + self, + relation_id: int, + app_or_unit: str, + key_values: typing.Mapping, + ) -> None: + """Update the relation data for a given unit or application in a given relation. + + This also triggers the `relation_changed` event for this relation_id. + + Args: + relation_id: The integer relation_id representing this relation. + app_or_unit: The unit or application name that is being updated. + This can be the local or remote application. + key_values: Each key/value will be updated in the relation data. + """ + relation_name = self._backend._relation_names[relation_id] + relation = self._model.get_relation(relation_name, relation_id) + if '/' in app_or_unit: + entity = self._model.get_unit(app_or_unit) + else: + entity = self._model.get_app(app_or_unit) + rel_data = relation.data.get(entity, None) + if rel_data is not None: + # rel_data may have cached now-stale data, so _invalidate() it. + # Note, this won't cause the data to be loaded if it wasn't already. + rel_data._invalidate() + + new_values = self._backend._relation_data[relation_id][app_or_unit].copy() + for k, v in key_values.items(): + if v == '': + new_values.pop(k, None) + else: + new_values[k] = v + self._backend._relation_data[relation_id][app_or_unit] = new_values + + if app_or_unit == self._model.unit.name: + # No events for our own unit + return + if app_or_unit == self._model.app.name: + # updating our own app only generates an event if it is a peer relation and we + # aren't the leader + is_peer = self._meta.relations[relation_name].role.is_peer() + if not is_peer: + return + if self._model.unit.is_leader(): + return + self._emit_relation_changed(relation_id, app_or_unit) + + def _emit_relation_changed(self, relation_id, app_or_unit): + if self._charm is None or not self._hooks_enabled: + return + rel_name = self._backend._relation_names[relation_id] + relation = self.model.get_relation(rel_name, relation_id) + if '/' in app_or_unit: + app_name = app_or_unit.split('/')[0] + unit_name = app_or_unit + app = self.model.get_app(app_name) + unit = self.model.get_unit(unit_name) + args = (relation, app, unit) + else: + app_name = app_or_unit + app = self.model.get_app(app_name) + args = (relation, app) + self._charm.on[rel_name].relation_changed.emit(*args) + + def _update_config( + self, + key_values: typing.Mapping[str, str] = None, + unset: typing.Iterable[str] = (), + ) -> None: + """Update the config as seen by the charm. + + This will *not* trigger a `config_changed` event, and is intended for internal use. + + Note that the `key_values` mapping will only add or update configuration items. + To remove existing ones, see the `unset` parameter. + + Args: + key_values: A Mapping of key:value pairs to update in config. + unset: An iterable of keys to remove from Config. (Note that this does + not currently reset the config values to the default defined in config.yaml.) + """ + # NOTE: jam 2020-03-01 Note that this sort of works "by accident". Config + # is a LazyMapping, but its _load returns a dict and this method mutates + # the dict that Config is caching. Arguably we should be doing some sort + # of charm.framework.model.config._invalidate() + config = self._backend._config + if key_values is not None: + for key, value in key_values.items(): + config[key] = value + for key in unset: + config.pop(key, None) + + def update_config( + self, + key_values: typing.Mapping[str, str] = None, + unset: typing.Iterable[str] = (), + ) -> None: + """Update the config as seen by the charm. + + This will trigger a `config_changed` event. + + Note that the `key_values` mapping will only add or update configuration items. + To remove existing ones, see the `unset` parameter. + + Args: + key_values: A Mapping of key:value pairs to update in config. + unset: An iterable of keys to remove from Config. (Note that this does + not currently reset the config values to the default defined in config.yaml.) + """ + self._update_config(key_values, unset) + if self._charm is None or not self._hooks_enabled: + return + self._charm.on.config_changed.emit() + + def set_leader(self, is_leader: bool = True) -> None: + """Set whether this unit is the leader or not. + + If this charm becomes a leader then `leader_elected` will be triggered. + + Args: + is_leader: True/False as to whether this unit is the leader. + """ + was_leader = self._backend._is_leader + self._backend._is_leader = is_leader + # Note: jam 2020-03-01 currently is_leader is cached at the ModelBackend level, not in + # the Model objects, so this automatically gets noticed. + if is_leader and not was_leader and self._charm is not None and self._hooks_enabled: + self._charm.on.leader_elected.emit() + + def _get_backend_calls(self, reset: bool = True) -> list: + """Return the calls that we have made to the TestingModelBackend. + + This is useful mostly for testing the framework itself, so that we can assert that we + do/don't trigger extra calls. + + Args: + reset: If True, reset the calls list back to empty, if false, the call list is + preserved. + + Return: + ``[(call1, args...), (call2, args...)]`` + """ + calls = self._backend._calls.copy() + if reset: + self._backend._calls.clear() + return calls + + +def _record_calls(cls): + """Replace methods on cls with methods that record that they have been called. + + Iterate all attributes of cls, and for public methods, replace them with a wrapped method + that records the method called along with the arguments and keyword arguments. + """ + for meth_name, orig_method in cls.__dict__.items(): + if meth_name.startswith('_'): + continue + + def decorator(orig_method): + def wrapped(self, *args, **kwargs): + full_args = (orig_method.__name__,) + args + if kwargs: + full_args = full_args + (kwargs,) + self._calls.append(full_args) + return orig_method(self, *args, **kwargs) + return wrapped + + setattr(cls, meth_name, decorator(orig_method)) + return cls + + +class _ResourceEntry: + """Tracks the contents of a Resource.""" + + def __init__(self, resource_name): + self.name = resource_name + + +@_record_calls +class _TestingModelBackend: + """This conforms to the interface for ModelBackend but provides canned data. + + DO NOT use this class directly, it is used by `Harness`_ to drive the model. + `Harness`_ is responsible for maintaining the internal consistency of the values here, + as the only public methods of this type are for implementing ModelBackend. + """ + + def __init__(self, unit_name, meta): + self.unit_name = unit_name + self.app_name = self.unit_name.split('/')[0] + self.model_name = None + self._calls = [] + self._meta = meta + self._is_leader = None + self._relation_ids_map = {} # relation name to [relation_ids,...] + self._relation_names = {} # reverse map from relation_id to relation_name + self._relation_list_map = {} # relation_id: [unit_name,...] + self._relation_data = {} # {relation_id: {name: data}} + # {relation_id: {"app": app_name, "units": ["app/0",...]} + self._relation_app_and_units = {} + self._config = {} + self._is_leader = False + self._resources_map = {} # {resource_name: resource_content} + self._pod_spec = None + self._app_status = {'status': 'unknown', 'message': ''} + self._unit_status = {'status': 'maintenance', 'message': ''} + self._workload_version = None + self._resource_dir = None + + def _cleanup(self): + if self._resource_dir is not None: + self._resource_dir.cleanup() + self._resource_dir = None + + def _get_resource_dir(self) -> pathlib.Path: + if self._resource_dir is None: + # In actual Juju, the resource path for a charm's resource is + # $AGENT_DIR/resources/$RESOURCE_NAME/$RESOURCE_FILENAME + # However, charms shouldn't depend on this. + self._resource_dir = tempfile.TemporaryDirectory(prefix='tmp-ops-test-resource-') + return pathlib.Path(self._resource_dir.name) + + def relation_ids(self, relation_name): + try: + return self._relation_ids_map[relation_name] + except KeyError as e: + if relation_name not in self._meta.relations: + raise model.ModelError('{} is not a known relation'.format(relation_name)) from e + return [] + + def relation_list(self, relation_id): + try: + return self._relation_list_map[relation_id] + except KeyError as e: + raise model.RelationNotFoundError from e + + def relation_get(self, relation_id, member_name, is_app): + if is_app and '/' in member_name: + member_name = member_name.split('/')[0] + if relation_id not in self._relation_data: + raise model.RelationNotFoundError() + return self._relation_data[relation_id][member_name].copy() + + def relation_set(self, relation_id, key, value, is_app): + relation = self._relation_data[relation_id] + if is_app: + bucket_key = self.app_name + else: + bucket_key = self.unit_name + if bucket_key not in relation: + relation[bucket_key] = {} + bucket = relation[bucket_key] + if value == '': + bucket.pop(key, None) + else: + bucket[key] = value + + def config_get(self): + return self._config + + def is_leader(self): + return self._is_leader + + def application_version_set(self, version): + self._workload_version = version + + def resource_get(self, resource_name): + if resource_name not in self._resources_map: + raise model.ModelError( + "ERROR could not download resource: HTTP request failed: " + "Get https://.../units/unit-{}/resources/{}: resource#{}/{} not found".format( + self.unit_name.replace('/', '-'), resource_name, self.app_name, resource_name + )) + filename, contents = self._resources_map[resource_name] + resource_dir = self._get_resource_dir() + resource_filename = resource_dir / resource_name / filename + if not resource_filename.exists(): + if isinstance(contents, bytes): + mode = 'wb' + else: + mode = 'wt' + resource_filename.parent.mkdir(exist_ok=True) + with resource_filename.open(mode=mode) as resource_file: + resource_file.write(contents) + return resource_filename + + def pod_spec_set(self, spec, k8s_resources): + self._pod_spec = (spec, k8s_resources) + + def status_get(self, *, is_app=False): + if is_app: + return self._app_status + else: + return self._unit_status + + def status_set(self, status, message='', *, is_app=False): + if is_app: + self._app_status = {'status': status, 'message': message} + else: + self._unit_status = {'status': status, 'message': message} + + def storage_list(self, name): + raise NotImplementedError(self.storage_list) + + def storage_get(self, storage_name_id, attribute): + raise NotImplementedError(self.storage_get) + + def storage_add(self, name, count=1): + raise NotImplementedError(self.storage_add) + + def action_get(self): + raise NotImplementedError(self.action_get) + + def action_set(self, results): + raise NotImplementedError(self.action_set) + + def action_log(self, message): + raise NotImplementedError(self.action_log) + + def action_fail(self, message=''): + raise NotImplementedError(self.action_fail) + + def network_get(self, endpoint_name, relation_id=None): + raise NotImplementedError(self.network_get) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/version.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/version.py new file mode 100644 index 00000000..db9e9817 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/ops/version.py @@ -0,0 +1,3 @@ +# this is a generated file + +version = '1.1.0' diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/__init__.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/__init__.py new file mode 100644 index 00000000..86d07b55 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/__init__.py @@ -0,0 +1,427 @@ + +from .error import * + +from .tokens import * +from .events import * +from .nodes import * + +from .loader import * +from .dumper import * + +__version__ = '5.4.1' +try: + from .cyaml import * + __with_libyaml__ = True +except ImportError: + __with_libyaml__ = False + +import io + +#------------------------------------------------------------------------------ +# Warnings control +#------------------------------------------------------------------------------ + +# 'Global' warnings state: +_warnings_enabled = { + 'YAMLLoadWarning': True, +} + +# Get or set global warnings' state +def warnings(settings=None): + if settings is None: + return _warnings_enabled + + if type(settings) is dict: + for key in settings: + if key in _warnings_enabled: + _warnings_enabled[key] = settings[key] + +# Warn when load() is called without Loader=... +class YAMLLoadWarning(RuntimeWarning): + pass + +def load_warning(method): + if _warnings_enabled['YAMLLoadWarning'] is False: + return + + import warnings + + message = ( + "calling yaml.%s() without Loader=... is deprecated, as the " + "default Loader is unsafe. Please read " + "https://msg.pyyaml.org/load for full details." + ) % method + + warnings.warn(message, YAMLLoadWarning, stacklevel=3) + +#------------------------------------------------------------------------------ +def scan(stream, Loader=Loader): + """ + Scan a YAML stream and produce scanning tokens. + """ + loader = Loader(stream) + try: + while loader.check_token(): + yield loader.get_token() + finally: + loader.dispose() + +def parse(stream, Loader=Loader): + """ + Parse a YAML stream and produce parsing events. + """ + loader = Loader(stream) + try: + while loader.check_event(): + yield loader.get_event() + finally: + loader.dispose() + +def compose(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding representation tree. + """ + loader = Loader(stream) + try: + return loader.get_single_node() + finally: + loader.dispose() + +def compose_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding representation trees. + """ + loader = Loader(stream) + try: + while loader.check_node(): + yield loader.get_node() + finally: + loader.dispose() + +def load(stream, Loader=None): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + """ + if Loader is None: + load_warning('load') + Loader = FullLoader + + loader = Loader(stream) + try: + return loader.get_single_data() + finally: + loader.dispose() + +def load_all(stream, Loader=None): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + """ + if Loader is None: + load_warning('load_all') + Loader = FullLoader + + loader = Loader(stream) + try: + while loader.check_data(): + yield loader.get_data() + finally: + loader.dispose() + +def full_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + + Resolve all tags except those known to be + unsafe on untrusted input. + """ + return load(stream, FullLoader) + +def full_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + + Resolve all tags except those known to be + unsafe on untrusted input. + """ + return load_all(stream, FullLoader) + +def safe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + + Resolve only basic YAML tags. This is known + to be safe for untrusted input. + """ + return load(stream, SafeLoader) + +def safe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + + Resolve only basic YAML tags. This is known + to be safe for untrusted input. + """ + return load_all(stream, SafeLoader) + +def unsafe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + + Resolve all tags, even those known to be + unsafe on untrusted input. + """ + return load(stream, UnsafeLoader) + +def unsafe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + + Resolve all tags, even those known to be + unsafe on untrusted input. + """ + return load_all(stream, UnsafeLoader) + +def emit(events, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + """ + Emit YAML parsing events into a stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + stream = io.StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + try: + for event in events: + dumper.emit(event) + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize_all(nodes, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of representation trees into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for node in nodes: + dumper.serialize(node) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize(node, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a representation tree into a YAML stream. + If stream is None, return the produced string instead. + """ + return serialize_all([node], stream, Dumper=Dumper, **kwds) + +def dump_all(documents, stream=None, Dumper=Dumper, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + """ + Serialize a sequence of Python objects into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, default_style=default_style, + default_flow_style=default_flow_style, + canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end, sort_keys=sort_keys) + try: + dumper.open() + for data in documents: + dumper.represent(data) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def dump(data, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a Python object into a YAML stream. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=Dumper, **kwds) + +def safe_dump_all(documents, stream=None, **kwds): + """ + Serialize a sequence of Python objects into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all(documents, stream, Dumper=SafeDumper, **kwds) + +def safe_dump(data, stream=None, **kwds): + """ + Serialize a Python object into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=SafeDumper, **kwds) + +def add_implicit_resolver(tag, regexp, first=None, + Loader=None, Dumper=Dumper): + """ + Add an implicit scalar detector. + If an implicit scalar value matches the given regexp, + the corresponding tag is assigned to the scalar. + first is a sequence of possible initial characters or None. + """ + if Loader is None: + loader.Loader.add_implicit_resolver(tag, regexp, first) + loader.FullLoader.add_implicit_resolver(tag, regexp, first) + loader.UnsafeLoader.add_implicit_resolver(tag, regexp, first) + else: + Loader.add_implicit_resolver(tag, regexp, first) + Dumper.add_implicit_resolver(tag, regexp, first) + +def add_path_resolver(tag, path, kind=None, Loader=None, Dumper=Dumper): + """ + Add a path based resolver for the given tag. + A path is a list of keys that forms a path + to a node in the representation tree. + Keys can be string values, integers, or None. + """ + if Loader is None: + loader.Loader.add_path_resolver(tag, path, kind) + loader.FullLoader.add_path_resolver(tag, path, kind) + loader.UnsafeLoader.add_path_resolver(tag, path, kind) + else: + Loader.add_path_resolver(tag, path, kind) + Dumper.add_path_resolver(tag, path, kind) + +def add_constructor(tag, constructor, Loader=None): + """ + Add a constructor for the given tag. + Constructor is a function that accepts a Loader instance + and a node object and produces the corresponding Python object. + """ + if Loader is None: + loader.Loader.add_constructor(tag, constructor) + loader.FullLoader.add_constructor(tag, constructor) + loader.UnsafeLoader.add_constructor(tag, constructor) + else: + Loader.add_constructor(tag, constructor) + +def add_multi_constructor(tag_prefix, multi_constructor, Loader=None): + """ + Add a multi-constructor for the given tag prefix. + Multi-constructor is called for a node if its tag starts with tag_prefix. + Multi-constructor accepts a Loader instance, a tag suffix, + and a node object and produces the corresponding Python object. + """ + if Loader is None: + loader.Loader.add_multi_constructor(tag_prefix, multi_constructor) + loader.FullLoader.add_multi_constructor(tag_prefix, multi_constructor) + loader.UnsafeLoader.add_multi_constructor(tag_prefix, multi_constructor) + else: + Loader.add_multi_constructor(tag_prefix, multi_constructor) + +def add_representer(data_type, representer, Dumper=Dumper): + """ + Add a representer for the given type. + Representer is a function accepting a Dumper instance + and an instance of the given data type + and producing the corresponding representation node. + """ + Dumper.add_representer(data_type, representer) + +def add_multi_representer(data_type, multi_representer, Dumper=Dumper): + """ + Add a representer for the given type. + Multi-representer is a function accepting a Dumper instance + and an instance of the given data type or subtype + and producing the corresponding representation node. + """ + Dumper.add_multi_representer(data_type, multi_representer) + +class YAMLObjectMetaclass(type): + """ + The metaclass for YAMLObject. + """ + def __init__(cls, name, bases, kwds): + super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) + if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: + if isinstance(cls.yaml_loader, list): + for loader in cls.yaml_loader: + loader.add_constructor(cls.yaml_tag, cls.from_yaml) + else: + cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) + + cls.yaml_dumper.add_representer(cls, cls.to_yaml) + +class YAMLObject(metaclass=YAMLObjectMetaclass): + """ + An object that can dump itself to a YAML stream + and load itself from a YAML stream. + """ + + __slots__ = () # no direct instantiation, so allow immutable subclasses + + yaml_loader = [Loader, FullLoader, UnsafeLoader] + yaml_dumper = Dumper + + yaml_tag = None + yaml_flow_style = None + + @classmethod + def from_yaml(cls, loader, node): + """ + Convert a representation node to a Python object. + """ + return loader.construct_yaml_object(node, cls) + + @classmethod + def to_yaml(cls, dumper, data): + """ + Convert a Python object to a representation node. + """ + return dumper.represent_yaml_object(cls.yaml_tag, data, cls, + flow_style=cls.yaml_flow_style) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/_yaml.cpython-38-x86_64-linux-gnu.so b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/_yaml.cpython-38-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..801c0e2a72a862a33d640a576ca969b684dc8e86 GIT binary patch literal 2342916 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ÓMog`wQl-izT%Lvq6xkp2flmOG+$G)s?@ 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 z%0D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 z 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]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

UfmxZeWm1Prox@K*TY zdeshxZ6AY(7|@v%b}S=p5jG+BWs;vG9^bSZ2h-4lq{ITg*Ifj&MmfgN+Q(VW5e-^E z%pKiRWD&KvSJ^N1Vr$__Ow1jnV-QvQa>wWky+U&J+Q`)@IdXM;Xzm0X?+W2C6D>0- zUP$KVR9KsXj6=NdTz-a2_}pl=z!AO@Ied&N21hFc$#H%A>Rt^@rY>=h4WbvfbbY#5tc}g zL8U}9RTsH&Vm9{iIKZo`x7`pOvbezvt08Xop;D`Sh!Kwy37Nk25>PDD@W^S>Gdw4X z(%3{8yLFpF8Q^qL0-n{iFbj*!(y_wXlp|?`+BXyx2_#C9E(S<$_gEc|7QLepJbLG1 zNpRxzzxbF98Ija2_(7|ZN-QVDjUu_!#<0S%<_c+VI0ytQ0@FMdEcX>zp+{_(h#~al z-xr3@J@3IK5oMU5m1OV02*fleHYTgOj(x*1q4s(MFaxJ8hKc4dX|9_RQ+;lHf>o~oslwpyox6W z0)8+KYGfl#%<@POWu>GR6S63c^jYlViPi0Z(A`t2(89pLSrNoCdd(7vv?oH3pfa0T zE&@4e@>^sVv?OQR2oQ^!iDP34b)&}y3So367l#@VE!@O5t5=0r8IY{(8Z0>|udRF* z6Q>{_>bP;ee?j(*cp4!U%T7$RQn7vN zjzbA3qg46n9$HvTu_y*QQzzkw86Haq$s-jTB*q5+_DW+9ypm5L_V( za-FCqW>Lv*%Og63VTTreBuhqR>=!IaUn=M0()<@pNyNsJDQ@o4P*DbNj@SG23s{MY+&_l zjD?z2Y?FdWVFV8-l?KL?21+~N2_HCmJk|+st%Q;|-)^r&b8LK;lJeLT8i_BdUTLOB%L6P*frUCP~L8>Joz|q{}7lQ^Mwej2RrgJth^hGHaF? zABsCxe!o~Q$f;#7Bu`V`&Itcd}zqx@qqqY{D^XJf1#9SG5<)9S7knOS@#?aRt)wGiVR3 z-eDq}Ln@4wAQB;+lrb#kgFQuc$2vDP;wzI7jUDA9AY*-8Ql4JL5QR9FF-IEaBv^@9 zR)#BdK-)paMq|RYzAK4*z6^ZQ&5}Z@F7*(Xs9fBV6cff1k&Z4VnJ!bxGu=ZDd7OxI zMr}d*Q!*SBEykWe&=|HLkZeRDeF{9G3N4B_N4?&*L#}5jTuVqgybj|VUF|eJae-EG zkvW{9RV_qfi^L0iL1&4B<8?v>Z4-vv#i}2z4!lVVJ8H+gjE?iA?T1*yj5WN5K&-LN zg1k5?9#i2UnOh;N`Y45q9wWtP@`x<*%dwd(SkBWCvnU_jRNBw@S4a)8h#ULiIFF%C1!pjE$SJ1n zG&D_$lB=1{i&`2Zl!en$brm2TGnODQAq0ni#6Jf0oO(^uqD+L zf|5aAEh#do_9bu-t9_~C(GDH%%MK2vP%1-VtmM!4r_P==XLi12#{L1|kQJgF8LT zO20q@+nd8qHi^N0Pd*7*3khS@RD~>)aLCHog}kBGQ*DS2S;?V8R%}$S7}rDQose4x zRwSs8M4=$D$8im&H>wF-9m_xk7x1D{T~!9ksJlmn14qdduQ(E8W^=OF!U`+-gT#g? z#j$o_&zsJ9zv6d^(6~e1jO7aOFCZvGH4@rc_XKA;s5fe%OdK${%c?;W;^o?4Ss_fC zM5!d>CyOG;55@i^D!rPM#gE>%7BVApF8O{ka(j*ijZ$lBP_#QzB4Zl~ z%qX-!G%C$R!s%<71JC(VWvl zaseed(OhwM_E#Z<&lJDS&$1$m|zu_jGN6Mt0%_U1~MEI@0_?$W0sr_bYm2XjWn<*=TO zd)|BE#EBD;k&)*{X6`@5HAe`jmYm_)9MSi15h56##PZ7Ri(6#v=_G;FVWSuq`AFib zd1!7&|7{*-Qj#}jOOIc$ltxE)c-ceB!bK0YYqV&bG(N|s*o@NA7L3pA|*WBU8C%fPPp8uPV|rr~g`X2bhHJWu_z)U?;%p9QIYYyxakw$RICq3=ySbh4 zzda9p-s@{`e+iciTG@tHvClJXYYdT0&!vn}&{-;6J{5Cwv3y90-soCrIa|z%>*fRE zFXVoj8O#t>HzTRW^4`Ct+6{l;+&Ee9Sbm#L{Cz;7(IKnoboS9voE~nbFBJj9V_rQj$qH}hbp9Y3nQ`~$Sg3AP@X&^j{B(|e! zHx5AGixCev+Z~ji)f1l|9X6cW4c&zr8HaGyY9WtT2&z2&sFp6YbU+mkagBcLzeEcw zt~|q($R)XQJNp(7yVg(U>3+DPx_EM#?t*R5am#PVds_8_hd(DhR$t#RHgKm{>EsYr z?K|(F$33M%94~fRW(D7i$3le1g)I%Y1Nnf_@jtU74VCCfx~bK zZ3(N{wDKvnrSx--&SY#%4^OiVKP#yFi%g3qfkVnKUMZ$iO-DT2B+Si+cEa;C!(J6` zDJvGSgR@J+)l!VBeuZ4Z4G#fxjU2B5;tD0qp5e4mx)e*j=eKfb$}A@NL*-pe1aSx# zR`f&h+&G*E-=xBEh0+%4lI{CD?7VY4ky^<3HeH$*JGk^v+~Qe7mWm1^0!6!fX~#D# zc;$?DmF!=BaG4%&aEP9(uCsVtDqA0_3yY~<8@a=4rb@jS57~ijc=jkaFUqydSmAQ9 zw@ckyJmskq2KaFC-@pbxzj0wwcl?p$)~zSuIqzDHvnfPZ+lqOyIcvc0Vu@dj;?gTG z;vm+en#0pdi?f1mPPGS;1yO8VT!sDWA$e@=)ET{a&zMb5gA3$%sy0nMY9Kxi)qWBT z{n0!@ZdoiU(vLlUh=-r6OV3@?@>N$phw9GIC5Igu9$8#k(NrJP9d;kr-!>8!wK|^{ z!5CbarZ;-U+HK%$&Tc{EEjou4_rUvR^{~6eZ)=UEbZ>S78uOIF%NWMSy;OQFMh`ezvPAcdrB+vful>uN3pb6P~1lU zsskr?2pjxEPwOeZ8r<5pQ}mvmbfFCg?6(PRDm{$A_EEj@5DjD{j&+pAC67{xp~bp7 zDCX0FuHJ%q&%(b2b02bLC~U!6kMFniJaBl7P&8hw`-aLdWQZ?cDY#AmS=(}oZF@@Y&vL5t;ZvHwJ~mHB;G zcnree4_qWAw4n11rCNyUc#3VE$D=yKhU{WQAC_(puCC6~xp}TV_MuqiVQ9-~F4)7P zXmmbN1|Yl{r*!n|>Lw1meZzWPLqVtR=GR<>UW}t9hLT^r`|2{CdgBWbJH?N>d#Z!P z6*n}+7KYzk!!GQBfwN_0;OMmpgWqdl%&-mP#qoBIhS`sGd9k0PJa%gNW6cL)kq{;# zU5fMenPPLGej$oKX+eGYMWs|K(*ZI+gu~2oHsxV4 zuv*$bU4ZFOj8_iDA<>wjiPvA{JWU)n8YbEVH@4?q@wu6Lx`%c_g}Z z-99h{l&@IAnIqhypk3#ChqpS~bx*nlL%}fF&q08MBBSyD8$d;t2tEz1Y17+^AWoRmNHEbmWT}O)aHRSev8Eq4wgw zn)qlxYmK7$dfmpZSnGj*sX5h`A?inyiT#V)LA2_LPw|d79V*2YX0H%FEn;Glho4hR zJwAP2w{pggS8=>wkwiksblA=f!Y_xFpsP&u_INU4=j~2MrZRy1Bp<&$B0Nehp60>^ z`Qkx@T!Nylxnkac#VeNJcdVMVdt0eac=WG_Upo`G^$p*B9a5Y78N_U!*y%g&>Ng7UH^uO zjGGO^gJ=DYo_U+s@7OMFNsO7gFkyvPo)t4}ys4E|q_jfy2NX+L4JI-|&Ty5FE!?-5 zPKvJGx!BHZaj+9p<&+$=dm80YH=N6C(e7JDLTXi4Vh!)6cvF!gs=WPom$0eGmkR0k zwc-iq1s}I@6i-V?*L~%y_IUCQTc8GVrnZvN+xHrKHZ2I!#X1v=>HAa6!!y$-wZchL zLx}8Z-UCovzJ#n|?V+8~E4+M3d;v*#?=rnTRr)Pp|AAbWW>qC=wJs{nR>j4yJ+M^o zOV#wawDX$RFBsloc*_@V{ld+MH=i?i%Q`lX)y(#p)v3}s}KH)rc`ain~OqK#V&~Q zX>Z<^^`kB=D@OA=~MkKUA*Ji;;Z5@-(#{?OWKYy-7%@THr!YlR}A!!_ObZQQl+^j zE=H5qz$|NQXr)GZv6_o{y7Ctxaa)>pJSuZ9i>rDf|DY0kE?S|)MUj)Sxk1U(NjRvg#G#We?y zT`wj7;zOO2P3u1;hD!^M#@RBS#{K6|U9P6&a_I4J_Dc7>7QTfX2Dfl&`-KK!OiG7x zdc;F`Mw;!YGIv5EZ>z0dvc(o#zI4mvVTwa>?y9|1c<@Gaf>gT_DW+34e#9kUSbJG5 z)qaQzDZR{5t`;Y3zbi6~zhZ-AyusC%jKw$zca;Qcb0_xWhc4~}Yhd@^9 zl$o%85}ST2G|NY%w%eZIfh&#ZPq-Wp$M+lJ`<{xYI`R@vz0YUh724_`WgGULD6S*J zuiG4^F?f2J*Vg507C)0{8T@MPHyK<9ho%&Xnvh`CD}aiJOvhI0FfT47h<;`5WWR9}(#&r3{=j!sa zbo6Ss(7?>7^{0AX|B4i+9=M&ButyiW4&!Rn+_DL13uYMP@bbi+{q7r$ajhiP)Ns*R zILBrHHF$|Vyj@?1d!dT2S*L_I*{j)cqV2p{?-;jvA}WUyXt+*~r{&@n!AkMs7gS{! z;%oWBi7QrM<@eJw-8*6Fk~Zmu-TS)Juwq7Dn2qq%=L7VFx&Ow6$L6-+DC)EvaEQwk zx4hS#i9fn@_6)yC=zq3_*cRKO1v(bzziLc7175x0^*fA($L1~RylCGyzi8>cdj)$h z(gWa%mNzull3#lsw6FGisJ(J#AZi0YFT`)+HDh=oTP1W_5Xaw!ibiOjEp~s0Q@my? zZP2s5^4R>&|JUUYzY$>Sv(ON&_7Dh@jkEg;S zzguM73MFky^=+6XyFpC{kDod^dlem07>&;|j1`0*$U9nGYGokTLbhGEn1*Mtr~rLe z6e=t>gx7{^rLGvkqM(itJ;lZjhl0_UdICh5DTl$1xuT(AMUeJNrX#Pk#Z14~gqJ_+ zDF%BUxc@-N_71n_g;qOx~|?ZXe*cZnY1tZkBq zYD@Ehlj_@IUTLTyUV%$jzkD`)Z9lu0Ylxnef~)h*p5es{Wu?OpJmk$wm$HT{e^WSE zWN2x9`P*nbeyt^|Zn3I=TSQL3WG&S$l<@4J&{<`zqK5jxI9&u9dnZkzoq-WE*b7BP zNi$xcgwPi+?AiA~z4AG{=X=n%@VMmC(5d+y9!H{)Zkx%o49R03)TSZUTx-p=*T3$6@!GC39A$gK@&#b}Bb;AKx^!>dEB zG`lbxOf$^O16i%E9$hKm_M2$A>f*cd5fb+f9ID$|mD$rGrlwpU>~@!1*j#DXQTowI zPp#HofPv!CO`G*%>-3)L0}cwym*9uGRVPkeG=~gy4D5k=hOrWhdUjdE#8iy>)eGy4 zhj&BBqO0j}YiLGDi-tiQR?!1r7kw4a-Qjy%2baSbHR7Di#c<&ui=|?gv8O2&`_7Uh z`u!p$=&K7bO-&l#`WZe3FdUBcz6uIuU$nvt<$|ZFk^zOVqO##vI-MJ%PSj0H2k6;a zO4$q)i)|d}>vFZzhM>WSjn08cHK-NwWW^eKCyvGNz&l?G*L{fADOaDjqo)nF)JfG- zM$}DbE9Kp^%pN=js^QeKE$)_T?CyqUChPG4T0+7;tR^OOWBEW&hU+9PQR1*DwqNQ1 ztH)pl7!3Vt|yII^b`btK*S0SXo@Thmp%66R@412h7Clr8r195(aJU zsf`0i>o@=M!ULbnrMV~yPacdug@lgJoo~|arh%%XlXhAhSWaR-e8xwXr7;-~jN&Y} zL~~@NE27D!h!m!1V2VnEKOs=%(>lHohT0imuu(-l(;fcUDwK-bXgcu$_i?;LzhkpZ zmDy#Wj-j2kjURo9>GlpfIkt;1$`~;?bq*pb706&_lhBUg8%`p%Y8eK%5Hi z2bvfriUAdZWyegMM2e_m^yu*OEKu}2OH*LfY37baS1M~8rO0+t74~tpdTPwb> zL8;Q*ff|Yirm@m6S48_V72;-w2P~A23-UGkiCZp*10v25aZBky_YJn9aKk!}bG6ox z2Q+96o=OU(w2+TutN7oxv8Jy|yIL7CMWr0d@nknxAJbuI%Rrm=*4wrB(JGf)2pW5O z;Ob$ZxGzkLRCA>?wKh#c47Q?N7~1jF&^X=2o@=x+?YfQ7#Ini$VC&3XRM#dJp>txfSSPQrSndU$Q0Hu0D4iwyS$>r%d&Ub6H<_||sk?X&Nj z_KCU6&GjVh@Eexq9i3owDX~;$W0S0&aGHubcEvc*-tcV^3a%%kAamK@I>q0=*ykFZ zIeBFK|2^!x{b$fQ$i92Gea`AE04_6Xtjh^XPcso)q8o1uoW zRKppr2rSnyman>o(WV+k8)_JBs$sNN!@rtKn4Q(x72h!+s_NIZKaSfaMy-^66@zEwehKKx~E@MsuVmr5Z+o5k{}R(tj{_+ldkyKm zNihSSm#76ms%-9YD&0I490O8K>~W+sT@hHWq2A-vKwH$~Ky1byM>;LlFbXW!Q19_= zt-xDT!CK#KZC_D`y7zpeu-(w(e6_+ILiW%_1L@fYPWpj^H>8Db`F(B2%9!L6(D+0?k)O(y7XiGT8%?37Ok0afkY8VBU zYpD15HCEt37Mt*0ehqd-c>UPPKmiW$(&k4|U) z$*I(QAO?f^`8m>lt_XDVweBa-&rPKk0*S8rwgaY;Q02l@rQ5G98t`?yWIqF9b5>{C zQm!(;8kg+g$Q)yz>Sf>wi5dmI#i-!-g4)UUAam|5$;k!46OD=mk>2Ktz_$-5R=us) zFxFJVSYEGTtf_|jWKykRjn3giRbzpxdbZ5`zQ&sbymrPWon0xoPUoP`(BGa`3+{EM z_dBlu_~48c)C-O^6|9HiCNq0?sxbrp+Nd=<2OXay{Km+2I)``HnY&SrOl=MG-|bce z)mfd|yugq<(S}}_BEb`f#BLDR1y4Fx>m+Plkw*3cAjO(T_W4%e(o`@5Vqk3ziglj5 zM|E6K<>!+7b8_(3=IXkgH8;F;t)gVD+bMr#sXX|X?hSBlGdZi%2d3^+GYec+1| zRh#ACYt@{cs;jAd+rC&W~=zvc!A7*vNfg2h%)H$TH#q1+G&&gq) zZQrcRH_si);hyK;9bc5vcSjkAcdBI7%^bxwxMWu< zH?*i~XvnI?SzWYDr^2WRDL^oNJ*zXnT5OJ4p63n2pQTO#3Bwwl({`#_dWxxgWwjON zt4*bEpE{ML*_B$UqWoR8s;V8$ytnU@`X39CT~*oU{;rlf!90G8eTMlMe2Q~j@W~wydWp!$n0b){zAMhfx9%mUO>`Sp~{z^0Z5i2MaO08>N zHI%x`O8v#1qSWQdP;C|P+e)c&hg1A2D_;Jt>T}hOy8UyD^Qwi&uBxoUNx>OBU&FlG z$Q$=(gKMQI)!Ms$rBu016eq~#@2Wmm?Wko}EY7PIBD<=xYA*$6@cg;v`L^EPdkjA4 zRJE=xDy7P8qBxb8zgv|Zwd~5pdDTK>S5;Q+rQi&n?`WPc_QrkR;Ln|^)-_fsRc;f- zsl5E%s_dv`S1rz~79zW+?Z98%{$WRqk+#zr%``zpK_>wWDrd zV{u-!5ZP6g)nK6D44!|(Jipu9`&D!Fw&~mZlS-*_n40q~tu@Ko+l??~`sy*+T z%JaQ(A2WElQ`NeLE2YY9qBxb8zgv|ZwQTLhdDTK>S5;Q+rQi&n&o$3qnzTz79zW=J}*I?i~hCcdA;~;!3G&bscKydDy7P8qWH&5r~KWj?5Jh)7Ufk7 zkzG~Ua4fId^ChNoh<&OQ9do)<)w-5eN|oD0aVjr=w<^IaixaY3$|ZoT3EW#ENM~1ny!~3>?zQt_Y;cnIpU`RXPU5XQf_& zWn1;1Hfg{+ldVx8F;Nx~ShiK)9D=QDlCAl`jZ+)Pfiyp~aej_O1eBf!mMfiK`wi;Z zW_jyWL+yg5T4O`%zuH6UwCXW(yS3`4sdc+PV9@KX?Tq|=O{JFIUbEJMT5|cBHI>@F z3!-$IsfNQ2`~l~>;14?21Ap7OVeogH>w&-LTo?R(=W0g@zJ17abd&%o);!WFcwQN>=NMCV9V7b!zA@K<-fPwI910`=x#xfuQ(5M1pzu|ZOm1Y2+r2?cr zjXmHEULEi|iRxEJDAnF>Dq#qKf96~l{2$Ksz%M^6T2go)MsCqC7^YZzX~xh{BJ=X&6Oc5WE_YUg_3ot*1}Gv|iDqs|S3 z=R4N}k2%)`FL16lTxjc)Oh>~7h}((~@U^BDhYJ$^ND)Yt&EtwnH%yg|0f~Xmg}|MY zRtBWzH~}HiUX=xw{iu&g{CIk*VH8OJ=vV<#xqe6oQgiTQG)JN@R2EqFqkcZ$$m$IS%|Oj@6otAoh@SiXu?08Ee6fBFBrv;oe{ zfmGRi+)?SVsnRhZanT?G{w8T;9TthrmY*8jt*cTZY$bAyotvp68=aLNR`b8FqLkUDjfq77Y!HS zdy`fMq~>@4BM}3Y1(yA&AHewWj8wxYkiO6%0Hksqz(8t_2QU(GS6N`$kNN@pOsoGn z$&YLcgD-JvCxi2xs*YT~!sSQf{dBhIhDXyQ)7fGiO*^Ej1s7Rc_w+U&V(w>@TTx}-7xARR$GYRm5M2!Kls8I#Pcyrf$ z+-!U**~)-;tWgETRzpu*WCp&R4AnMvQu>>w5>{~F?>W~6|IoP}xOaFQ3o1Jd-q5)o z`037d!NblCfuHN#FnG3eJ@E6K>w^Euxmvf;*1JF0Bjt=f3U7QOsm>2NpSuTIB=W5hfNhZA@Q z=epn>ovRJkczXP?0q__xk=!7o}j?ZFua&vC8`-paXJo%r*rl3(C?&UL|=b3O0} zoSOqa%efx-Z0EY*bDW#jx7V4D4oo1$H8Ox$YCZ&M=UB2e1}qn>A4dOT1>TejX25qP zs{bB?r#V#}DHy`v)pmU!v-#F!I|EX!_GvE!y9>2L4@;=bl&Y)hDphy%zO_^xT8}Oi zMEqQ9Q5fjp&pOuyf6lquAlc3a_x7bh4t|w$UGUqS8wS7Kxh{B_b3@=WoErw8>0B4Q z+_@p}=bak{U+r8Me3NrS;BPuN48GO5F8FrmhQPmfZW#Or=epp||4Ea{5cmM+hO5Jw zxSwdYbZ`PsF)AL3NS|{>;PnHFNwQjHaV>+J+Gn(gw52No@wj;s7`OUxbj{A;y}asQ zK~_CnN2kRF&+X+^9}8u?oNfM~Tn*X#t@^W5vk&S#D@QuV*oI}@CH56wHQW}0W8X4W z-HqC-)_=Es_s3LI?FwMXn$Sz3txX~u*jKc+=@~SyGMx!G1EhyEWi72b_%c)9(Tf2o zrqg$|6tlw>rC9=erE^{IRnGOmcR4o<{)KZr@GqU~g8$RG+U$gH-!~myUjr!?hHCw^ zQ!hB$RIt7Rs~4Q#RIvWz@pa}R+B*EIk-pJXXt_>dRh64eg@CEQfcMx}4Tf2b}AI|KwZ`{D^bI;8{n+R>|H7_+aCTdjb&-DJg;vb#54ZxN|-5 zk$s;Ni=qC(@}_k6lQU@b!u60~aJJ12Q-o zW-mP0#7c$f6imH3B><^6sDWSO6$0@^v+O+Z0i_ziM5p1TgLR6}v{h?kb-~9v*8|^lWSUKe!8beC z1AooAF8CJbY7+v!z18Z}gaD)(1sI5>=7831jbW=?us$KY+bUm?oXA!hyxgg3Sifgq z{bYI-zWRzqp!qCW)oK_~>zRS4*r!H15ZevIXA{%j#Y+LNNz{0?UB9#TJml>HK9Z<$ z;9AL02Bg}C6D#eY`k4;Ls;&;ljSP zxgPk_&UL|8I5z~o-MKm7A2`EaFR+?V0MZty{ zXDh4bHL1Fcu=Sm)#^;Mx*R82FwRJmR(fbXHkF~6VCr)1xUu`hG$}Kj-e#1V)^acK= zb6xOvoa=$V@7yr>yGO-V%ibLDPn;VD|GRTN@LkSz!M}8F2)yypUI%!@xnb}o&h@}A zaIOp9)VbPHf;e@|56uO@^%6A>JUCGcfd87Pao}-@S^)fJqQ-&WO4I@%fzpTs{=&6@ zgee>u3vwg^pt3;P9Tlsim6ktZy{xGQNOMEMu^efmDkr=QUsR0 ztFNwZw91H<4is$tA^A}|y#C$V@<3`+2K>EIYjzI4yMsVi$7faTgSd{>uy*GNJ;G`q z0`O$77&vTHVHJU)VO9|jAGFG7Ik9Yl<}xC1tkQW;voZwz(Zs)Es`FB_wY`069K7G) zrxTR{uQV#8-K&;PweQ~N#efuRSZ^|xh{u|pLwk8O4h31Qk9cpD>KmmI`#N=?LBg*K z_p0@Vq#_}}@tM|~Rb8z)pKx&P60oY(5DE^77nUY0@D|Q>!CO1m1HaU{VemH2jeuX_ z+#K+ij8mrP)(*l=B}MSf&W(V-=G-v&>(2GS-*m1EzSX(f3{6npXgZpqftXbO1c;^P zIj?SO3|qLOXDQB9Z?wv8NtM=?4s?b)QTw&!+2-FS$>v!6ajpkG)wyBtGUrCXe=@E}@FV=W zqzL|tbHm_Aoa=%A=3E!tc|yuH41r%}Tv0K?D_n5|{Ljt}gSU6C2j0QCE_f&BhQRw7 zS5#c>AVR;=TA>*OcuS)Cz~`E&IAb8;xE5x>*O;Qr0db>wwyFCuh93k~Cq5uCjk68X zOH!qafK;w^9+0ravPgKRN~$5E@wcXUWWa|K)yD~fqF~f**N(Dt%m4#ShdPGndQm`{ zpa<`sFsp98mZxO4cxyU9j~oKO%egLinR7kx>CO#lS)sNRrvk*G8S6%=q7QLuUtDSnmX?nC; za9i_=z^O(cfl~|r%ZFR(OYYSoyyEa_ zScmOt29HaI$Ewjh(!P4DeKz$mI*-Ck!#NEr$CqjXQ+vY+gCY8fRP4wh@a4{R!Jl!i z2fos|VeqxijewtES7TvT2S3rd5%51aHw=D~b3O2ro$G>o&JBT|!~XoPZy{N`5Q= z5_%0RAeHM}K#c^dVfcO9Y|^miHdYT0O5uj;0uqjfy1r+1-EN=ZpaOgS8PF~5UacQX zuCl1A@_Q=rZkbNSt<+Y+eC0u%rgN*dDM+t0cTlwyBFexY+c@Qa)q z2G4bF1pFH3=74u{ZUnrubHm`*IoAX4;#?QJt8+u(FE}>`e4TS6;2WJA27lSP9{48b zy5O6gs~y$Ec%kWN>;iEy9EJ;Wq(!a>#C}wqt`{+@V+x4Pc%UO;R*JxK4Gl{WbBVFh z^eUnMvhjMs1x;SnU)(flUhS6xmI3KN&3Qmt*l=5s&=fNY+s?$bk45o zG|W<`nwd*dO$(|W{O(Fk4Qq_kYAUr!i~xMiRKvjz{1!f?>ILH{9Wfpz~6Un82kh0df*>9*9G6)7;MIxhUrz~l zwHgY!fcLXXo`RofTnM5;8mW@I8FfslWT*0n_e1z1@4*`xC+k2O*5FsE!u?AXf{!vz zY84kc_^@}$2k^n}!|4V;<`j@f>gS9rjwfJ5By5T`Y@)49(|#>ZzH#20A+iEpqEJ|>mSfXpr`*{S^D z={t{$Uj$2FVlGdC#5$;f@35j$12U5Jn=)`Xjq?oX&0Y+oi-LWyhhp*U6QY;9*{AFS zk1;Bg1pmO*VmbexcE8Tt3dO*?xvN0@(`gEbTcPA^s|aVL2E>=LU&~Bg5d$)@H=GA? z^_Y^Y;4|D+AakI8Tn66iTEHJAYRS(G(l8YS&fLZ&w2>nsv=RKH)W#*9${+LTPfR78 zwZV5f*9G6@To3$H=Z3*Qb8ZB@@GYI3{p`jY*|8AwS-}!kR|pt7@ed zl}r}!3AIwY*GtvbZyQ%im45=M7B7ESt-WeTKaad%|Ga7;va2eqSXT=+gr7d2vKE9f z3_jSoF8B!NhQMby*9D*HTx~4z-B~3a@N(z6;1$mGz`t^C4){Ljdf;C>*9HH^xoLgN zO-GAKAjLJ#fmmu@Ow!Jk$<`RKT(Evk_X#WT`BX3i-kGTWPYwRUsp^=(5dN;V>sOo2 z?4?S9LYe8=f10)}sr>W%je!C+#x~bnvH~>w>Rzt_NQG ziL;6bhe;T`j&nWmc`G=2V9Q?f(yJmj*WQ zZ;9#yhs@hJu#sMFtmYBm$peZ=KXpamJxTG8aFw;1)*V1J;(gD)4<3 zRphf=6^JibtvbZm@@6ckjv@{IYN@rXA}_V;sYX%Ztj@00Qtz_H69nxM1Tyf~&~|Jv zu8GUQRJeA?G(NXSjBq&=2jhsTR-IX9&V0r`wJRI=uu*Gt4(owwvAERFG&$&1&2Met z*fw=ZZ7ghJ)i9FQ=xm;knK}&%T-7w?IG(f!1Y#;49aUq^#|-9}q^6y(n#?Vzd54*K zDXtk1?^Hw8R>M^DN;5!d9ZkSTXNXdJnn7Oijt~1-%;Br?rX01-bW*PB>ZCkt|5}Wy zS`Dqg)111?KEoLp{0ry0;9oh{1Mk*NXUt*nBIkPG#m;rXOPs4M`|#~St5XvMkm6c9 z0kITDUwybx@JUvmY;9<83#VRYaDh|RURv9}DjBM(JkC^}VxKd;*rckfj?{}yrn5Lh zrL(QFQfsPKHZhf#tcG7z-DbbgnxWEHTV*qZ^mV2(z8Zd2b({S{Ylcequ*&wb&oJ=8 zZ*r~+-q*Pvcz@@H!EbhM1bm2dbHGP9w>9|J#uXcQ5gsThf`8}S9PmTVje!5)+%Wi0 z&h@~5ajpyQJSiR3L*RpqYusT>M2|OPI>dn3RQ3n>uxZ7^6=@BtKxKi{sj}4pU9WMB z8Zj8pMM&!;^JBm#Bx-jcH8!8es+ESk6t&)ynm$gI7!7LRe@t~|z32rkOAir)25>C_Jm{=um=%)w{br<{1c!Phu7-{6~_s*cQa z%x1}hs>*q$a*=(`GyerV{#!FSKT;^lq!H)E8C1 z?lYCYtcG7z-DbbgnxWFJb#ZAxRQ-C2sXW&{XX?kQZnIx#%~0vqR#|COR{h%6R9?3l zepPjw{X%PoO82nJW;isaOy!`}@T;oZ>=#-yRCxrSea>{mRCSw209rFtdaG4d3PaVe@0!ZbR>QBV zZnIx#%~0tdt+G;IRQ-CyRQ``eeWrL-b({S{YlcdPt+LX9sQR_Bscf+tepPjw{X%Po zN_Vo#N~5ys*Dj{=FRS5KRkztMv}UOEAggSKL*sB$Ibk*Ys_HiTh1Lv}F0;zsXP;r_ z1E1ks7ksXBJ@EO?4TE#%M!?IRn*;usb6bPQH;6N-uF&uAAnazO9NZfGFV4*YFLG`K zyu`U-@Se`~z!T1O!TUHj1m6BBB?qg+i->;CTBg|(xQW@)+8cO`QE|RT`i3h4zcZkS z^jz~q7J(y1MT>Sa{5uTOw#(;QO=po=+ z!!tMPj*a3NeWo-EaIzG((HzOm*YYtJS+_BEw8OJrs&+N|2`k0u(w>ldsoI{9Pg|+q zr=c=VK<`K+VEitF>!sL@6Ju{j?aKD&W^==2Xg+XbqqKqVvg22p@JZKWa8a>-d%D-Y zeaN-eF?aB#;RQQ)n-5P78jMjY^y}#ze=(;r@MyrS8kIe@TxR5I*R7eX0w?@T$;HviNJM1@H@AK7WDGV8Kexmw}7e+wCA+6L@_26wttYzl)eESSj zI(W>vE_i`+J@B}5!{FVV8v*~;xFVT~@IXls{5$7{!4Emt1OLIfF1Yj5w6Y!o=f*W= zaf!eMW=vBs@F`XT z4Wg>%MO9n+WwZU&6xa;t)s5Gy8>hP0rC5*GtE-(}&b4Z&R?}X+)5fvsomMln+^W66 zKErGU{;+dh@CxU8;Aj40njnV3&vLE@eztR6@Q8Cm;7y$y25;tE5BwtMy5Oyy8v?)7 zxnb~5&h@~rb*>9u=-d!^SLcSoi=69$mpIo2PdYaQey4N8)p14tTx4ma+>VtX(FiF{*M|Gj*qM`qf0Npk0iTiF9j66& z6IK9VqO740oJb`X;MV?$%7E_av`52(B~QT(ZZSC3W}wG<3`oplypU+dqi@oI)}&Ap zJVTpqwzd$-zn~ee!C}@v6RBXJo6jMGMo_LtFmK0js*EL62Vy{^sN0REscC zkyh2os_k-6sf6a1zgv}^nZmcKva8*`s-b1p-uI=0L3GRhQXh5t_Qx{xi0uh=Z3&PeMZT_>Bi*6Ha2t~2ENI9Ln}()=Z%V|3#9*W zMc`j8cu^5)>gmxFSp+`a9FB@e8yhP{;PVF*k+yL~;423dk@j&#;QAJqSTz#SYFI~e z{1PBtvjDG1;p+pxl#aGJIRQA|#*a?Qz=w?rUX0~P|Bxcp2kvB4R3uW*NbTwaiC9!5 z0B>|fAc2UA1mJQDi+lur)2MJN278=pYpQyjMu`(MhvrZqqbPVWnj>)pOA$yAqaqSV zk`#dq{HTcJ4%f~yb%*EU@Lp+b?+(PpV19mbcsm>MI*kHxF)AYMm%4U$Ae|W%k?2QR z1TyTSA`&BCia>fjDk9P0QUsn`I$GxENK8di1Ts9LMI;Yu?fROaGIxZ*1HRa!`U{I2 z)3d51QjGXevKo}YRofr9YEuJ;vkd3JRflolrkfkzV%`QF@ViqBGN3oA&k&(;p(L2| zm5wjqBWdg`pzQ><$*)h@%)(5gL?4hdsnXo|z`08l#y3dQPzK}#BCYxXQ_F-?9dn!x zJ|JB@tFsUfzLH|Ka9tbxOls1q_M#{{icXUGYTs}$dUdq{c!!0_RhsIm8m^bxweDf< zo{V~_1@%(3`#&hPPHBLF|2YM1v}&noOw45JDaq9Q4GnHmsuBD$S9>%y{?x*}X6NYR zbA*>BTVp_P(0rix%viNXom;Ct^B%M5$Jy>2Q>DpcRi(;T2^8nJD1WyqJMjvlY9X@K zvgg%2?^BQ|pm{c^8oHojsO&HnSEn&mJCCL@)w1%Osvlirm>xJ?YUT%GFrI8U4{*Aa zB9PNURBS#?HlGv!Kb`>VQ&esKp?x$)vluPGZBbR9MO7UZg|{qmL;;zuLkLE5B+hwK zth-v9O>y;(blCQBl}Jys9ITE|Ed58av~kS7?KMF)K(Tl=Mv)~Fk^VX^KW7?I2E}B>0JG&AmJDDT&H}J{W52JlU@{R1~dbwI&Kk z_XjV)1Vd`oNHm>E2*o$72ZIjyXQ@{+pod~Hp;(kwxEb)&L@g!~-t5J6@kk2JVw%0J zQ?!xmUu^)OiGOr0ns`I$ng#6ZiP~L+w3@*hS`FUX2LSMpL@lD#4CGJ}%s|iz4R~yd z#G-m67STo;7L3s%yboOUuw$&!8|4HeH52gicSN4kZ}~gAfF*VLyXp`ue~0gkyYhF_ z`OSf)6VZc9b0k_L_MxS#g+dqX3Y zPWbOQ5OA$D>Z@_BMzGumxI*O0-&NyQ{;nFm@^{r3mcPSYVpjfcRer~)S3Qnw)z`>Y zy^L(tzsTYly&730{1w~K$3(a^6X0g)5U;imZAP}{WJ=K;qN*(uRc)52YMVsSAY2!< zY7Z9S!CTVQG!As9YKb_Vucqn~u>1)#&I~h-Qu~Ur zrK^^z3Z;Fd)$%gcGr&w|tg3GF*#fPZDz%`oo|NmX*vRaQ0ur%sg)^42p07!f=>s_? z!^mM8U_~i=EGo%2HUx}>0;xhxc0l)a3BKZ(5{WDvaY0nwgC%tjYU#%PEMNKll(!tM zS2sG}rr871bUOrtAMEM({~Mir|%m4PT#GD-`mdMclxfu@AO@R-|4#szteXOey8uI^P73KG{rJ>G zjHs&P|DCfgzfiCG*yTWeSvsJPzq{JR4(7Z;P4iQ=7^O;1Of$za;g+1Zy=tw&iKeJl zi+#)vW1P_PglV4IL{&>&R4X-FFExq*=4j0$%WLzcg6?QH)8 z)239pO%%uL@^@9At9D|`sur5tTP?eKp5rk)Ni>x(Z#*@%w{~T7pS71#*0)$^R``PFIZn{8}o>21>4Is@)&RB^Vh&d`mg@cCAPCBRJA0##kL zbFX@K5G@v`4L^1AsMg=UB?dU`d{>golUofN6~ z6A;pyjFlpA>3|~ATU`-&%77wL?ux(_1BytWcSYcJ1ByuBcSYbG1Byt$b4B1o1ByuN zot(l0B+xND@oWEoD+@8fY~#ARas8kT;O4j225`rc8u)Nm1HPlA20kyT zWx$&g)d${NDhd9zs{uDU)7=H{Vw~Is?p0C)AD+}Q;D-{`2i{mJ3I4LH0Us=>fj2%Y z^*eAIqe67SyCk&?cyyxrz;jC_!RNag@RpJq_z_nFu79?N4ZN{&8k4}$MD>A(l}dt- za5dnHk{bBCt_HlPqy~N@sb#=T&PkC3&NC`R68w5s10Gva17G55z#B?x;O{22EWvY= zAF~Y3w$I=P_<61d94o1TPj)rn*(EjbB}pv<{vc6(;KQYo;J>;WaMSa=b2Z@QB{lFbTn+f=k{b94%W*dYzBEyN z;O<6+7JwJK8t`2uHSjgA2K;tO4g8CwmI0sip-%Cq9tCb`RPY15m8$_KOKRW`xEk=n zk{bA$q?Q4Hm8d>&y$hmi!4L2gjgz~;mzUJQ2e=yW#F85L14%6dUZ1Ew@aLtH;9t5L zaDxxKyWm$DCwGCnmDIooB()59R-*dAt4k%p*SZ?;-jW*l87opR12;D+L>K(3q?Q2> zPE;RwdZ{G%gRTa=v7`om$kl-Be#FBDeui;6&jEK%R3EssR1$oks{zj~se!-lYQUeC z)W8oVwG8;|kETchcQh(Q68vgc10GgV1AoNTfLE2&z+X>l8Sqbu>H|0Wm`4))Oye{F zf%8gg;D2*9;QLBy;EyD=4EU`?^??tTN`imyYQWhm-Cghk z75o5imeexfu8Hack1dr1ALnYoi%V+YAG;dxfsz_{?Tc_X1I|rUA2?=IXaRWK)qp3J z)WDx{HQ-lEYTzFywG8<9i*cc_>I2uZ zUqpf*;B}1CfdJgHqz0aHHQ+HNHSoKWS_Zr_QGMVYrIO&ExEgT1OJgL1yWnk&le@tA zB{lF=Qpe) zoQ@aZAtg2N$w@5(elk&g;BBRn;P1H_aIGud5AchPlOMp>mejzDl3E5lHBo)w#if$q zOI;0kM@bF*gsW071D|75=wmnSL% z-kYdCaII@Fp8>N(^?~~&Dg$1gs6OzPL}kF@bpAwz&jJw2mUcp z8F0rhq#A*{Cn^K3OjI9uU7|AJdeyI9R3CVGqB3CThGYxaOH>A&OjI9uY@#yYO^NCQ?@Uw%-1Lj7M&OQ#%7Duf z)d#LjR0e!7QGMWgH)1{mE=*J(cu=A;;MIxh18+-I1|0qp=KH{{6O{o^N>m?sZlW^a z-HGZ0J730p2Ar3uK5#No8St`1^?^4fDg$ot70ma6nAJCn^ID-JEOzhZB_nmnNzYJSkBb@YY22fp;e=18(`%R3mU+ zqB7u_iRuF{OH>AYI8lAz24BN`2HYc2ec(}v%78Z}st>#)Q5o>}iRuHpx1<_@&rehz zxMQL+;NnE}qXqw;pPuhM8QbG~oe|+-_Niqq@ccxL1GhOdY8MN2!}IJ@C4omIY8<%! zSzZ!6+c=d3zCKaoz{LMf=@C|C4rYFY8?35^SmT@cjHtN__joi1D|ugmjrKVoJs;0Cu$t{=Tb@V zdU>>_lEAGJH4gl?Q6aYApC`2p_{8NH8wXx!R456)I;myAUnXiCc;bhmu}~6xx^eOr zcx|G_fxBJcCBaLLQ%T?l6EzOp{KH-nyrXd{2|O@S^CY8<%V$Gjx?SmRU@ z_|Zg-17Eq)OM=IYQ%T@)i5dq!?c-h&ys2?22^>$Fmc27E=L#(_U9l?30L)H2{xQ_gT4_^DEA z5qx7(%YeU5)Hv`RrDP!Z+?4stfL~73IB>605)OP=O2TEp^Aj}=+@_Qd1J6rovkZ7d zqQ-&imoix3*(rmS0bie}ao|0rlHiAvS_XVx$}f!rZz!dqz_%r}4EWbXjRVgvC62%s zd*TTAy+n-z53%G-I99+X8K=<)yfjhcz}H^k#|n6N<5Uv(wnU8spL3;`1aE1aN&*)r zY8?3IQc3W7S1|!(z^xKB4kRfN+PTuw1f&gACy=y(=6K+GcGVwBf=MN)B#=~sN&*im zl?0PsP)Q)^1(gKeRw@Z5<)D&4QVuE!+}e@|!CNqC2$ckqhEPf1xuud|QWGi(BsHOu zz|OVapJ37zDhVWAp_0JKQb{l=43z|u!ca-zO{J1x(i$oWB(0&6z)ip4-hxSWs3ee7 zhe`sMl}dt1f2bso^oL3UA1svwuXmk~TZ6L`H4a>8ROnAIX%f{5Bu%0^fmfGGf=QjI zB=BCZ6F6+ikWeR>bc#v>NvEhz;7O&DU{Wk92_(g$lEAx5CBdX!R1!$qMJ0jrZs-($ z!CNq?7?lK)icv}6Wu=l}(laUvBt4^&zzx3Wb%IIRs3ee-jYe^q<~ZsIP@j26HHo2C4r=c zR1&zfR1!?8NF{-!ic}JKYpEod^pQ#eNgt^sa7#-Fg)sysrKFNTQc5ZbJhN01Oqxk0 zfuxyK68LbbB$(8bN&-nesU&a@OC|+x!K9;95=c5qC4o1VN`gsIsU(mTl}Z9fEa?>L z1e3N>Ng!z}l?1-4R1!=oOC^D%vQ!dyf2kyx^p;8jNpGnnaO`FuePB{vDhVXzrINra zN+rRh!Bi4R8cZdD8-3O51d|$5Ng$~)l?0wpDhVcCrjkI?Whx2$d8s6r6q-r`NujAE zaHp@iw_wt0DhVX5rjo#mOC`ai+Efxqs!b(|Ryb z>8+8OXP>&G3AiXxec=9y%8oVo4yVpBc&$^beM8ZcEZfJe9Qw)PS4MGHg{bQ-v&Rh% zqRu)iHh_B#L>+u~q}cW^YG+H8u>)V!v(JrMY=#&0C!^SxF6vvB?_!I%sE?l?3$j~V z)LX0r**Gm~*X2=bv3-h~YndUo6N`HM1yPHgy`t_iicPknuKaM+V!x}X(<~vw)>BdY zT3Ur&prW?7dQ_dwYem%ccIC?k5>aQ_wJLi#L>+8boNTKQwXR7&xXjHY+scx+K;&<7UO{nO&9X> zJ{WcQ!KEB7_IzTq{9P>N|6}J&v!_r#ZX!qexwB86$dUH33ux&+Ya&Nl=Io{uInve6 zzGxyx+Rm=GWnu0_jowJ$jnzYo}{zQ&+zq1P_ za-^PJfgxq|7oAvT)u+j&zi>7s{?lE1bP#B1amr z#Dy$;Vj@S%oV{9hO*+=uFHGb}9Xohs;rfXjX~fxY$gW9a&VFkmN4nkF?@Z)Ko#k<) z%kG`BYtp99{%j&gy3E;MOyo$nJNtm_B3Z^ob|0F^*D~o8Xa6vfBVFd~T9Y}_9nL;( zGDq6Oax}90_{kjU6lb40nIm29?1qy$($<#Jk%gyE=16-uJ0iO#z027bOy)>k%K*v3 zW|KM6*3NDtyCzLKyX|C-bhoqrJeebPKhi1wWOttIn)GsK-!PdYUFYoRWR7&Vvx{Zd zqzx<=CA)i0=16BcJ29CfUFYmUvTM@4&K^3MBOPSfE7?7KGDkYo*%M{gq#K<*c``@Z zX=Q5h+b46RgPc8Gc1=3h*)t|{q+!dA$%nHhbEKV|{iy7kbeOXrpUjc|=Lk#2SNn#mmLkIsHoc1@aXSvuMM`ecr@(%ElL=18|Xdxz|r^sux4 zKA9t(V5vUYy=yW@TIuYsW!I$Joc--&j}=UJX?JJ;X(~s$)7ed?a-<>4RLbsF zvTM?o&c1XiN4mnF3Tan#z&( zu>`5?E}6=amN~mrc1^n4**8z+NZWln9a#rY5{AMag%A9>zc1=3g*}qNYNS&*ag;}}~FlofuC+?ji zjXC?Iy>q1H&OUkX9O({cpRsq2#F|?%8`(Q&waq`Xau{BDpR?tXSxdpAD zk<$LC&bnGbC+V70n^w?ln0ltOT0tYRPfE3E1&zd3DY05XBc13Lw1P%rzm#;ff<|J? zlvu5xk$&kGw1P%r-;{KBeAtg ztX9xSKXeOPK_jhqUGhvTXr$TBY6Xq-3TL%~Mmoq@t)P)kaaJp6qzjzY3L5D)XSISx zy4P8)ppn+OzEk|EZCXJivF}Q3SV5Z(Td%}w1&y?yThIy`iTzj7)e0JkEm&f;f=2p= zThIy`iG5ho)e0Jktyp5Uf=1f>hSUnJppn>*C0(tck=T+YRx4@C0(tc zk=U9gRx4QG6*SWPFQry!1&zdhF6n9ojl`BNv06bReby~# z1&zeMF6n9ojl|Y2v06bRJ?+cM2d$uy*xw~xt)P+E;w4rqXr$xZf>zK-?DLYYR?tXn z^%AQUG}2Gqf>zK-?DvwcR?tXn`4X!YG}5cTl3Jk^G!py1q^lJ)5?jB-Y6XpSpmR?tY~pv7th9ewxz$v*SE--ZM^sc076#=aoc+9g^6=%{Hao=_n3uN?SujacEQ8F%E4?JI0|+X~#IUDeV}CHl-co(5AFw z9NLt2j6<8!j&XR*q_kOAldg_yWhBzoV%y|(?D;l%9plg@uVWnAllYNc^%{Mca^**qs%Mk8j{x}o12o?ET>l|d5sw>hc^%`>?!1n1Xm?)6IQ*~P zdCdyCO-QS=^vC{bT?e!YX~jcvXcN*g4sAj@#-U9}$2hbJ=@^GLAsyq;CZuB=+JtnB zLz|F}arnDRNRuUA?+iJwKP9C9$>5Go#qa$8hNmR?ml2U@Zc1ab_+FhfHg?*Cb&M+y z2hl>cO;{@=ibI>Qj&W!c)-euk!aByGO<2b`vV!3G zWghLJ^-lYskJxYRgFa#$+6R5aIJ6J?h;e8i^bzCGKIkLHp?%Otj6?gNj~IvcK_4*= z?SnpI9R8O+=!4AfJEqS=lN4@BGP7V_og_1Mc-FKQ*?Mjs63?0z+dg?Z4w?4J(=iV1 zlc!@G+9yxPIJ8fmj&W$8JRRfEK6yIEp?&gnj6?h6=@^Ih$w5Hq2o#y ziDyE`l`ay`gcjRAAv*S3`-JEihxQ54F%In$qGKG|Cq&0Mv`>hRacG|q9plhGAv(sP zeL{4ML;Hm27>EBSPlzU)yUm%ZM1Qk7<1BmcvlpX?V$J(Fdryg|sP6xh0B%YzQ+##O z%h+iX$uYLPv``lmZ6aAAQ5@Pta*RWpNRDx66Ui|SZ6Z0wp-m*mIJAl67>72I9OKX? zl4BhH#}mn{e@POzDPwg+?2GoLf-w&5O9f*b+LsE(IJ7SnjB#jRDj4I?zEm*Ap?#@f zj6?fU!5D}3rGhaI|AQ|TBt!di-)sCggBztRa$jx@{Qb&Qe(j|OzL!ACw<(3p(s^}K z$k^G(yoq};kWP1Yd%ZW>q~2N48|mt8-ALOxtG9I{Ep=9J>qffYS-q_rsdsj=tG9I{ z?dWX#azF)0QEy)k7~{~s95BYAeK}x^L;G^T7>D-dfH4m3%K>8?+Lr^yIJ7SZjB$9( zyd02~Zo89M9jm`vu8E&oBepw<6$-_n-ANqd(C#FTacFlE$2hb*iDMkvoy0K??M~tt zhju4%j6=JVIL6`s$xdRju6s?N111IAl;CB#yE+M8?2x?GlBiAP#;!eeB7g84LH!+d zZv0eq-Z_yYEqC_Ji5%$`XV00)k+SoWh4UtIq@$d@P#VjMBiK|E`4s8-Q#-UB(#yGS|+!%*8i5uh4CUIjN+9Ym_ z!(%3i%j%T`tkoX+tCs#!bZv}7o34#I}u9-EAA=&?ahQ z97ZPdJw6Z&%h7`#*C9670`8{^QXWMdrKlx&Pco05%j z_`6EUlJVRo?Vzna`j%v9Q*xE%>FOj`vBMK*<5CuhC(er1&0t78aaL^m{Mk6X+J_dz zIJEm+V;tHvYK+5)llhq+6V%_0_NiH;O`|FvibI=5jd5txs4)(08a2kDO{2y*JZ93U ztVr90sXA7F>{``1piP)69*RSoFpY80kM;XqAI32hba%0&8xv-+_f zsZE&1NG|(g{8S{{gsDQIIJ61V7>71t8spF=Ok*6{glUY!-&MktEap8aVLHx|^E3W@ z0al;ibV_X<_#^Szlvbtq>ZDb%L&{VWZks?=q!owusjo2(?E?d19NK-TF%E}M<_B4d zl$5ECmNtPJqx03t{Ert3>TmW%@l(-h6Q~M>;?O2gV;tH9YK%jhK#g&D%p_1*d#2~H z7VF6*`Eyv?r?bYMZ*TXHacK9J#yGU8(ijJ=CwH`D=weTb>IZqGHdU%X>2LT;@l&g- zHdU%nC=P9^G{&J#mBu)Co86Z8|i@p-qRzIJD`|7>70;8sngq z<83zz>hIU~so7IMuOqeT&={S|z8pUloi-h+P$&*)*typ}6`eyTb0l_lif#9K#+Y3*ncr$VI@#H&=(H)!7@anS8RM|qRDQ)L^IIA@x(uvM$jfix)vsxn}-Quj) zh)BP5R%=8gUe2VWuzgii9DQ0NuC!-;UT2?*j-E-6#FIe9wzs**n6_-A{n z>88FPQ)@&dc57KJO1l?sL8 z&?YNm9R9A7m1GcausqAh_m02U6aO~{nkW|#Cz;z zp-o=KzG#z|F%A=Y8mFZvNmpu=w8_gDohv5uVM|EPvrk3m^OHFe=}NI}@-oJ3?Wuf@ z?XYCWrJ~a&FJpAtY$Tq)shG8C${4dYO&Q~$)!;j9f8^D^Pg1KvBz941?6hgh7_&A_8RMYU;DcWg z)ZY_5A*r9Tk=it6jLxk$$4?zYZJJV{P#pfQ(v)Ncm!>pj|Lq1>I2HTY|3BEiI%0Yi z(u_@MOBS80leWYT`zaORc6VhQXl;Tr#$m0={IU5-CZsZGtk!Y?rBgneCrsKc%A6CMaWc+5}~c!#z{^QCGwxYlVGklssk< zl&lfiBdNBvJ0@e#x2eb&2d(=~xh@_77ucspiPn8cw>hhIAJVC!!#0mB*nI=NJU9;Xj73f4qEp;&2~S|^Iecy_aU)I zQZZ{&kuhd%Dl*1F>%NmL*?7Ju9reRBQk#lYp!B!L*W#y+p}(tCB$>W@rcWx81Z+ww zvQS)|q#|~>9b2JlZ_d`JQ5@R+jWG^w`Y^`f4U_rHKN2UD>+DmbWK=g%n{>CcizjoW z4Q%hCboZRhk=W5FwoM<#__pc87>D0Y<_j%BNWxH~q)i{j=nt6w*j zBatvv%-Zx}jM)dK^7}83F=I!gqSK}iV{{(l=|fh7+)S;WZ*Q%RJ>TwGjB#iag)t6V z;cae-yh%^!X@!S$tg~9-A$`zUt?-aY4eEGn6NNFpTH!6U{f7tnK1BUMjKnTQ#jH&f z#+bE0v@o#B+?GVn+GuPL2K@zqHuVu$BA>R@c2>ZnL74(*N6F%Ip% z!x)D)aTw!pmTq9SU4uK>r;e77PUc95Is5U+9EqKV(rpumF_LZKFvj6!ditWJ2uT%c zl(dP%7@cKP`F55JTxy?+&ikiwBvOT9+r(jv*^j64%yt&C(@@cQj3*9R_wl?%wYYuy zVjK_cZOt(b?Owtdhc-nRQkJ%I<8Mz%( zim<=L;IU3A2m^mR+gGojUWF82Q_7Gfc$vgLLa}XfP*GAG+T>u2!&~)qLredW4pem7 z?Nj;k&k5@97W-6mel(RMkq#95|I6ecD?DDiqByiKVbN$&9NMQF#yGUM6vsHU zI|XAL+B9H{gH~V|=wXNVGb^m^ z+nP1_6o>YOCovA~^8{lY+8csn9NK+-F%E6&F2>=dQ~8#*gO8njnmyapU5rkfx{Go6 znl1_~IY+WiqohsU#ppa^@BEId1og*?PSF|JyM0q~o20w07#1N8ZIVu*P#oGMU5rDU zq>FKAlXNi-TTSJgTEgwso_N#x42iUyj-fV57h|UN*^uqK8}|Ko`e_x3-Fb>xo1}{| zYm;<}1DUf!&Xu4)-Ofwm?JmD}_m>9$;#5@k|4F^E@LRXD=0`7GtN1>r`0Awcuyd3- zqyhWRi5zLUvu94^NVhn9&P0xsofo~6h4b__VUvz>_Cnb;X@#?wOyo$smsl3sw-hUw zio+i!@>A?JAH4QMZ2Jo%ShyF*;}HSICv|nB?}`|I6Ol2kKT$ z`~Nw;*(KdAVT-yur8dGo35f_vdeJ`ZeYSAUDcaAGZYbo$tyFT+z5EX4^%v_%r8g;} z@)|-V#0^Q5xPILvN$Aqm@4NOGpE=iF&wBP*=WtGS&UpTKo-xNW=a^%D=a_SjIo4Wp z37vQt*U4tRKuFrCnepq-&}T(>y+Gd8lg!%pZ#(9Y0_ zpq=6Hkj2F^56=;%la=%h+Tpbg<@fN)6C*X6x$?wF?U}jq#7G^Lx$?wFot(My#7Lc& zx$?wF@lIgr8*d1<-jpYH*rg)%;YA!mCtk}TJcNThu^~SrkMs4!jnnoF9eHA3^M_`6 zcvk4dqqK&OJh2n}E;;U+6FL!|Gjt+6XE+?wExzb)C;m}>OR+pLQUv5=I}x5U%;brE z(C>#kKi?Op%crEcYfhL&cutrR4SQ4y&y7FL$%)KT#u=Zj{I6~MXCa{06t2U?YZIzD2QSKMD7RFFD9bN}n0g4DH{d&faVO67O!{_&tve zliUc*32Nc+Y@K3pnn-;J#fck%IpHB3PS(N49)cqjCvF7h44oUMio4G#EvM5V6en~d zFef~O!(;Utj89F2(;*ZmZUp8G9l3)CdkBtDoY0BDoS}0?x483jW;@(JCv+k(XXvb8 zU=II`pqr445S$??pX<`En4Mkczd}bo7paXewSUEx&qZpR%$3hY>RFj9pNkYhH%W*P zoWK+g^0_)5Y$NC{cM6pI7HaYaCrPw@gE;IYZ>$~m(Y2F?mP3; zPMN#&R6%Mgb9d3Z#XLozOcEk&X868cFM;p?8G$mP6Jaw$=lZGQY7dYRC=)snHZyd# z>lO<T`c~?7mD2$Mp(1`$g##)M`(EhEk7^;%YtLZ{`;Zuj_!! zl1?)|guR-=XcTV~Mnevde5x_=0H}}_4soBE;Sd2c!{G?s5B3Qggdg-@S;_HJ1*yw2 z_ia-JDMDn*8v!#z@_V|<>!C41WI`tbW`@o--D1>3V}!_rP6W&ho!9D7f=}BhBt#~3 zB4B3dT%s2vcxa3enb3)VnV}<>Zp1@lgvf->KO|s=&&30qk{ge28tQTHnBfqiF~dQA z)b<|O+RcA8TI5HOT9mo+qeu}9Q{D)T8Itm&hCK*IFihw~Xw1-&A9cA0!3c&4od}H? zI`X4l=Rq)nVL~TDV}_3Ws2%<8Fzyx;IuRN(bXG}dj7Zd-`QEXA@+jH%DOxrz1!jEy z$8-NJmzwdv5`?yzLS?vXZ9-+p;T$v>M4XBye1$_id}%nuU1Wws1jP)8E2oOP&K9Z9 zHXiWOX!*`mL5eV#xDgZ+O2XmcI=#%pUxdNLji8vJbEw{_<>4>FU_vK?VusE|-QrOm z{vr$}bRsBb=*-a#`yT!x3?_6|VNeY3iu1};Tby2IeG!jN8V+%1nBfrNFT+6|(>0fg z)aN$;)vO_pi4*}ZaU=XCl!Svkrt>|}MZink2!9zm@|gDbKo5*)u{`!b3P5pmV)EI7N_3+z442Iu~|}+do@c zPNzeVO6Ww$N_Yr|d%DF@mrR4xAxI_eY7bfAM{$_Gbcmz%t%u@VFT)`oTQnTv-Yml* zf>VZre4}GL3`ICfvu6aS3?2DKyLuRkaFo!A;FO^w-{@w47boE;p%cL=Lr1>Rdp!(A zI7;ZO#^4kYqep*K3hAR~6mgW!%Fig`Gkra?EPMVYD^q7Q)r3g=n8^J0==k9JX=3yzqQ$puH z60E{wiZ?#m=#Jy&4Tm^Q%W#NC1`UU}XUcGhu$19IAj-TTQW2IibO=P57ep$;QicwJ zDD#3y-8*3^qCi*Wd#3)Mlk25ORnH@X-}fv(%B8Gn`J1p(QOlB z1*xMl_bYnUx2HOOs=o4mRc}S~)JW!j_n?B*MCN|~pn}x3nfsr5E25`(zoO*E+ZNT; z!eL~pIPl}v>l_p>ZX6qL=)8Waxb+M}hjXulPMm^e=zK}XyZfVkJmM#G;(zm(94yQd7Dh27#;7ud*(fRy1t2ufBG0V%VR-*t--4?Pir5<2(kfE2#bU0=3d zmA>+KNNxI+#Ff88YPZalze8$4=E~n8^~TJVzeDQG%$2`Gigz1Ihj`PWS(N;pF+YBt zquYf}9OQ23$lv*kznPKqsf13PR%PhO-}$0HkjDdhLMI;AGj!zdO!>V}+yfW5rcdqt(p9nSyowy^)(2>7$q~H5Quu16L>vu#E+1b;hHgh^X zaVEk%O+h4FqBcP!w(p2Zjg`37rTR89FcR78iS9hyan$iExpjb9%Sf&F@r-aFHO=NWCf?|4xz>uLM&*q~Z0wNS7bRsZh=*Y7<&_h6kf`ra}G%!T8<}WEQG>Mz@Aiqwfr|0l^ zw#zIV9Qm7YPgD4a;%&l5$l*>RK^ONGnPEks$Z(jafX?Y=c{ls7tYpztL25G(_lW!Q zse;r8Gxs391S=bRr~V=*WjT!Gk{pfrL(kgbW?|Fi-U04?!TIbH54+5rH`^ zg@nex;^g(2rRL7~oaKL=*FOs(ou&{Gu2P#25psB}OaRA2X6g*#5O)n34iOA89L|_3 z_BhMN=^Ol4R&v%ZSjbh^?ck3WH?0F z$8eChvattkw)J0)7I`bA_Rm~-E2IeYC~t&)3`uz_9S`sj=n*;*_Azwit(@%v9s)f= zC&E64j=YsauMnvZfgYg~VISck9OSKR<^di8J>sqbVIQI@k1nRWUWaD)JR(NGr73`e zd($R>gB(r(5`b|YkeOFJ;AJ?(eLIFjglY_j-|JC=b4BX2zlUKoYy3e@pr;7Vh#R3A zp(Gsk=oUAgKMh%j;EcEtsxfp+WyQlFdsSF?uv5>kX=#EqbgP!bOEOO|^0g)oe` z5tK1>46sl zFhXZ73&#-sI4Xr>#y{ZXg_$M5W_*tGzy7U%7Q!h_;TasAHsKlMbe5S0>Y{jimY@(0 zaU8PY5U1Q24)I`<;ShJr7!DDLF&rWgV>n#fEtYx6h0u#ukqE>XIwOnY%~cU{iPLB_ z8gxf$JeD+#1NXdWo{W%-5D^X$axom<+ARh=xI&Oc=tRiH(2=ikz6VzbvY4+yYV8fV z5YhNc|KJJ1j;7!Vuhnc5JVDO(%hW6Ss0)61P(kYaWz)=(`(FnYq^`}}JM{8$QXfls z|9DWbo~PcCxqm*WAa#D`t~XVX;yqESE#4X>FonauQ^hk+H(WXXSKK%Z*wFcq4(&b5 z(BZ@vp%dr77&^C26=(Y6Lp(+#bmE~RL+9z;Vn@F-g*#M)j$9W~aleXI~GhFP4`VmQdFIOQ86_2D5P zSxGz+Bs_$Jyo%lZZWHc05jO%NhE4=T42N%biw}C}gAjz;Amdega*d(tLsf*e93>b?k&2u9)XgsEci zG{b!-{}p#<-KOiQsm$F)E{CUX&fI6~Nm5S@dhkOM_Lf{v5fTwM0wjj|2ed4oX{Zwt z5jqhdF?4=0RUGS~5JDnCCjumf&Qo=r!b2g1M1)QRNDQ6hy2Z(#v5__8597)up%BAC{=@bj^dR^lD~V8u zp(Fp{N0-|e;%*S36QK}8Cqf~H!$TGqkGsmOg!qH3q#+bSEVQ-@{l$$HhHrwDr}Zv;UM-y5ciyU#Iv33~{g2!a?okJS;epE7g^ zdkCEff*3l-bc=&M+(Fnw=tL02(7B>p-1#}Pog@808KEO5hExPW3?1$Z5juT?Ab1tr z>!G}H=ZD!@ggXoec?!FE0Ai8<%1Y!ZkXo9#@)Ss&nYr>5NPR7H0}0y#XoqV9?ZS**L_J`KYmLKKF>cczMMJiu_K|7x^+ zPp+1yuFl-+rwUR8C6qTp6o%w>-C}_UBM3?eod{7FI*03kR1ZcFln^=*qA+y6*)1;j zU<5%4p%WnrL+8PZiwS=?Wtsm99XTGP+Jq?ZA9(OY65=rw!#D1|FdQNnVK~Sqxa~5L z`V4#UK%+%I0jZrbS3Uu${W4cR0V%={k`TcNAu1f?6Kv*pS#Y<7xDkvnbRrmGILIg1 z+rtioA7mvFj4*WM6a4AhBK6^J3!&3G7(s;Kct5^E&z#^OJpIyXsd|I(B)-CUX4!xF zn-D`&$b#Z+LKev3Tn#lQPT3I5!a+BI#zQ2+A?}|rdx+qK;qY)h?BM~2QU8^dY||}B z5snZyf)j?>YjvgL(<1dD93gZfI3YZQ!zDU2)WZ;jBgBp1grT#^;$pFx&OanL zfv3Rv7m^#NVHoOK{o@f3*+bkDVfGMV2*W|E|M}k(sn6y9D=X3JPwJ-3)#^`*z=QHe z7(&qzEpE8=(fnOzZrPes2T!I0&5xH5fXpB-Fr8 z{_Ori12*|hK?59vHbDdA#9KhrpZdfhmxe=}?_fB@!xM%>+@D}LM0mh(ARr)DAi@KJ zL^#~jEsnax&>I})hR&6;RDZ~U zhaH4YJo;ehJhWRJI2vQejuG|PxJAK@=lZ4WZ@YI2sD>s7Fe`K!Q2vWT7 zLK5Ugkm7w8;>N*`f>=1j!HReF$BPld%Y9_82@J{pP5-wYsP0o|7(-}S=h8Ug#>UB+Jpp< z!**Y8MQr}n8Nxwt@xJ+V>zB>WuwQXsK2?zVVCEjAw=;O^(#$<hjFhDoyIf z%+)GQ>MxnARhksn_9Zv2^b2R<@TIBZi+)X?Yy0BHm3~7gvqZqECt|@sbc*bKxu;VryU!kM*nABmJtM!=FiJ7bQm=xP?Nr+9j;k&-hZ};ss+isx~n{Y!%>+zlb z4g|K{LMJxihR*5T;-kLZX4@@vViRuYXgxmAx7lpFh0c9+6VA?f2fyE3x7)Kg&+#YO z#A2O(WM-+YGd^sso3`o{Z?jcL4!6e(y0}?hNDGI!UT!$VrrdD&gPfsH+8{jEe`O_| zZb9nY%w4xzkQ&X`z~uyx;tIJW#HQTvjZL}XaB8<0@@wF``LC=*P5>#ckc%6ea>ML? zxG86q=J|H@X1VhElF#$);>OeN*2i%T+;E8Px8b0bx8qyt&HY!SMJq2UHr(RI_S-Pq zr(0a_8*Mh+LMOK0hK^R=6MUo1hFj>w_S?|;ZMS%$Z?xHP3!VGb_M6@A_4yk3pPk$+ z?a0T~+!>!=c$Q!1QZxQng6(tDcAO=>&2}6)JeMwj<0*CFD;(lRb;BX9h8qsC@irXx z=oUAgFH)b4^R?`~x&^7FnXBcW6xY8svSQ;c?1V#XybXt2bOYPPr9E{zr}?kY(eh7< z>)+zu4>#Vd$Faq>KIX=9^=53b1&MHoEw zZDwBa{I=l`H;Ee#aXs2_h;6aqaFQ113q|U4yZ>tT)RIk#E6}!Nli~`rxN$vN*a?R< zW?Rh4%Ngown^sd&aiaS4VClqj)`mme;%zv@HD<#hHo%4hTVBncu>lq&!r^D#;_fRA z9k#sUuCW_ncBLDgW^LB}+$^o#d_Onq>RU3)vgdEMwN2Y(inrM&BZu?L1%8}nE|`Tw z9B5`Z#8cCTgKiUx8?-ep6vK||#KIvq#5OLpgpc`^V6F@coi+SAF>7pWePsmt#Makv zh^?>T5L;ivA-2ATLu`Ew2R6G}A=k34FFVZ(^R?gaIeBYl8A|#4694PV{j;!jZQ2U6 zJh#~jBPU+rW$?!--iAXQ6=pcZQ^|%y+#GEubH(d@3W^0QbU=$_f$b@hs@n~svtF$x$&Ybv$J?nmf`S=sp5ohn0=k% zzp}I2rV3J@%iP~j6{K#?T%FrNisywTA#QCpeB;(;!(nN+81~zhclKXdiSCmk728`I zg=_EjmfhnH>B?@;qrz+~n>MN}qHQ*+$eHr0WQtmFN!^^eT5w4Xo^BnayjpNcJu`E) z;F7vDbG6`-;#E?T5HFUpY2l2iVvn;7SI(;zI&pfnp`!)&nsW^uj>Zx?aZr|_^9-Fb z?N8?Ngs#wu=XDJoEx5b-t;gJoEOg?=WJBkt-Quc?Y-DleRp_jh*I`*V*=`Dl*nFCm zyltvj^mVh6rT!~)-ab{3Ix}-mo+?OvEptCGRgk(fb7S*q_{QebaEP}w8xHZ7X2T)g z(rh@a#@9EoBfKeXJ||fiugLchvqt_hv!v;a51YuQEh@#^Y*CTJ_EQT_Y(|B&Ex>!6 zX`mnGzv5~ECUr{YY5^uS>>Ewx)dEb4?Wef088v(r{XNsSooqjaPHaXEou_w;9evx$ z_EYG@X4KGmt4>$;Z717Lp%a@?L+9FVvCOxfY(IrgY(@>8k;QS%vs~X|+iCXjovGrs z%S7rkoUb>2PiwcQcFNrAb+)&s_RHKGrV3JA1SyF4p=RN+{`}=2M+t{=XVsM2#45k8V*`| zuRh1@^KSnYI$C;39qXG(akcc4Vv8wmY&Z?cr*?}0-&(T86gsitG<1&Z7AJqk?2Ij@ z(1{JFq4RB>D(qWJwwOXEHk^je7K@APKX10fiYRon;bbl323m3Bc3Q(Mu4oz#v9&ZD zw&@m^`-^~X$}a@ku3M1WET7#QTT8<%ww8uNY%L9k)ws1}=eE)5s#>2pou1oi+0?Nl zZq!-#jPur;&YhkpX|qX04!6H*5sjN+1*33?>yL&*YzGYoEtd;EH9f*QH~O!vM9U>9 zHh|*BcF-_8rdu5B8$ULHLMOI^hRzk;;?B>RMX>=CI?{<)F zAWu#zZ#+k7NXD(KhC^IaG#p~%XE?mJTfFXak@}qGznV2-<0m|XLu~vEht;_8V>kBs zwDFr{S$l#X1fWB6S>axgS)~bAKWyikwucmNvpqx(&q2y8;;BdhEga%TRKp>z3mOiw z5i}gMeD3O7KDK@uEwK?abiS!byl?r~`U#!b2pT#MUR+H0mXEEU&{@HaAnRKkog+~7 ziKiD0hq#T@aENPthC^)m42K>46(pKzW6LKWu9W?4_=?^pR> zuj!wKEnCwTkfpKB77#gc1dhQUPaPT#aTBQF5Lf*ShuG{H4s7qVjKpS7kO+rO78fJF ztz&y9?muL+$4YioJ||TNw2^v$=DvKYAa!}>9yC>ux-oMPn<_~CC3E%WXj1XQ53}`n z;fLW6FZ?hZ;)NfEL!5|eIIO)VqOxncss9Fz4OPVui9 z#g5danXAQ))UBDT#g5crpGb1!t&oC3_{Liy4TpFuq~Q>6g)|)Et&oPpT6r2NYZluq zTZc%o%@Q{@U1lZcOcncICQ_fn{8#8)ti#YebzgvpmO_*U8n=r#6HerTCY{CqOwQ>{2>J-~88G$}*u(XQAc1w5& zhj{Cs;h=M$kMv_tmgeJ6;;ny%PQ3NcaL_Sa=lczkSNgBUkj{N3wf1he*xfucZMVi> z?Bp9VOEAv(Jjegqy?+)qNKM->7PdCqFXY5V%X)yVl?+%>MpA68#Ep%XfD#Vtc8haA zX_$?kXTRdcM$6ENjh5jM8!f|Ot=wp_4soNP=7+d#(Ci_uU>OeaB6Y(dwp4~gY^e-~ z*isn|I?77Kj1N1O&-dRPv6*Sw9I+U+*&HE<+x)bE#Z7J3R&Ib;TVktY<07^?hC^(142Rh27!I-3F&x(3tqwbj&C*t9 z{7Fvkomqxb{(gl2wPpV-Y*m`JJ}gUZwm!)DpjV|O{dgT2;i=0q_ia-JsXfj#Rh9Sc zQw6ERGB;keEP#YgylUBS(5om%{q0%2O-ty+yR{4*y^-XLpSBUjA?iXWj#M{vbUf`c zKRi87*)uEQTs>LIDm-P6Rb)4hzo|B@45Suiu2u$8OEXt11F17JH(pX~Rvj-XHXPz5 z#fHP7-C}=#8x?P-(s+w^RT(-Lb&GZUIh;7ST#)E<*|+UiRm*e>gwAT;e6TWb6~ktGQgKbgdMLIT zhQsCGv|pR;N!^sWy4p=DUdC!z#miU?hq$I;INUqi47~bV^EHhJ_>N|f1xVm9D#0JA~;ChCZ-q>IW65$XV48!5>ZZUR= zS;&98JyI%nX4I`RJ;Yn?Ca)yBUHQv#b%>; z3yR_JR$Z;X!mMQ2e>EG$k-dga9NB9)G#uHB_r1A$$+{1T>HJIiJ|yPyA7_>sTmHsj zZ`uw}yv=q1Ik@^V<8b_~`+hN19DA-Iey0Blo!j)Zgr}~_+}}?Xr1p2GUU{`_kiyj$ zHynS%S0}ySc)sDwfw@8_9DhS69Dl<>FVDK_BD0dU-SKB$$Enw72^Zh2M052C?yjGb z-FD5@q&}CqnyX2Li*F-~R~yQr!o@d>3K!pS_;$DWpg%&*s|{r(;o=)Q4K6+&^<_Dh ze}j{EXO@k-{C$Q0_1*qiaM7DwewKtbEOeoq`<=!A1`=!A1`IE*ZgNPT%tG~9TzhsSmc?)BgP zTVfekvofjOGgq@Rsc_>BD`NAqsBq)WcEXJ}93HZ`c-&QHCHTs+k_I;(FZsDCQr~kc zKMr)0L(U~uDw*xXBIIxjjTDL-YOK2=u5LJl>uoq3*DX%|j1AwR{7wZ;@}zLKHHO0V zHp~>OS>_RRBI!aWTyH~1t~YZvH^A8ZODb-MvGEqMa>F5`5l$t^D3Z-66wF{EW;p=<_$ObCWAh@iwkFa=33@jfuP1tyAM>7Q-Rp z-G)Or-G+lE{UhDI#?98O5l*+EqsYqje)K1Ev(S;#&8!^mwSdwm+-t)j+-t)j+-t)j z+-t*usP&4t*Lbt1B=>s!A}6oOER&zVKjwd((LW3BF;jXqy3K^%#@$9vJRWNB$6exv zL)=JWI7Bqta0tiRaKM$;BGA{dX8t`aKisKD?n#}PxnGznNX2`24c~YVuiII^y=0$m z!CQIn%-olD3sRe0Ze?VX3%doWT{HIp-2&$+&SFvCI7?oz35PgK-f*~&p3H)Wy7}2= z<#Recw}IfiHaWvgyKS6dn=QL*d|B z53SoRHuv+y!@;%DjY}&l2?y7#Iy^W1pgH}r)u5w)JHS-^lm}w>dgH_w;*+M z=7xi7_})hyT)fUJ-FMXe7EGmY%lBI_s}`AMrjoyLRGZvjinnotk%NmXBMgVvOlbXX zG3rk2{{Aa;Hq|SjJ%x)aZaBP#nPL*Zy1=Xy7gy+n!)xeh%D&uRD1?hEbmA0nL+3ty z3OI9W#BObLhihv%gllU!;LK`13)j}>GaZ+D_mzguW_}8`(78nqn|kVrnfu#rLF&NF z{av>p#W~uNa36JT@g(1nT-)*gPOYJ%IK*!5zT(CTop5Rm9Zl9F{_+}LW@D2zDPCqH?tLVR z%j|hgzD+?hA}L;6FMZ=R_SVPR<{#s+-ShK1BXwPiRJ;^MKUAZiK z{>Ei&azQEH#sx*rnXZtgpYQ2a8=i_+cN^mI>Tbg!?ou@z;-bCbKtxls#(nytJu~8P zejSBoIa2W=YwOL3SsD%zvostcW@$Lw_hXiLaeF7Xa{QG}o{(AAn*2S_|C;Qd1xK*S z&1Cv)<7Of!97=;f97@9>97@9>97@CC{^C$F_l4_d{T8mH;SjE);SjE);c(w~9r4Vr z?C%8Pv^6<_On_~iK;+!*RViw4!&E_vm;QIcm=NT zjW=l-zVRk4!{KnZx&e>2U3YPB?mo&Vv^h6YkRC+6kQ%bo7|d!lko0ir1kE z$#Ch?92G8|?BNoK~yKFBml( zB5G$igfnM2{6m~MX0B6m)K0Szsn2DuW+PJZJ|J~~KJh*v!yzJZhC{e*h69e;inwif zMW^<6z;Kb8955!VHVzna!qu|w+VOn*4Oc7S5U!S>kUfN}WjOppTrK7(+$iB2PL<)S zE#B__2A6QEY!(Wq%5Vs$%5Yd2rwUJJzfYPBUEX98x*%W6WIpxG>CT_H_@@$PQHEF9w9-G)QFyW4PxyU+}W6}&jfY!opn!KY8SQ-(vhQ-(vhQ-;IJ zxKns9cjp+@!`+eDF?m=$@8Fx`e{Ik|3+_;pd&NZ7#=SyLysOzdIo{Q5IK;b}4TpGF zv*FO@c7EoaPCmM~(=ABx(l%{e;uUTJRXFU`Ezb5BR=nrJ>@41MVL0$+3t7op_MQto zk~jBvesETroFAr}HqH-n&h@HnY9htU$;6FUmDz-)w@WVd_c!n!2cZ*hbue`FcF7@s ze?uIxYttBq>dH#im?L(XVZx!YKE{PnABRI@Gr>vSVrPHWFdQ1QlC{^N!OM7@zt*%o zcGh=D5A|QMm`$FPSq5DG#xZGfdnn$ga0H2P&^rciztGUZr4ctA z979L%7(CM77O*BdILsyS4pJKd5t}g_!j&-`)?QZz&*7RJoB5rS8z=9k=W^ChJj>5> zDFZTppBpV>qngP7JfgRK6IcnSfNh7Rct_ zP4YQO@me4o7x7vk!$I-d`}=Ew@CNql@0;K#G&vqj7Hu34f znp_Tww{ba;GvEpd=7)C+Qt>JjLp)xEVmQRBPz;Cr%d1eB3C_>)3yp44@nR6`&3G}0 z;c#jn^G31v=7s*AZb1s?VD-8Rti+E?5r>{zD_EqP7JUYO zn?)Zv3vw)ByKX@$Ua4S1hnFbG4C0jvHgvRuSmrNJ;3Wz|Ctj&w=x7Hq;xA9&B??04 zA96Gtqx+^DAJB*;6)zaD5z8wDY{Zh{Em7jeJEP1};{^k0#Qx*={H(6mrG=Q7PIxQ@S|WKO3iWX=NFwBRyO+bp=qiFcvc1bgyl>{rGd??Op~ znl}m`c~L?qj_EdZR`8f^#%3&{W=TKFkM6}Hn#Nna4_EW=-?@mgvVA%&qLU21=eS?1 zo8K9SFUu@5%>2#L*tFDAyv%ee` zcO4iGZQgajcw3qSy?f|zY){3JxP~N$;A&42N8$<+;qcRLaiu?&wf3GP#|m^^|HY2Q zscEren6+8#kh8I$TdywADb=Ln=vN!49QG=7;^=@WVXs1G4L>!FkrfMA zEMOa5tLM#qsba~B1w-IX7$8;=zpmicecFD=dfM zZ|Jwnip3b%IM(?=$n=ihD)1e z1Ua!_82qtd7!LQB1p`};rNR0wmIlM&zP~gu^Pbp$l4nwGn&dI~Hj_MZzUWnHy?kxA zAQeYcnaRWvRfYqHQprkI`w>-G_3N_#FH0pA2R2y`#d{VE2aaemOC`k-P2#SS_bf1* z?(D}BDDH#VzBC(f2LXya@- z!(sKDEr+GX>E(v{-udljaeBERSyi4iv)(KE&%sQHO%p8U+Gc`9PMjrXCeG<$>RKHT zNGi?}Gjx_^&v^xpJ;5g93@t;FQ?ty@NW~!_hR(_y0>VtT>4hdk;RlTF`#IKt{rx7h zEPMWDDr}lsDc)vkMb3~bq^^#$qXe^Xh_j;%hZUSevA#Gn$wq5Tmxja2Oqa|~U(7z{ zkDa_TvrK;e{;L1=&Hh=K?wY1g47bhniJUkq$l#B&f((Z?X9Zzr!}%rMOS=WBI3vf9 zj3Wl}#8y(wI6Ef~a(rfnPKU{;X>!B7+DvZ9IW+r*I2#QQnx-|1x0%+E6BAfWU>l7rF0h?A1Hl)r##YE6Fv0xl+CKlwxv;GG4n)s|g_7IcBnmAc7g1?p~ zi%B~CLwQd{-+v~v42=BE6woxKP`u5Qf}G1;Aze}XM7JOnkLnrX_m@ZY==rO&|DoO_ z6%VdiZ{GJGTw_!onx={Iw>x=SX64zysKfoQH}=oMz;2p0Fq1aZ26AG8xPMI$^l?lD z_m`=Fk#3*#I zYyAfl1E6U@(M@dz6mod_MlNkUi=$o^4tme{gg=9`^3USX7d&-h_>zj7s%=26%uUr; z?&~fx8FCZ>`{mhp1nGaxEX$t1G5w~YMDaF52|4iqn_;{1g9g-Nco>o^Gd!@yN2TF0 z{xl~iGAoY)qqg$Dw(Xw<^KKe0bXc3=f}FV5-k@)DuRZwk;ySG+@fth9Cmgm|T-1#j z3;S??W5)QJj2V#I7&CIN@~WheUWH3)ZNIk~B;%gqnI?+W?CEb}l?ww@-^l(7sNIlR zGsSc|7+RAVQ@o8CBWGZXcmHJK`K zw=q@ZtUdQmf(|dY&>FMGzUqSBeO-TBqvM+l35ePl5^~nWd*#4k&AOqK9((j9Ho0io zq@j=X7r%%_o1d3i^|^>HZ!#f@w=p5)jJQG?nZN56r0y^GM$zH}9WZMJsr&vtLG;2^ zdCvHMPOg_MrDw_dzGwMSE>$-ZINUf$XPwtHqmTVU(=&ikM>JS z4Nt+);3fc3uML36;p&wZ@_)#+EOhu&o?s-G)XD^@(Uca;ZKIOk=ed9y9(a{mrE(2A z`IyY2{%2>_Zce@=v+8yYMrg26XWcW-TW>m7YFQi1k+W>2Pwk_Xv_rk7BdbWEgSZWm zPHI1@zj2{hQ$y>OR6(c%hMYFx>bl%!<&k)Cf90vHN%^{h^}MQ7Pe(5=SHp0;eTzBM zrS9$O<<{%`Vb1&>bSb!ADmVdIEjZD);DJfi z(W0*EI-Sv0<&Z)7Ih`>`l$cG_BP%NO1Lg^pJji}yg$I41^X7CG^b_^GO0jmLCNJ|M zZCbN$MLaYB2^dHeErEglVp4t#vQ3SMEJd|x&^n!Grz%&4d`)U!W@e{ptD>GcorP`0 zZ|taUmO5rh-84E|_c+@xxA9qPM-~#C%Zb&OscqIipr|a9BqJXqo2Hzk3FDA!(q3-t+E{s zKtDS32BEjlydmhrou?Ij*&GtDt7L?JedY~9zajGmpdUD#e3NB!NNns(jg%qi2W8$M z^d^}%0KI)xU>#5(*x5DFFoQfKvBn|M(MBGrH|30w%baByNqs73ghWZpNa`W3vfM;S zTG2e{dz&#qGpYr92R#L8VQJj7>!Yr2$)gEKD|!8}Y?5_MgRBcGJm`xPL}QQ}XE4C0 zjTQ$~q|>6=%00vL@0m5&$H{q_1xXvVIYc;3)a(OVn5A-|`cP`kU2BF`ac>~a&&b;9|RRa-_R)HyjLB#mfZf_j@VK{KiadzT;z(!z4&(yrIL z7A21+AgyVHH_1XSGBraX7Lj5>&L(|V*JfVAW(=XP%`7CHkXiLE-_8G;^xp?|UVqoR zC$G1|6U%8Gk#yvYKVeeICS^cm>s+{A6M($fYbrs51{k%TI_do~8#IVC%z&Ah=n?C5)?*Qp5!5*5{Q$Xh*^%?hN@Q5hlscSc51D5;E) z=x7p2p|LV9U*QQ9rc^1bcj}>~wUuR9aFcxMq8<$^$ZD0) zRIO}~RV|>=M%f@~dXr+`_Qw6te^u;Z-nL=?73p}-?@7YT%pmVF{)mzmB*=(XHU!8d1 z&DIUG$;|3av=KGtE!;1)bjbkpMCJ`bza;a9pkJDK!_Y6wybO_?_g{jZrf1buYo4MHEAc>~brZe3BPZWAE&FWw4GZ;+QI);Q!b zF5V_1Qtx)ICL_pi%*aUURj!FLLZ0L-lSt}=IU{5-BO@u=)-VtDwrqlyfuO?0khI07 zMpBPYdMt!|T4GH=W+fIbAKrN=fxxoHc?BtC&gsm9obnpi>AYtTXsWcr{c1fdndWE# zeR%4ug|oDhddjg6O`SrmUxjs zYPQ2*1q5Zi(+~k)GiX3yTr78phK-s8_I& zRWMv`=IS+6|EpI~{jXjJ7W1i!kz%lesYe$=0)2@QDu8pzgQmMRnLz%a(hbnRPc@9) zJypLK z-s-Abozteu4|`uS3+S>ahQ<&VtKL<;rRMjRn%}R~$CCZbgQWU(I!6rDC6&CoD8@L( z-Rv&ZOJTsQ7Q(2WrFU(aWVC!BjrPfUsq4H&42RjGzxBM$(cgM5twHrl*LQuG)MRbx zra2Z0X0Pgh%abF8?ieZR5{$dNvg(I=L9yzk(3mkMH)45NW<#_tt{KrMIb6BYp3dK~ zmSwg|>v@|it>2>UonTry+HoJbJ=!+6!IGkt5^I4;wfFqnkY#9Jn1n3iFnJ{uK`!3 zhL0v;lx$k*(X3hy8fD}xL9VDM%H2>=3;Hjqjbn4XYt~I&G+IDE*m=?d@)0T9dk%*F z=bUXtu%UQ~4K$6E$rimA1Dg<|nMi1org5EaxBCZbc-wY8lMbduKQ=@_f8*Gr@NAP# zJ+EN7qqkCWB62y2!jC=#ORIAoQ7; zHvoM{<_*_73Vo0FJensU5vf~RAy4&OHcyZ`Czpl%Y+@~d{BmN=heWZ4n`V3Unm{kA zwRwZor;_*yNNTo>q^Ml3CnS0_&qS#5VXvVa3)D)-RoYaH?ii8Tg^t_|xBn9{%HO+zwOE)nIs?$GES>ul%}ooL(>U2BA01 zydmg~GH)3Aftfb~y=mr+LO*8P%H&lxRa)VGojROMbF_foD(Sy)mR3?vIijJdvtegOGyhtt5a|?anjF9a z`;zFRUBsud^kNJDo9grSJ}CA6HREcohBooO291hKp&T^U=p%o7?3Ea&=_Rab-YPe`eQ1Y z)Ho!~kTA%VZP9mU1#uF^p6N=I4M(xPD?Bv&QiWF^0BynE(N%hx|5mQr)YYl{#dJIF zQ&Huw`rK2mpnA=wUPJZ2dKK0G>UCf-2UPIIU@vu^W&}uVqQnRlz`2S!-L0aK$5$YS z{+RRRDSyhzD=XQc|1)QU%yyJ#@-5R+HwMWnSn38Wv(2Kf_9ioE%5uD>E>9L9mHD8bo-mw*+$FK*0q1NG((u1W z3+k!vH{h+Vy0u2Msd7*6OJ)K2Mi?4Hyy03;Z>jmcrFvp4l$w|9XC5Tgm)CXblA5md zFvcAsb`rD(R$uyL~n4oa-}`j zdVW>QGFzqfyv>!?b2V5T>pQs3)>ZYqs`UL^^h~7nTn#<&UbkiD=-Dc*=T)T-?X8qt zc}<+(yZ-e|33LYQM}w;MEVFe=J#TZT9Ox^;%l)^!)&qTT<_$t0n|Z^~$7S9i^gA+d z0Q&ctH(VbE=y9ay(T*Duk+K)a<2{#cCrBZ`!LWM8PavMsrL2j9)Vq@&6Of3vjQtvL zRBGgC5=P0Ul^)Hi<)BeUJ{9DOilW^Asi*~gc536;1x|jZk`4N+IUD2^DcgGvhW=j8 zwj$V2yu=2YM#^M=JEvzzHz7tdk|DpOwj2KGH(!ilgt}}eo^KPL+_h;L(uawZxDL_ z%o~6{HS>Dr3H05;^Jt!cM5H`;$o)K*%@d?vmdiqR6KetFYZ7ZdB#Jfc5qkBSKrgDb zd4tpeN&EyPHCskfR4&&O5 z(xDrqw-L2@MHDm&ODjlfsp4=%r6}~9ou|8NTHn`l?)w|H16`s zHk)<56dKc+Dz(fTL%%hRt9r57oVI#iso!v|r=F|9@XmL|F7V&!dw87wbmk30Uy^x4 z&{t*NDD-zSZwUIknKuZ1b>0&nc?ft@4Dr;F{xiCY~=I&;RM z5=eco*D~YJI&e3+q+h458G}T)q5~)oAY#>PX^0`v1p2ycCNv$PwE+@|Wj1KgZgBXJ z-qhs}@}`%fplO3Lw9z;)B~4Y|D+)5HgfM4N0$y(DLZ z{5NM=MpFNtGeW*6WjyK~M-`+_O5E}|Nm8_P1j#}<$uV~V*`NOFmr<`pfxE_^3VX0+9g6Fz03xUq8j@@?7gjP zWh<@Dx@~H&=C99aE31PBLYu19@Jk-wvpfxWmx8twOiyjp6|Co##Gm$;h;3;usSCo! zsIs z4MJa*c|*|O%e-OeEgzq5qgpzL#G{?5N`|4g&b%S$$7J3h^tPEd06pP69TvEB4vGD9 z#$o7}WZn?;%Q9~edO_w5K!3w|)0Ncw4EVn75XgogJ6^7w{+&dmEiF{w2R&=bSboDcA*-ViLj*<~W=ft{oB z@qCD+GiUsXa5`khpPzHRsCmYp{cHxCo$gYQObr~P2hpm`291X5FUVISLD`_OI%R`I z(^48VS~sk~m=?8^#h_o5be#m8!z)Ta1DGbzP1h+%QRj5yYY5F&DK%ABPk7W=%7muA zYJPYtt3z)1c$=!#@UL&#s^J?se6x?C8d{xpBM+s~xCH5RuMa?)Is@sL-fU}TJ#X`x zNv@S^C3=*)zR&e%-qf4}S(!rXcu|U0&(@-P-sTpOi^|*SakXpz1OF`@1L*(Eyg}$| zGH(d_hRhp=e&Y7YF}S@$Vh3lIjsf(OGj9m`DVaA2{nX4GfSz)m*6iCmBo59QhoN7U zc|*|ul6iyBhi2XY^begkT}izgf$ygdfgA(KK`*C%fJCG%x$Q%o%?o zoDP}s=Qmw1YM$|DKa0j@%Pxhc+td+|XjNu|Mnh$TTvF)^Xsk}zAknmx294Ir)=yVz zDT_fbN}VwYILB3#fCezlsYlN#NKt1ga78Mmrs_fuj~Yvv(9~DW4{v34$PFKFQ?(kt z?L%5Md~=6y_Ayk4tKG;$X*4cD`mEOnAWfZtbWCryWwf5Rc^M_w%C!0Y{?HSXQ*rDZ5+8P^6x<2=|7PAO^hYvp1iHw)Vd#%#-VpT1Gj9<3%*-2r zKJm#F1?xQvqH~{MndB=#qPMyR@-!E3D?2GFP{w}Z_etU>Am5!>laL53#ZMHZzTlNA zf&}@iiXIaMsoQf#$UUB9%`%CkE_1FVLjLcJjHCueL1hy1UCuIzq;5_bCm?@3HOqsW`kyI=*C^h zHZ|^6sS!HYIC+}?O)bqePOeCeNH0Yp{wv-IB@dd8S+_H=N9v_Rd>E7&p5L>! zt7L>eubPp>J(Y~m8>Wd=Rg-v}Gs~)>cdTY4F~5=#`haRi6313DLepo{jp=75D+*!N z!2?#%YeKS`zYU<({B3Zp=5GUUHGdnFtNGi2UCsaZV$R$mZ|JQ91*xC9f$KiXHXWeC zM-LQjpjXcQ2Z}bJE9attR@SVX`wbLrfL6{!28uQiE9cZe&%DR9ePVJE<})QQfMV545{h&t)Tx;lN zb9oh)YUq9=iHt;7kSsx#p`yC7)q7W z$a?%TX6uG+*_-EM3p5fw#qLdU~avtKp*UN4(>%%VU!P z_~0~~&EM5YAkz@r*V{Ip+BhF~ccTA5q`Dackv_sSrbiN5P~|j}VZtmh%|w&NA&U`B z=R`q#x@jgu>P@coG_!68b-l}RS692_)wM2pb)`#QUFVX=ct_=uSJ$}Y)fFyz%hz{q zgT8Yc^v&}EAeZ-S_UfDGimdP427UAV0l=lay1wVt%y4?F115$z&8(Z^G!vMxyvC{G zuRcZmElm~2OivZ0*G=}`a}*|jp-IzJaj*}Bx2FLy28m@hJb3w1&;80=3Nn}KnJTD@ zEVE4&^}NkfMLk!;RPkHyqsKXZngqauP7&)i-z46VHjDG0>?7-G{pST_FMnRBS2;ag z>qBgsi6+?RjM0wQ)i~Pg+LR-#X|&gMDf87;DS35GN*<#aMM_?MRP^f6Jc@huXdcDA zdgRfW_2?a)f2;NU^zf=zI?b$ib>l#MoDZ}o`0oZ9hKFm-CcQ%%h&|DG{=(pz2I2$U z%tn&AjX|QG-XHvqx75-8AGg>IaydxKHH->sBg`%7oNH$m5;0 zZb#P|ZueQ`fAj1D$!eoWLOpiT@Ki7rB3(1tdt7D~w1{;T+g7e#**%l%Za$wd_SN3{ zU~7P&x75PkQaz8tQ)>S-hmC#9$)98vWOhgz%mqJQn`Uoa3wlfS zgwT3RjrW%7iSeFP>yD<0sV=!{^z|yL|MhFvp)%MYL#8m&Q*Nz<8Wtx*h`fRQ2Cvl0lTFRr) zWtmkkRj+Y2o$Gl`yM7Yi-M>=ik(1H{HU{}+XX#o?U2unD1YFkXJhi7+d-L=zX!Sg5 z^Wo>OH(lLwuNhBN;FM2i26uHg?_+LMJWf_ z=T*uZ>80FE?lentolsG=!~3>PX$_X#6Un zvSa}IPnkCi{pZXZfZlFLyYN-sW7SXo&0bC>3Q4hM6GgFGQ^5(yYQbI;rQjV&)6t?= z(_Ry8Du)cp%S0hjqRB)N_1lUH{eYp0QVz2JRw)NfeKOJK^%wvZuBfotOmt;s%0zG3 zu&;)6zD#r&ntnAC?J=QIH?JMDnGHbio_WL2FUY(B=p~ugSN=|(MTGAJ(-g+z%a6GhZ66&30xN*<~xWo61lztC%0A!%*%$fv!us2mxz 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[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)?$''', re.X) + + def construct_yaml_timestamp(self, node): + value = self.construct_scalar(node) + match = self.timestamp_regexp.match(node.value) + values = match.groupdict() + year = int(values['year']) + month = int(values['month']) + day = int(values['day']) + if not values['hour']: + return datetime.date(year, month, day) + hour = int(values['hour']) + minute = int(values['minute']) + second = int(values['second']) + fraction = 0 + tzinfo = None + if values['fraction']: + fraction = values['fraction'][:6] + while len(fraction) < 6: + fraction += '0' + fraction = int(fraction) + if values['tz_sign']: + tz_hour = int(values['tz_hour']) + tz_minute = int(values['tz_minute'] or 0) + delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) + if values['tz_sign'] == '-': + delta = -delta + tzinfo = datetime.timezone(delta) + elif values['tz']: + tzinfo = datetime.timezone.utc + return datetime.datetime(year, month, day, hour, minute, second, fraction, + tzinfo=tzinfo) + + def construct_yaml_omap(self, node): + # Note: we do not check for duplicate keys, because it's too + # CPU-expensive. + omap = [] + yield omap + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + omap.append((key, value)) + + def construct_yaml_pairs(self, node): + # Note: the same code as `construct_yaml_omap`. + pairs = [] + yield pairs + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + pairs.append((key, value)) + + def construct_yaml_set(self, node): + data = set() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_str(self, node): + return self.construct_scalar(node) + + def construct_yaml_seq(self, node): + data = [] + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = {} + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_object(self, node, cls): + data = cls.__new__(cls) + yield data + if hasattr(data, '__setstate__'): + state = self.construct_mapping(node, deep=True) + data.__setstate__(state) + else: + state = self.construct_mapping(node) + data.__dict__.update(state) + + def construct_undefined(self, node): + raise ConstructorError(None, None, + "could not determine a constructor for the tag %r" % node.tag, + node.start_mark) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:null', + SafeConstructor.construct_yaml_null) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:bool', + SafeConstructor.construct_yaml_bool) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:int', + SafeConstructor.construct_yaml_int) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:float', + SafeConstructor.construct_yaml_float) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:binary', + SafeConstructor.construct_yaml_binary) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:timestamp', + SafeConstructor.construct_yaml_timestamp) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:omap', + SafeConstructor.construct_yaml_omap) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:pairs', + SafeConstructor.construct_yaml_pairs) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:set', + SafeConstructor.construct_yaml_set) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:str', + SafeConstructor.construct_yaml_str) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:seq', + SafeConstructor.construct_yaml_seq) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:map', + SafeConstructor.construct_yaml_map) + +SafeConstructor.add_constructor(None, + SafeConstructor.construct_undefined) + +class FullConstructor(SafeConstructor): + # 'extend' is blacklisted because it is used by + # construct_python_object_apply to add `listitems` to a newly generate + # python instance + def get_state_keys_blacklist(self): + return ['^extend$', '^__.*__$'] + + def get_state_keys_blacklist_regexp(self): + if not hasattr(self, 'state_keys_blacklist_regexp'): + self.state_keys_blacklist_regexp = re.compile('(' + '|'.join(self.get_state_keys_blacklist()) + ')') + return self.state_keys_blacklist_regexp + + def construct_python_str(self, node): + return self.construct_scalar(node) + + def construct_python_unicode(self, node): + return self.construct_scalar(node) + + def construct_python_bytes(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + def construct_python_long(self, node): + return self.construct_yaml_int(node) + + def construct_python_complex(self, node): + return complex(self.construct_scalar(node)) + + def construct_python_tuple(self, node): + return tuple(self.construct_sequence(node)) + + def find_python_module(self, name, mark, unsafe=False): + if not name: + raise ConstructorError("while constructing a Python module", mark, + "expected non-empty name appended to the tag", mark) + if unsafe: + try: + __import__(name) + except ImportError as exc: + raise ConstructorError("while constructing a Python module", mark, + "cannot find module %r (%s)" % (name, exc), mark) + if name not in sys.modules: + raise ConstructorError("while constructing a Python module", mark, + "module %r is not imported" % name, mark) + return sys.modules[name] + + def find_python_name(self, name, mark, unsafe=False): + if not name: + raise ConstructorError("while constructing a Python object", mark, + "expected non-empty name appended to the tag", mark) + if '.' in name: + module_name, object_name = name.rsplit('.', 1) + else: + module_name = 'builtins' + object_name = name + if unsafe: + try: + __import__(module_name) + except ImportError as exc: + raise ConstructorError("while constructing a Python object", mark, + "cannot find module %r (%s)" % (module_name, exc), mark) + if module_name not in sys.modules: + raise ConstructorError("while constructing a Python object", mark, + "module %r is not imported" % module_name, mark) + module = sys.modules[module_name] + if not hasattr(module, object_name): + raise ConstructorError("while constructing a Python object", mark, + "cannot find %r in the module %r" + % (object_name, module.__name__), mark) + return getattr(module, object_name) + + def construct_python_name(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python name", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_name(suffix, node.start_mark) + + def construct_python_module(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python module", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_module(suffix, node.start_mark) + + def make_python_instance(self, suffix, node, + args=None, kwds=None, newobj=False, unsafe=False): + if not args: + args = [] + if not kwds: + kwds = {} + cls = self.find_python_name(suffix, node.start_mark) + if not (unsafe or isinstance(cls, type)): + raise ConstructorError("while constructing a Python instance", node.start_mark, + "expected a class, but found %r" % type(cls), + node.start_mark) + if newobj and isinstance(cls, type): + return cls.__new__(cls, *args, **kwds) + else: + return cls(*args, **kwds) + + def set_python_instance_state(self, instance, state, unsafe=False): + if hasattr(instance, '__setstate__'): + instance.__setstate__(state) + else: + slotstate = {} + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + if hasattr(instance, '__dict__'): + if not unsafe and state: + for key in state.keys(): + self.check_state_key(key) + instance.__dict__.update(state) + elif state: + slotstate.update(state) + for key, value in slotstate.items(): + if not unsafe: + self.check_state_key(key) + setattr(instance, key, value) + + def construct_python_object(self, suffix, node): + # Format: + # !!python/object:module.name { ... state ... } + instance = self.make_python_instance(suffix, node, newobj=True) + yield instance + deep = hasattr(instance, '__setstate__') + state = self.construct_mapping(node, deep=deep) + self.set_python_instance_state(instance, state) + + def construct_python_object_apply(self, suffix, node, newobj=False): + # Format: + # !!python/object/apply # (or !!python/object/new) + # args: [ ... arguments ... ] + # kwds: { ... keywords ... } + # state: ... state ... + # listitems: [ ... listitems ... ] + # dictitems: { ... dictitems ... } + # or short format: + # !!python/object/apply [ ... arguments ... ] + # The difference between !!python/object/apply and !!python/object/new + # is how an object is created, check make_python_instance for details. + if isinstance(node, SequenceNode): + args = self.construct_sequence(node, deep=True) + kwds = {} + state = {} + listitems = [] + dictitems = {} + else: + value = self.construct_mapping(node, deep=True) + args = value.get('args', []) + kwds = value.get('kwds', {}) + state = value.get('state', {}) + listitems = value.get('listitems', []) + dictitems = value.get('dictitems', {}) + instance = self.make_python_instance(suffix, node, args, kwds, newobj) + if state: + self.set_python_instance_state(instance, state) + if listitems: + instance.extend(listitems) + if dictitems: + for key in dictitems: + instance[key] = dictitems[key] + return instance + + def construct_python_object_new(self, suffix, node): + return self.construct_python_object_apply(suffix, node, newobj=True) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/none', + FullConstructor.construct_yaml_null) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/bool', + FullConstructor.construct_yaml_bool) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/str', + FullConstructor.construct_python_str) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/unicode', + FullConstructor.construct_python_unicode) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/bytes', + FullConstructor.construct_python_bytes) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/int', + FullConstructor.construct_yaml_int) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/long', + FullConstructor.construct_python_long) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/float', + FullConstructor.construct_yaml_float) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/complex', + FullConstructor.construct_python_complex) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/list', + FullConstructor.construct_yaml_seq) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/tuple', + FullConstructor.construct_python_tuple) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/dict', + FullConstructor.construct_yaml_map) + +FullConstructor.add_multi_constructor( + 'tag:yaml.org,2002:python/name:', + FullConstructor.construct_python_name) + +class UnsafeConstructor(FullConstructor): + + def find_python_module(self, name, mark): + return super(UnsafeConstructor, self).find_python_module(name, mark, unsafe=True) + + def find_python_name(self, name, mark): + return super(UnsafeConstructor, self).find_python_name(name, mark, unsafe=True) + + def make_python_instance(self, suffix, node, args=None, kwds=None, newobj=False): + return super(UnsafeConstructor, self).make_python_instance( + suffix, node, args, kwds, newobj, unsafe=True) + + def set_python_instance_state(self, instance, state): + return super(UnsafeConstructor, self).set_python_instance_state( + instance, state, unsafe=True) + +UnsafeConstructor.add_multi_constructor( + 'tag:yaml.org,2002:python/module:', + UnsafeConstructor.construct_python_module) + +UnsafeConstructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object:', + UnsafeConstructor.construct_python_object) + +UnsafeConstructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/new:', + UnsafeConstructor.construct_python_object_new) + +UnsafeConstructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/apply:', + UnsafeConstructor.construct_python_object_apply) + +# Constructor is same as UnsafeConstructor. Need to leave this in place in case +# people have extended it directly. +class Constructor(UnsafeConstructor): + pass diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/cyaml.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/cyaml.py new file mode 100644 index 00000000..0c213458 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/cyaml.py @@ -0,0 +1,101 @@ + +__all__ = [ + 'CBaseLoader', 'CSafeLoader', 'CFullLoader', 'CUnsafeLoader', 'CLoader', + 'CBaseDumper', 'CSafeDumper', 'CDumper' +] + +from yaml._yaml import CParser, CEmitter + +from .constructor import * + +from .serializer import * +from .representer import * + +from .resolver import * + +class CBaseLoader(CParser, BaseConstructor, BaseResolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class CSafeLoader(CParser, SafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class CFullLoader(CParser, FullConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + FullConstructor.__init__(self) + Resolver.__init__(self) + +class CUnsafeLoader(CParser, UnsafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + UnsafeConstructor.__init__(self) + Resolver.__init__(self) + +class CLoader(CParser, Constructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + Constructor.__init__(self) + Resolver.__init__(self) + +class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style, sort_keys=sort_keys) + Resolver.__init__(self) + +class CSafeDumper(CEmitter, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style, sort_keys=sort_keys) + Resolver.__init__(self) + +class CDumper(CEmitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style, sort_keys=sort_keys) + Resolver.__init__(self) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/dumper.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/dumper.py new file mode 100644 index 00000000..6aadba55 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/dumper.py @@ -0,0 +1,62 @@ + +__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] + +from .emitter import * +from .serializer import * +from .representer import * +from .resolver import * + +class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style, sort_keys=sort_keys) + Resolver.__init__(self) + +class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style, sort_keys=sort_keys) + Resolver.__init__(self) + +class Dumper(Emitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=False, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None, sort_keys=True): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style, sort_keys=sort_keys) + Resolver.__init__(self) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/emitter.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/emitter.py new file mode 100644 index 00000000..a664d011 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/emitter.py @@ -0,0 +1,1137 @@ + +# Emitter expects events obeying the following grammar: +# stream ::= STREAM-START document* STREAM-END +# document ::= DOCUMENT-START node DOCUMENT-END +# node ::= SCALAR | sequence | mapping +# sequence ::= SEQUENCE-START node* SEQUENCE-END +# mapping ::= MAPPING-START (node node)* MAPPING-END + +__all__ = ['Emitter', 'EmitterError'] + +from .error import YAMLError +from .events import * + +class EmitterError(YAMLError): + pass + +class ScalarAnalysis: + def __init__(self, scalar, empty, multiline, + allow_flow_plain, allow_block_plain, + allow_single_quoted, allow_double_quoted, + allow_block): + self.scalar = scalar + self.empty = empty + self.multiline = multiline + self.allow_flow_plain = allow_flow_plain + self.allow_block_plain = allow_block_plain + self.allow_single_quoted = allow_single_quoted + self.allow_double_quoted = allow_double_quoted + self.allow_block = allow_block + +class Emitter: + + DEFAULT_TAG_PREFIXES = { + '!' : '!', + 'tag:yaml.org,2002:' : '!!', + } + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + + # The stream should have the methods `write` and possibly `flush`. + self.stream = stream + + # Encoding can be overridden by STREAM-START. + self.encoding = None + + # Emitter is a state machine with a stack of states to handle nested + # structures. + self.states = [] + self.state = self.expect_stream_start + + # Current event and the event queue. + self.events = [] + self.event = None + + # The current indentation level and the stack of previous indents. + self.indents = [] + self.indent = None + + # Flow level. + self.flow_level = 0 + + # Contexts. + self.root_context = False + self.sequence_context = False + self.mapping_context = False + self.simple_key_context = False + + # Characteristics of the last emitted character: + # - current position. + # - is it a whitespace? + # - is it an indention character + # (indentation space, '-', '?', or ':')? + self.line = 0 + self.column = 0 + self.whitespace = True + self.indention = True + + # Whether the document requires an explicit document indicator + self.open_ended = False + + # Formatting details. + self.canonical = canonical + self.allow_unicode = allow_unicode + self.best_indent = 2 + if indent and 1 < indent < 10: + self.best_indent = indent + self.best_width = 80 + if width and width > self.best_indent*2: + self.best_width = width + self.best_line_break = '\n' + if line_break in ['\r', '\n', '\r\n']: + self.best_line_break = line_break + + # Tag prefixes. + self.tag_prefixes = None + + # Prepared anchor and tag. + self.prepared_anchor = None + self.prepared_tag = None + + # Scalar analysis and style. + self.analysis = None + self.style = None + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def emit(self, event): + self.events.append(event) + while not self.need_more_events(): + self.event = self.events.pop(0) + self.state() + self.event = None + + # In some cases, we wait for a few next events before emitting. + + def need_more_events(self): + if not self.events: + return True + event = self.events[0] + if isinstance(event, DocumentStartEvent): + return self.need_events(1) + elif isinstance(event, SequenceStartEvent): + return self.need_events(2) + elif isinstance(event, MappingStartEvent): + return self.need_events(3) + else: + return False + + def need_events(self, count): + level = 0 + for event in self.events[1:]: + if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): + level += 1 + elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): + level -= 1 + elif isinstance(event, StreamEndEvent): + level = -1 + if level < 0: + return False + return (len(self.events) < count+1) + + def increase_indent(self, flow=False, indentless=False): + self.indents.append(self.indent) + if self.indent is None: + if flow: + self.indent = self.best_indent + else: + self.indent = 0 + elif not indentless: + self.indent += self.best_indent + + # States. + + # Stream handlers. + + def expect_stream_start(self): + if isinstance(self.event, StreamStartEvent): + if self.event.encoding and not hasattr(self.stream, 'encoding'): + self.encoding = self.event.encoding + self.write_stream_start() + self.state = self.expect_first_document_start + else: + raise EmitterError("expected StreamStartEvent, but got %s" + % self.event) + + def expect_nothing(self): + raise EmitterError("expected nothing, but got %s" % self.event) + + # Document handlers. + + def expect_first_document_start(self): + return self.expect_document_start(first=True) + + def expect_document_start(self, first=False): + if isinstance(self.event, DocumentStartEvent): + if (self.event.version or self.event.tags) and self.open_ended: + self.write_indicator('...', True) + self.write_indent() + if self.event.version: + version_text = self.prepare_version(self.event.version) + self.write_version_directive(version_text) + self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() + if self.event.tags: + handles = sorted(self.event.tags.keys()) + for handle in handles: + prefix = self.event.tags[handle] + self.tag_prefixes[prefix] = handle + handle_text = self.prepare_tag_handle(handle) + prefix_text = self.prepare_tag_prefix(prefix) + self.write_tag_directive(handle_text, prefix_text) + implicit = (first and not self.event.explicit and not self.canonical + and not self.event.version and not self.event.tags + and not self.check_empty_document()) + if not implicit: + self.write_indent() + self.write_indicator('---', True) + if self.canonical: + self.write_indent() + self.state = self.expect_document_root + elif isinstance(self.event, StreamEndEvent): + if self.open_ended: + self.write_indicator('...', True) + self.write_indent() + self.write_stream_end() + self.state = self.expect_nothing + else: + raise EmitterError("expected DocumentStartEvent, but got %s" + % self.event) + + def expect_document_end(self): + if isinstance(self.event, DocumentEndEvent): + self.write_indent() + if self.event.explicit: + self.write_indicator('...', True) + self.write_indent() + self.flush_stream() + self.state = self.expect_document_start + else: + raise EmitterError("expected DocumentEndEvent, but got %s" + % self.event) + + def expect_document_root(self): + self.states.append(self.expect_document_end) + self.expect_node(root=True) + + # Node handlers. + + def expect_node(self, root=False, sequence=False, mapping=False, + simple_key=False): + self.root_context = root + self.sequence_context = sequence + self.mapping_context = mapping + self.simple_key_context = simple_key + if isinstance(self.event, AliasEvent): + self.expect_alias() + elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): + self.process_anchor('&') + self.process_tag() + if isinstance(self.event, ScalarEvent): + self.expect_scalar() + elif isinstance(self.event, SequenceStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_sequence(): + self.expect_flow_sequence() + else: + self.expect_block_sequence() + elif isinstance(self.event, MappingStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_mapping(): + self.expect_flow_mapping() + else: + self.expect_block_mapping() + else: + raise EmitterError("expected NodeEvent, but got %s" % self.event) + + def expect_alias(self): + if self.event.anchor is None: + raise EmitterError("anchor is not specified for alias") + self.process_anchor('*') + self.state = self.states.pop() + + def expect_scalar(self): + self.increase_indent(flow=True) + self.process_scalar() + self.indent = self.indents.pop() + self.state = self.states.pop() + + # Flow sequence handlers. + + def expect_flow_sequence(self): + self.write_indicator('[', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_sequence_item + + def expect_first_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(']', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + def expect_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator(']', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + # Flow mapping handlers. + + def expect_flow_mapping(self): + self.write_indicator('{', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_mapping_key + + def expect_first_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator('}', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator('}', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + def expect_flow_mapping_value(self): + if self.canonical or self.column > self.best_width: + self.write_indent() + self.write_indicator(':', True) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + # Block sequence handlers. + + def expect_block_sequence(self): + indentless = (self.mapping_context and not self.indention) + self.increase_indent(flow=False, indentless=indentless) + self.state = self.expect_first_block_sequence_item + + def expect_first_block_sequence_item(self): + return self.expect_block_sequence_item(first=True) + + def expect_block_sequence_item(self, first=False): + if not first and isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + self.write_indicator('-', True, indention=True) + self.states.append(self.expect_block_sequence_item) + self.expect_node(sequence=True) + + # Block mapping handlers. + + def expect_block_mapping(self): + self.increase_indent(flow=False) + self.state = self.expect_first_block_mapping_key + + def expect_first_block_mapping_key(self): + return self.expect_block_mapping_key(first=True) + + def expect_block_mapping_key(self, first=False): + if not first and isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + if self.check_simple_key(): + self.states.append(self.expect_block_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True, indention=True) + self.states.append(self.expect_block_mapping_value) + self.expect_node(mapping=True) + + def expect_block_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + def expect_block_mapping_value(self): + self.write_indent() + self.write_indicator(':', True, indention=True) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + # Checkers. + + def check_empty_sequence(self): + return (isinstance(self.event, SequenceStartEvent) and self.events + and isinstance(self.events[0], SequenceEndEvent)) + + def check_empty_mapping(self): + return (isinstance(self.event, MappingStartEvent) and self.events + and isinstance(self.events[0], MappingEndEvent)) + + def check_empty_document(self): + if not isinstance(self.event, DocumentStartEvent) or not self.events: + return False + event = self.events[0] + return (isinstance(event, ScalarEvent) and event.anchor is None + and event.tag is None and event.implicit and event.value == '') + + def check_simple_key(self): + length = 0 + if isinstance(self.event, NodeEvent) and self.event.anchor is not None: + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + length += len(self.prepared_anchor) + if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ + and self.event.tag is not None: + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(self.event.tag) + length += len(self.prepared_tag) + if isinstance(self.event, ScalarEvent): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + length += len(self.analysis.scalar) + return (length < 128 and (isinstance(self.event, AliasEvent) + or (isinstance(self.event, ScalarEvent) + and not self.analysis.empty and not self.analysis.multiline) + or self.check_empty_sequence() or self.check_empty_mapping())) + + # Anchor, Tag, and Scalar processors. + + def process_anchor(self, indicator): + if self.event.anchor is None: + self.prepared_anchor = None + return + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + if self.prepared_anchor: + self.write_indicator(indicator+self.prepared_anchor, True) + self.prepared_anchor = None + + def process_tag(self): + tag = self.event.tag + if isinstance(self.event, ScalarEvent): + if self.style is None: + self.style = self.choose_scalar_style() + if ((not self.canonical or tag is None) and + ((self.style == '' and self.event.implicit[0]) + or (self.style != '' and self.event.implicit[1]))): + self.prepared_tag = None + return + if self.event.implicit[0] and tag is None: + tag = '!' + self.prepared_tag = None + else: + if (not self.canonical or tag is None) and self.event.implicit: + self.prepared_tag = None + return + if tag is None: + raise EmitterError("tag is not specified") + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(tag) + if self.prepared_tag: + self.write_indicator(self.prepared_tag, True) + self.prepared_tag = None + + def choose_scalar_style(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.event.style == '"' or self.canonical: + return '"' + if not self.event.style and self.event.implicit[0]: + if (not (self.simple_key_context and + (self.analysis.empty or self.analysis.multiline)) + and (self.flow_level and self.analysis.allow_flow_plain + or (not self.flow_level and self.analysis.allow_block_plain))): + return '' + if self.event.style and self.event.style in '|>': + if (not self.flow_level and not self.simple_key_context + and self.analysis.allow_block): + return self.event.style + if not self.event.style or self.event.style == '\'': + if (self.analysis.allow_single_quoted and + not (self.simple_key_context and self.analysis.multiline)): + return '\'' + return '"' + + def process_scalar(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.style is None: + self.style = self.choose_scalar_style() + split = (not self.simple_key_context) + #if self.analysis.multiline and split \ + # and (not self.style or self.style in '\'\"'): + # self.write_indent() + if self.style == '"': + self.write_double_quoted(self.analysis.scalar, split) + elif self.style == '\'': + self.write_single_quoted(self.analysis.scalar, split) + elif self.style == '>': + self.write_folded(self.analysis.scalar) + elif self.style == '|': + self.write_literal(self.analysis.scalar) + else: + self.write_plain(self.analysis.scalar, split) + self.analysis = None + self.style = None + + # Analyzers. + + def prepare_version(self, version): + major, minor = version + if major != 1: + raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) + return '%d.%d' % (major, minor) + + def prepare_tag_handle(self, handle): + if not handle: + raise EmitterError("tag handle must not be empty") + if handle[0] != '!' or handle[-1] != '!': + raise EmitterError("tag handle must start and end with '!': %r" % handle) + for ch in handle[1:-1]: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the tag handle: %r" + % (ch, handle)) + return handle + + def prepare_tag_prefix(self, prefix): + if not prefix: + raise EmitterError("tag prefix must not be empty") + chunks = [] + start = end = 0 + if prefix[0] == '!': + end = 1 + while end < len(prefix): + ch = prefix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?!:@&=+$,_.~*\'()[]': + end += 1 + else: + if start < end: + chunks.append(prefix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(prefix[start:end]) + return ''.join(chunks) + + def prepare_tag(self, tag): + if not tag: + raise EmitterError("tag must not be empty") + if tag == '!': + return tag + handle = None + suffix = tag + prefixes = sorted(self.tag_prefixes.keys()) + for prefix in prefixes: + if tag.startswith(prefix) \ + and (prefix == '!' or len(prefix) < len(tag)): + handle = self.tag_prefixes[prefix] + suffix = tag[len(prefix):] + chunks = [] + start = end = 0 + while end < len(suffix): + ch = suffix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.~*\'()[]' \ + or (ch == '!' and handle != '!'): + end += 1 + else: + if start < end: + chunks.append(suffix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ch) + if start < end: + chunks.append(suffix[start:end]) + suffix_text = ''.join(chunks) + if handle: + return '%s%s' % (handle, suffix_text) + else: + return '!<%s>' % suffix_text + + def prepare_anchor(self, anchor): + if not anchor: + raise EmitterError("anchor must not be empty") + for ch in anchor: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the anchor: %r" + % (ch, anchor)) + return anchor + + def analyze_scalar(self, scalar): + + # Empty scalar is a special case. + if not scalar: + return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, + allow_flow_plain=False, allow_block_plain=True, + allow_single_quoted=True, allow_double_quoted=True, + allow_block=False) + + # Indicators and special characters. + block_indicators = False + flow_indicators = False + line_breaks = False + special_characters = False + + # Important whitespace combinations. + leading_space = False + leading_break = False + trailing_space = False + trailing_break = False + break_space = False + space_break = False + + # Check document indicators. + if scalar.startswith('---') or scalar.startswith('...'): + block_indicators = True + flow_indicators = True + + # First character or preceded by a whitespace. + preceded_by_whitespace = True + + # Last character or followed by a whitespace. + followed_by_whitespace = (len(scalar) == 1 or + scalar[1] in '\0 \t\r\n\x85\u2028\u2029') + + # The previous character is a space. + previous_space = False + + # The previous character is a break. + previous_break = False + + index = 0 + while index < len(scalar): + ch = scalar[index] + + # Check for indicators. + if index == 0: + # Leading indicators are special characters. + if ch in '#,[]{}&*!|>\'\"%@`': + flow_indicators = True + block_indicators = True + if ch in '?:': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '-' and followed_by_whitespace: + flow_indicators = True + block_indicators = True + else: + # Some indicators cannot appear within a scalar as well. + if ch in ',?[]{}': + flow_indicators = True + if ch == ':': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '#' and preceded_by_whitespace: + flow_indicators = True + block_indicators = True + + # Check for line breaks, special, and unicode characters. + if ch in '\n\x85\u2028\u2029': + line_breaks = True + if not (ch == '\n' or '\x20' <= ch <= '\x7E'): + if (ch == '\x85' or '\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD' + or '\U00010000' <= ch < '\U0010ffff') and ch != '\uFEFF': + unicode_characters = True + if not self.allow_unicode: + special_characters = True + else: + special_characters = True + + # Detect important whitespace combinations. + if ch == ' ': + if index == 0: + leading_space = True + if index == len(scalar)-1: + trailing_space = True + if previous_break: + break_space = True + previous_space = True + previous_break = False + elif ch in '\n\x85\u2028\u2029': + if index == 0: + leading_break = True + if index == len(scalar)-1: + trailing_break = True + if previous_space: + space_break = True + previous_space = False + previous_break = True + else: + previous_space = False + previous_break = False + + # Prepare for the next character. + index += 1 + preceded_by_whitespace = (ch in '\0 \t\r\n\x85\u2028\u2029') + followed_by_whitespace = (index+1 >= len(scalar) or + scalar[index+1] in '\0 \t\r\n\x85\u2028\u2029') + + # Let's decide what styles are allowed. + allow_flow_plain = True + allow_block_plain = True + allow_single_quoted = True + allow_double_quoted = True + allow_block = True + + # Leading and trailing whitespaces are bad for plain scalars. + if (leading_space or leading_break + or trailing_space or trailing_break): + allow_flow_plain = allow_block_plain = False + + # We do not permit trailing spaces for block scalars. + if trailing_space: + allow_block = False + + # Spaces at the beginning of a new line are only acceptable for block + # scalars. + if break_space: + allow_flow_plain = allow_block_plain = allow_single_quoted = False + + # Spaces followed by breaks, as well as special character are only + # allowed for double quoted scalars. + if space_break or special_characters: + allow_flow_plain = allow_block_plain = \ + allow_single_quoted = allow_block = False + + # Although the plain scalar writer supports breaks, we never emit + # multiline plain scalars. + if line_breaks: + allow_flow_plain = allow_block_plain = False + + # Flow indicators are forbidden for flow plain scalars. + if flow_indicators: + allow_flow_plain = False + + # Block indicators are forbidden for block plain scalars. + if block_indicators: + allow_block_plain = False + + return ScalarAnalysis(scalar=scalar, + empty=False, multiline=line_breaks, + allow_flow_plain=allow_flow_plain, + allow_block_plain=allow_block_plain, + allow_single_quoted=allow_single_quoted, + allow_double_quoted=allow_double_quoted, + allow_block=allow_block) + + # Writers. + + def flush_stream(self): + if hasattr(self.stream, 'flush'): + self.stream.flush() + + def write_stream_start(self): + # Write BOM if needed. + if self.encoding and self.encoding.startswith('utf-16'): + self.stream.write('\uFEFF'.encode(self.encoding)) + + def write_stream_end(self): + self.flush_stream() + + def write_indicator(self, indicator, need_whitespace, + whitespace=False, indention=False): + if self.whitespace or not need_whitespace: + data = indicator + else: + data = ' '+indicator + self.whitespace = whitespace + self.indention = self.indention and indention + self.column += len(data) + self.open_ended = False + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_indent(self): + indent = self.indent or 0 + if not self.indention or self.column > indent \ + or (self.column == indent and not self.whitespace): + self.write_line_break() + if self.column < indent: + self.whitespace = True + data = ' '*(indent-self.column) + self.column = indent + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_line_break(self, data=None): + if data is None: + data = self.best_line_break + self.whitespace = True + self.indention = True + self.line += 1 + self.column = 0 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_version_directive(self, version_text): + data = '%%YAML %s' % version_text + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + def write_tag_directive(self, handle_text, prefix_text): + data = '%%TAG %s %s' % (handle_text, prefix_text) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + # Scalar streams. + + def write_single_quoted(self, text, split=True): + self.write_indicator('\'', True) + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch is None or ch != ' ': + if start+1 == end and self.column > self.best_width and split \ + and start != 0 and end != len(text): + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029' or ch == '\'': + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch == '\'': + data = '\'\'' + self.column += 2 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + 1 + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + self.write_indicator('\'', False) + + ESCAPE_REPLACEMENTS = { + '\0': '0', + '\x07': 'a', + '\x08': 'b', + '\x09': 't', + '\x0A': 'n', + '\x0B': 'v', + '\x0C': 'f', + '\x0D': 'r', + '\x1B': 'e', + '\"': '\"', + '\\': '\\', + '\x85': 'N', + '\xA0': '_', + '\u2028': 'L', + '\u2029': 'P', + } + + def write_double_quoted(self, text, split=True): + self.write_indicator('"', True) + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if ch is None or ch in '"\\\x85\u2028\u2029\uFEFF' \ + or not ('\x20' <= ch <= '\x7E' + or (self.allow_unicode + and ('\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD'))): + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + if ch in self.ESCAPE_REPLACEMENTS: + data = '\\'+self.ESCAPE_REPLACEMENTS[ch] + elif ch <= '\xFF': + data = '\\x%02X' % ord(ch) + elif ch <= '\uFFFF': + data = '\\u%04X' % ord(ch) + else: + data = '\\U%08X' % ord(ch) + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end+1 + if 0 < end < len(text)-1 and (ch == ' ' or start >= end) \ + and self.column+(end-start) > self.best_width and split: + data = text[start:end]+'\\' + if start < end: + start = end + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_indent() + self.whitespace = False + self.indention = False + if text[start] == ' ': + data = '\\' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + end += 1 + self.write_indicator('"', False) + + def determine_block_hints(self, text): + hints = '' + if text: + if text[0] in ' \n\x85\u2028\u2029': + hints += str(self.best_indent) + if text[-1] not in '\n\x85\u2028\u2029': + hints += '-' + elif len(text) == 1 or text[-2] in '\n\x85\u2028\u2029': + hints += '+' + return hints + + def write_folded(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('>'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + leading_space = True + spaces = False + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if not leading_space and ch is not None and ch != ' ' \ + and text[start] == '\n': + self.write_line_break() + leading_space = (ch == ' ') + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + elif spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width: + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + spaces = (ch == ' ') + end += 1 + + def write_literal(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('|'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + else: + if ch is None or ch in '\n\x85\u2028\u2029': + data = text[start:end] + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + + def write_plain(self, text, split=True): + if self.root_context: + self.open_ended = True + if not text: + return + if not self.whitespace: + data = ' ' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.whitespace = False + self.indention = False + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width and split: + self.write_indent() + self.whitespace = False + self.indention = False + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + self.whitespace = False + self.indention = False + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/error.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/error.py new file mode 100644 index 00000000..b796b4dc --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/error.py @@ -0,0 +1,75 @@ + +__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] + +class Mark: + + def __init__(self, name, index, line, column, buffer, pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start-1] not in '\0\r\n\x85\u2028\u2029': + start -= 1 + if self.pointer-start > max_length/2-1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in '\0\r\n\x85\u2028\u2029': + end += 1 + if end-self.pointer > max_length/2-1: + tail = ' ... ' + end -= 5 + break + snippet = self.buffer[start:end] + return ' '*indent + head + snippet + tail + '\n' \ + + ' '*(indent+self.pointer-start+len(head)) + '^' + + def __str__(self): + snippet = self.get_snippet() + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + if snippet is not None: + where += ":\n"+snippet + return where + +class YAMLError(Exception): + pass + +class MarkedYAMLError(YAMLError): + + def __init__(self, context=None, context_mark=None, + problem=None, problem_mark=None, note=None): + self.context = context + self.context_mark = context_mark + self.problem = problem + self.problem_mark = problem_mark + self.note = note + + def __str__(self): + lines = [] + if self.context is not None: + lines.append(self.context) + if self.context_mark is not None \ + and (self.problem is None or self.problem_mark is None + or self.context_mark.name != self.problem_mark.name + or self.context_mark.line != self.problem_mark.line + or self.context_mark.column != self.problem_mark.column): + lines.append(str(self.context_mark)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_mark is not None: + lines.append(str(self.problem_mark)) + if self.note is not None: + lines.append(self.note) + return '\n'.join(lines) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/events.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/events.py new file mode 100644 index 00000000..f79ad389 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/events.py @@ -0,0 +1,86 @@ + +# Abstract classes. + +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] + if hasattr(self, key)] + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +class NodeEvent(Event): + def __init__(self, anchor, start_mark=None, end_mark=None): + self.anchor = anchor + self.start_mark = start_mark + self.end_mark = end_mark + +class CollectionStartEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, + flow_style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class CollectionEndEvent(Event): + pass + +# Implementations. + +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndEvent(Event): + pass + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + +class AliasEvent(NodeEvent): + pass + +class ScalarEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, value, + start_mark=None, end_mark=None, style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class SequenceStartEvent(CollectionStartEvent): + pass + +class SequenceEndEvent(CollectionEndEvent): + pass + +class MappingStartEvent(CollectionStartEvent): + pass + +class MappingEndEvent(CollectionEndEvent): + pass + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/loader.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/loader.py new file mode 100644 index 00000000..e90c1122 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/loader.py @@ -0,0 +1,63 @@ + +__all__ = ['BaseLoader', 'FullLoader', 'SafeLoader', 'Loader', 'UnsafeLoader'] + +from .reader import * +from .scanner import * +from .parser import * +from .composer import * +from .constructor import * +from .resolver import * + +class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class FullLoader(Reader, Scanner, Parser, Composer, FullConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + FullConstructor.__init__(self) + Resolver.__init__(self) + +class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + +# UnsafeLoader is the same as Loader (which is and was always unsafe on +# untrusted input). Use of either Loader or UnsafeLoader should be rare, since +# FullLoad should be able to load almost all YAML safely. Loader is left intact +# to ensure backwards compatibility. +class UnsafeLoader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/nodes.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/nodes.py new file mode 100644 index 00000000..c4f070c4 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/nodes.py @@ -0,0 +1,49 @@ + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + value = self.value + #if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + #else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + +class ScalarNode(Node): + id = 'scalar' + def __init__(self, tag, value, + start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class CollectionNode(Node): + def __init__(self, tag, value, + start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class SequenceNode(CollectionNode): + id = 'sequence' + +class MappingNode(CollectionNode): + id = 'mapping' + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/parser.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/parser.py new file mode 100644 index 00000000..13a5995d --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/parser.py @@ -0,0 +1,589 @@ + +# The following YAML grammar is LL(1) and is parsed by a recursive descent +# parser. +# +# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +# implicit_document ::= block_node DOCUMENT-END* +# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +# block_node_or_indentless_sequence ::= +# ALIAS +# | properties (block_content | indentless_block_sequence)? +# | block_content +# | indentless_block_sequence +# block_node ::= ALIAS +# | properties block_content? +# | block_content +# flow_node ::= ALIAS +# | properties flow_content? +# | flow_content +# properties ::= TAG ANCHOR? | ANCHOR TAG? +# block_content ::= block_collection | flow_collection | SCALAR +# flow_content ::= flow_collection | SCALAR +# block_collection ::= block_sequence | block_mapping +# flow_collection ::= flow_sequence | flow_mapping +# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +# block_mapping ::= BLOCK-MAPPING_START +# ((KEY block_node_or_indentless_sequence?)? +# (VALUE block_node_or_indentless_sequence?)?)* +# BLOCK-END +# flow_sequence ::= FLOW-SEQUENCE-START +# (flow_sequence_entry FLOW-ENTRY)* +# flow_sequence_entry? +# FLOW-SEQUENCE-END +# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# flow_mapping ::= FLOW-MAPPING-START +# (flow_mapping_entry FLOW-ENTRY)* +# flow_mapping_entry? +# FLOW-MAPPING-END +# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# +# FIRST sets: +# +# stream: { STREAM-START } +# explicit_document: { DIRECTIVE DOCUMENT-START } +# implicit_document: FIRST(block_node) +# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_sequence: { BLOCK-SEQUENCE-START } +# block_mapping: { BLOCK-MAPPING-START } +# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } +# indentless_sequence: { ENTRY } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_sequence: { FLOW-SEQUENCE-START } +# flow_mapping: { FLOW-MAPPING-START } +# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } +# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } + +__all__ = ['Parser', 'ParserError'] + +from .error import MarkedYAMLError +from .tokens import * +from .events import * +from .scanner import * + +class ParserError(MarkedYAMLError): + pass + +class Parser: + # Since writing a recursive-descendant parser is a straightforward task, we + # do not give many comments here. + + DEFAULT_TAGS = { + '!': '!', + '!!': 'tag:yaml.org,2002:', + } + + def __init__(self): + self.current_event = None + self.yaml_version = None + self.tag_handles = {} + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + + # Parse the stream start. + token = self.get_token() + event = StreamStartEvent(token.start_mark, token.end_mark, + encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + + # Parse an implicit document. + if not self.check_token(DirectiveToken, DocumentStartToken, + StreamEndToken): + self.tag_handles = self.DEFAULT_TAGS + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_block_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + + # Parse any extra document end indicators. + while self.check_token(DocumentEndToken): + self.get_token() + + # Parse an explicit document. + if not self.check_token(StreamEndToken): + token = self.peek_token() + start_mark = token.start_mark + version, tags = self.process_directives() + if not self.check_token(DocumentStartToken): + raise ParserError(None, None, + "expected '', but found %r" + % self.peek_token().id, + self.peek_token().start_mark) + token = self.get_token() + end_mark = token.end_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=True, version=version, tags=tags) + self.states.append(self.parse_document_end) + self.state = self.parse_document_content + else: + # Parse the end of the stream. + token = self.get_token() + event = StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + if self.check_token(DocumentEndToken): + token = self.get_token() + end_mark = token.end_mark + explicit = True + event = DocumentEndEvent(start_mark, end_mark, + explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + if self.check_token(DirectiveToken, + DocumentStartToken, DocumentEndToken, StreamEndToken): + event = self.process_empty_scalar(self.peek_token().start_mark) + self.state = self.states.pop() + return event + else: + return self.parse_block_node() + + def process_directives(self): + self.yaml_version = None + self.tag_handles = {} + while self.check_token(DirectiveToken): + token = self.get_token() + if token.name == 'YAML': + if self.yaml_version is not None: + raise ParserError(None, None, + "found duplicate YAML directive", token.start_mark) + major, minor = token.value + if major != 1: + raise ParserError(None, None, + "found incompatible YAML document (version 1.* is required)", + token.start_mark) + self.yaml_version = token.value + elif token.name == 'TAG': + handle, prefix = token.value + if handle in self.tag_handles: + raise ParserError(None, None, + "duplicate tag handle %r" % handle, + token.start_mark) + self.tag_handles[handle] = prefix + if self.tag_handles: + value = self.yaml_version, self.tag_handles.copy() + else: + value = self.yaml_version, None + for key in self.DEFAULT_TAGS: + if key not in self.tag_handles: + self.tag_handles[key] = self.DEFAULT_TAGS[key] + return value + + # block_node_or_indentless_sequence ::= ALIAS + # | properties (block_content | indentless_block_sequence)? + # | block_content + # | indentless_block_sequence + # block_node ::= ALIAS + # | properties block_content? + # | block_content + # flow_node ::= ALIAS + # | properties flow_content? + # | flow_content + # properties ::= TAG ANCHOR? | ANCHOR TAG? + # block_content ::= block_collection | flow_collection | SCALAR + # flow_content ::= flow_collection | SCALAR + # block_collection ::= block_sequence | block_mapping + # flow_collection ::= flow_sequence | flow_mapping + + def parse_block_node(self): + return self.parse_node(block=True) + + def parse_flow_node(self): + return self.parse_node() + + def parse_block_node_or_indentless_sequence(self): + return self.parse_node(block=True, indentless_sequence=True) + + def parse_node(self, block=False, indentless_sequence=False): + if self.check_token(AliasToken): + token = self.get_token() + event = AliasEvent(token.value, token.start_mark, token.end_mark) + self.state = self.states.pop() + else: + anchor = None + tag = None + start_mark = end_mark = tag_mark = None + if self.check_token(AnchorToken): + token = self.get_token() + start_mark = token.start_mark + end_mark = token.end_mark + anchor = token.value + if self.check_token(TagToken): + token = self.get_token() + tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + elif self.check_token(TagToken): + token = self.get_token() + start_mark = tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + if self.check_token(AnchorToken): + token = self.get_token() + end_mark = token.end_mark + anchor = token.value + if tag is not None: + handle, suffix = tag + if handle is not None: + if handle not in self.tag_handles: + raise ParserError("while parsing a node", start_mark, + "found undefined tag handle %r" % handle, + tag_mark) + tag = self.tag_handles[handle]+suffix + else: + tag = suffix + #if tag == '!': + # raise ParserError("while parsing a node", start_mark, + # "found non-specific tag '!'", tag_mark, + # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = (tag is None or tag == '!') + if indentless_sequence and self.check_token(BlockEntryToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark) + self.state = self.parse_indentless_sequence_entry + else: + if self.check_token(ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if (token.plain and tag is None) or tag == '!': + implicit = (True, False) + elif tag is None: + implicit = (False, True) + else: + implicit = (False, False) + event = ScalarEvent(anchor, tag, implicit, token.value, + start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + elif block and self.check_token(BlockSequenceStartToken): + end_mark = self.peek_token().start_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_sequence_first_entry + elif block and self.check_token(BlockMappingStartToken): + end_mark = self.peek_token().start_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_mapping_first_key + elif anchor is not None or tag is not None: + # Empty scalars are allowed even if a tag or an anchor is + # specified. + event = ScalarEvent(anchor, tag, (implicit, False), '', + start_mark, end_mark) + self.state = self.states.pop() + else: + if block: + node = 'block' + else: + node = 'flow' + token = self.peek_token() + raise ParserError("while parsing a %s node" % node, start_mark, + "expected the node content, but found %r" % token.id, + token.start_mark) + return event + + # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + + def parse_block_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_sequence_entry() + + def parse_block_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, BlockEndToken): + self.states.append(self.parse_block_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_block_sequence_entry + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block collection", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + + def parse_indentless_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, + KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_indentless_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_indentless_sequence_entry + return self.process_empty_scalar(token.end_mark) + token = self.peek_token() + event = SequenceEndEvent(token.start_mark, token.start_mark) + self.state = self.states.pop() + return event + + # block_mapping ::= BLOCK-MAPPING_START + # ((KEY block_node_or_indentless_sequence?)? + # (VALUE block_node_or_indentless_sequence?)?)* + # BLOCK-END + + def parse_block_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_mapping_key() + + def parse_block_mapping_key(self): + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_value) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_value + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block mapping", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_block_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_key) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_block_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + # flow_sequence ::= FLOW-SEQUENCE-START + # (flow_sequence_entry FLOW-ENTRY)* + # flow_sequence_entry? + # FLOW-SEQUENCE-END + # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + # + # Note that while production rules for both flow_sequence_entry and + # flow_mapping_entry are equal, their interpretations are different. + # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + # generate an inline mapping (set syntax). + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(FlowSequenceEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow sequence", self.marks[-1], + "expected ',' or ']', but got %r" % token.id, token.start_mark) + + if self.check_token(KeyToken): + token = self.peek_token() + event = MappingStartEvent(None, None, True, + token.start_mark, token.end_mark, + flow_style=True) + self.state = self.parse_flow_sequence_entry_mapping_key + return event + elif not self.check_token(FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_flow_node() + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_key(self): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_value + return self.process_empty_scalar(token.end_mark) + + def parse_flow_sequence_entry_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_end) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_end + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_sequence_entry_mapping_end + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return MappingEndEvent(token.start_mark, token.start_mark) + + # flow_mapping ::= FLOW-MAPPING-START + # (flow_mapping_entry FLOW-ENTRY)* + # flow_mapping_entry? + # FLOW-MAPPING-END + # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(FlowMappingEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow mapping", self.marks[-1], + "expected ',' or '}', but got %r" % token.id, token.start_mark) + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_value + return self.process_empty_scalar(token.end_mark) + elif not self.check_token(FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_empty_value) + return self.parse_flow_node() + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_mapping_empty_value(self): + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(self.peek_token().start_mark) + + def process_empty_scalar(self, mark): + return ScalarEvent(None, None, (True, False), '', mark, mark) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/reader.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/reader.py new file mode 100644 index 00000000..774b0219 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/reader.py @@ -0,0 +1,185 @@ +# This module contains abstractions for the input stream. You don't have to +# looks further, there are no pretty code. +# +# We define two classes here. +# +# Mark(source, line, column) +# It's just a record and its only use is producing nice error messages. +# Parser does not use it for any other purposes. +# +# Reader(source, data) +# Reader determines the encoding of `data` and converts it to unicode. +# Reader provides the following methods and attributes: +# reader.peek(length=1) - return the next `length` characters +# reader.forward(length=1) - move the current position to `length` characters. +# reader.index - the number of the current character. +# reader.line, stream.column - the line and the column of the current character. + +__all__ = ['Reader', 'ReaderError'] + +from .error import YAMLError, Mark + +import codecs, re + +class ReaderError(YAMLError): + + def __init__(self, name, position, character, encoding, reason): + self.name = name + self.character = character + self.position = position + self.encoding = encoding + self.reason = reason + + def __str__(self): + if isinstance(self.character, bytes): + return "'%s' codec can't decode byte #x%02x: %s\n" \ + " in \"%s\", position %d" \ + % (self.encoding, ord(self.character), self.reason, + self.name, self.position) + else: + return "unacceptable character #x%04x: %s\n" \ + " in \"%s\", position %d" \ + % (self.character, self.reason, + self.name, self.position) + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to a unicode string, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a `bytes` object, + # - a `str` object, + # - a file-like object with its `read` method returning `str`, + # - a file-like object with its `read` method returning `unicode`. + + # Yeah, it's ugly and slow. + + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = '' + self.pointer = 0 + self.raw_buffer = None + self.raw_decode = None + self.encoding = None + self.index = 0 + self.line = 0 + self.column = 0 + if isinstance(stream, str): + self.name = "" + self.check_printable(stream) + self.buffer = stream+'\0' + elif isinstance(stream, bytes): + self.name = "" + self.raw_buffer = stream + self.determine_encoding() + else: + self.stream = stream + self.name = getattr(stream, 'name', "") + self.eof = False + self.raw_buffer = None + self.determine_encoding() + + def peek(self, index=0): + try: + return self.buffer[self.pointer+index] + except IndexError: + self.update(index+1) + return self.buffer[self.pointer+index] + + def prefix(self, length=1): + if self.pointer+length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer+length] + + def forward(self, length=1): + if self.pointer+length+1 >= len(self.buffer): + self.update(length+1) + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.index += 1 + if ch in '\n\x85\u2028\u2029' \ + or (ch == '\r' and self.buffer[self.pointer] != '\n'): + self.line += 1 + self.column = 0 + elif ch != '\uFEFF': + self.column += 1 + length -= 1 + + def get_mark(self): + if self.stream is None: + return Mark(self.name, self.index, self.line, self.column, + self.buffer, self.pointer) + else: + return Mark(self.name, self.index, self.line, self.column, + None, None) + + def determine_encoding(self): + while not self.eof and (self.raw_buffer is None or len(self.raw_buffer) < 2): + self.update_raw() + if isinstance(self.raw_buffer, bytes): + if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): + self.raw_decode = codecs.utf_16_le_decode + self.encoding = 'utf-16-le' + elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): + self.raw_decode = codecs.utf_16_be_decode + self.encoding = 'utf-16-be' + else: + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.update(1) + + NON_PRINTABLE = re.compile('[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD\U00010000-\U0010ffff]') + def check_printable(self, data): + match = self.NON_PRINTABLE.search(data) + if match: + character = match.group() + position = self.index+(len(self.buffer)-self.pointer)+match.start() + raise ReaderError(self.name, position, ord(character), + 'unicode', "special characters are not allowed") + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + if self.raw_decode is not None: + try: + data, converted = self.raw_decode(self.raw_buffer, + 'strict', self.eof) + except UnicodeDecodeError as exc: + character = self.raw_buffer[exc.start] + if self.stream is not None: + position = self.stream_pointer-len(self.raw_buffer)+exc.start + else: + position = exc.start + raise ReaderError(self.name, position, character, + exc.encoding, exc.reason) + else: + data = self.raw_buffer + converted = len(data) + self.check_printable(data) + self.buffer += data + self.raw_buffer = self.raw_buffer[converted:] + if self.eof: + self.buffer += '\0' + self.raw_buffer = None + break + + def update_raw(self, size=4096): + data = self.stream.read(size) + if self.raw_buffer is None: + self.raw_buffer = data + else: + self.raw_buffer += data + self.stream_pointer += len(data) + if not data: + self.eof = True diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/representer.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/representer.py new file mode 100644 index 00000000..3b0b192e --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/representer.py @@ -0,0 +1,389 @@ + +__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', + 'RepresenterError'] + +from .error import * +from .nodes import * + +import datetime, copyreg, types, base64, collections + +class RepresenterError(YAMLError): + pass + +class BaseRepresenter: + + yaml_representers = {} + yaml_multi_representers = {} + + def __init__(self, default_style=None, default_flow_style=False, sort_keys=True): + self.default_style = default_style + self.sort_keys = sort_keys + self.default_flow_style = default_flow_style + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent(self, data): + node = self.represent_data(data) + self.serialize(node) + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent_data(self, data): + if self.ignore_aliases(data): + self.alias_key = None + else: + self.alias_key = id(data) + if self.alias_key is not None: + if self.alias_key in self.represented_objects: + node = self.represented_objects[self.alias_key] + #if node is None: + # raise RepresenterError("recursive objects are not allowed: %r" % data) + return node + #self.represented_objects[alias_key] = None + self.object_keeper.append(data) + data_types = type(data).__mro__ + if data_types[0] in self.yaml_representers: + node = self.yaml_representers[data_types[0]](self, data) + else: + for data_type in data_types: + if data_type in self.yaml_multi_representers: + node = self.yaml_multi_representers[data_type](self, data) + break + else: + if None in self.yaml_multi_representers: + node = self.yaml_multi_representers[None](self, data) + elif None in self.yaml_representers: + node = self.yaml_representers[None](self, data) + else: + node = ScalarNode(None, str(data)) + #if alias_key is not None: + # self.represented_objects[alias_key] = node + return node + + @classmethod + def add_representer(cls, data_type, representer): + if not 'yaml_representers' in cls.__dict__: + cls.yaml_representers = cls.yaml_representers.copy() + cls.yaml_representers[data_type] = representer + + @classmethod + def add_multi_representer(cls, data_type, representer): + if not 'yaml_multi_representers' in cls.__dict__: + cls.yaml_multi_representers = cls.yaml_multi_representers.copy() + cls.yaml_multi_representers[data_type] = representer + + def represent_scalar(self, tag, value, style=None): + if style is None: + style = self.default_style + node = ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node + + def represent_sequence(self, tag, sequence, flow_style=None): + value = [] + node = SequenceNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + for item in sequence: + node_item = self.represent_data(item) + if not (isinstance(node_item, ScalarNode) and not node_item.style): + best_style = False + value.append(node_item) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = list(mapping.items()) + if self.sort_keys: + try: + mapping = sorted(mapping) + except TypeError: + pass + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def ignore_aliases(self, data): + return False + +class SafeRepresenter(BaseRepresenter): + + def ignore_aliases(self, data): + if data is None: + return True + if isinstance(data, tuple) and data == (): + return True + if isinstance(data, (str, bytes, bool, int, float)): + return True + + def represent_none(self, data): + return self.represent_scalar('tag:yaml.org,2002:null', 'null') + + def represent_str(self, data): + return self.represent_scalar('tag:yaml.org,2002:str', data) + + def represent_binary(self, data): + if hasattr(base64, 'encodebytes'): + data = base64.encodebytes(data).decode('ascii') + else: + data = base64.encodestring(data).decode('ascii') + return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') + + def represent_bool(self, data): + if data: + value = 'true' + else: + value = 'false' + return self.represent_scalar('tag:yaml.org,2002:bool', value) + + def represent_int(self, data): + return self.represent_scalar('tag:yaml.org,2002:int', str(data)) + + inf_value = 1e300 + while repr(inf_value) != repr(inf_value*inf_value): + inf_value *= inf_value + + def represent_float(self, data): + if data != data or (data == 0.0 and data == 1.0): + value = '.nan' + elif data == self.inf_value: + value = '.inf' + elif data == -self.inf_value: + value = '-.inf' + else: + value = repr(data).lower() + # Note that in some cases `repr(data)` represents a float number + # without the decimal parts. For instance: + # >>> repr(1e17) + # '1e17' + # Unfortunately, this is not a valid float representation according + # to the definition of the `!!float` tag. We fix this by adding + # '.0' before the 'e' symbol. + if '.' not in value and 'e' in value: + value = value.replace('e', '.0e', 1) + return self.represent_scalar('tag:yaml.org,2002:float', value) + + def represent_list(self, data): + #pairs = (len(data) > 0 and isinstance(data, list)) + #if pairs: + # for item in data: + # if not isinstance(item, tuple) or len(item) != 2: + # pairs = False + # break + #if not pairs: + return self.represent_sequence('tag:yaml.org,2002:seq', data) + #value = [] + #for item_key, item_value in data: + # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', + # [(item_key, item_value)])) + #return SequenceNode(u'tag:yaml.org,2002:pairs', value) + + def represent_dict(self, data): + return self.represent_mapping('tag:yaml.org,2002:map', data) + + def represent_set(self, data): + value = {} + for key in data: + value[key] = None + return self.represent_mapping('tag:yaml.org,2002:set', value) + + def represent_date(self, data): + value = data.isoformat() + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_datetime(self, data): + value = data.isoformat(' ') + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_yaml_object(self, tag, data, cls, flow_style=None): + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__.copy() + return self.represent_mapping(tag, state, flow_style=flow_style) + + def represent_undefined(self, data): + raise RepresenterError("cannot represent an object", data) + +SafeRepresenter.add_representer(type(None), + SafeRepresenter.represent_none) + +SafeRepresenter.add_representer(str, + SafeRepresenter.represent_str) + +SafeRepresenter.add_representer(bytes, + SafeRepresenter.represent_binary) + +SafeRepresenter.add_representer(bool, + SafeRepresenter.represent_bool) + +SafeRepresenter.add_representer(int, + SafeRepresenter.represent_int) + +SafeRepresenter.add_representer(float, + SafeRepresenter.represent_float) + +SafeRepresenter.add_representer(list, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(tuple, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(dict, + SafeRepresenter.represent_dict) + +SafeRepresenter.add_representer(set, + SafeRepresenter.represent_set) + +SafeRepresenter.add_representer(datetime.date, + SafeRepresenter.represent_date) + +SafeRepresenter.add_representer(datetime.datetime, + SafeRepresenter.represent_datetime) + +SafeRepresenter.add_representer(None, + SafeRepresenter.represent_undefined) + +class Representer(SafeRepresenter): + + def represent_complex(self, data): + if data.imag == 0.0: + data = '%r' % data.real + elif data.real == 0.0: + data = '%rj' % data.imag + elif data.imag > 0: + data = '%r+%rj' % (data.real, data.imag) + else: + data = '%r%rj' % (data.real, data.imag) + return self.represent_scalar('tag:yaml.org,2002:python/complex', data) + + def represent_tuple(self, data): + return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) + + def represent_name(self, data): + name = '%s.%s' % (data.__module__, data.__name__) + return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') + + def represent_module(self, data): + return self.represent_scalar( + 'tag:yaml.org,2002:python/module:'+data.__name__, '') + + def represent_object(self, data): + # We use __reduce__ API to save the data. data.__reduce__ returns + # a tuple of length 2-5: + # (function, args, state, listitems, dictitems) + + # For reconstructing, we calls function(*args), then set its state, + # listitems, and dictitems if they are not None. + + # A special case is when function.__name__ == '__newobj__'. In this + # case we create the object with args[0].__new__(*args). + + # Another special case is when __reduce__ returns a string - we don't + # support it. + + # We produce a !!python/object, !!python/object/new or + # !!python/object/apply node. + + cls = type(data) + if cls in copyreg.dispatch_table: + reduce = copyreg.dispatch_table[cls](data) + elif hasattr(data, '__reduce_ex__'): + reduce = data.__reduce_ex__(2) + elif hasattr(data, '__reduce__'): + reduce = data.__reduce__() + else: + raise RepresenterError("cannot represent an object", data) + reduce = (list(reduce)+[None]*5)[:5] + function, args, state, listitems, dictitems = reduce + args = list(args) + if state is None: + state = {} + if listitems is not None: + listitems = list(listitems) + if dictitems is not None: + dictitems = dict(dictitems) + if function.__name__ == '__newobj__': + function = args[0] + args = args[1:] + tag = 'tag:yaml.org,2002:python/object/new:' + newobj = True + else: + tag = 'tag:yaml.org,2002:python/object/apply:' + newobj = False + function_name = '%s.%s' % (function.__module__, function.__name__) + if not args and not listitems and not dictitems \ + and isinstance(state, dict) and newobj: + return self.represent_mapping( + 'tag:yaml.org,2002:python/object:'+function_name, state) + if not listitems and not dictitems \ + and isinstance(state, dict) and not state: + return self.represent_sequence(tag+function_name, args) + value = {} + if args: + value['args'] = args + if state or not isinstance(state, dict): + value['state'] = state + if listitems: + value['listitems'] = listitems + if dictitems: + value['dictitems'] = dictitems + return self.represent_mapping(tag+function_name, value) + + def represent_ordered_dict(self, data): + # Provide uniform representation across different Python versions. + data_type = type(data) + tag = 'tag:yaml.org,2002:python/object/apply:%s.%s' \ + % (data_type.__module__, data_type.__name__) + items = [[key, value] for key, value in data.items()] + return self.represent_sequence(tag, [items]) + +Representer.add_representer(complex, + Representer.represent_complex) + +Representer.add_representer(tuple, + Representer.represent_tuple) + +Representer.add_representer(type, + Representer.represent_name) + +Representer.add_representer(collections.OrderedDict, + Representer.represent_ordered_dict) + +Representer.add_representer(types.FunctionType, + Representer.represent_name) + +Representer.add_representer(types.BuiltinFunctionType, + Representer.represent_name) + +Representer.add_representer(types.ModuleType, + Representer.represent_module) + +Representer.add_multi_representer(object, + Representer.represent_object) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/resolver.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/resolver.py new file mode 100644 index 00000000..013896d2 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/resolver.py @@ -0,0 +1,227 @@ + +__all__ = ['BaseResolver', 'Resolver'] + +from .error import * +from .nodes import * + +import re + +class ResolverError(YAMLError): + pass + +class BaseResolver: + + DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + @classmethod + def add_implicit_resolver(cls, tag, regexp, first): + if not 'yaml_implicit_resolvers' in cls.__dict__: + implicit_resolvers = {} + for key in cls.yaml_implicit_resolvers: + implicit_resolvers[key] = cls.yaml_implicit_resolvers[key][:] + cls.yaml_implicit_resolvers = implicit_resolvers + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + + @classmethod + def add_path_resolver(cls, tag, path, kind=None): + # Note: `add_path_resolver` is experimental. The API could be changed. + # `new_path` is a pattern that is matched against the path from the + # root to the node that is being considered. `node_path` elements are + # tuples `(node_check, index_check)`. `node_check` is a node class: + # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` + # matches any kind of a node. `index_check` could be `None`, a boolean + # value, a string value, or a number. `None` and `False` match against + # any _value_ of sequence and mapping nodes. `True` matches against + # any _key_ of a mapping node. A string `index_check` matches against + # a mapping value that corresponds to a scalar key which content is + # equal to the `index_check` value. An integer `index_check` matches + # against a sequence value with the index equal to `index_check`. + if not 'yaml_path_resolvers' in cls.__dict__: + cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() + new_path = [] + for element in path: + if isinstance(element, (list, tuple)): + if len(element) == 2: + node_check, index_check = element + elif len(element) == 1: + node_check = element[0] + index_check = True + else: + raise ResolverError("Invalid path element: %s" % element) + else: + node_check = None + index_check = element + if node_check is str: + node_check = ScalarNode + elif node_check is list: + node_check = SequenceNode + elif node_check is dict: + node_check = MappingNode + elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ + and not isinstance(node_check, str) \ + and node_check is not None: + raise ResolverError("Invalid node checker: %s" % node_check) + if not isinstance(index_check, (str, int)) \ + and index_check is not None: + raise ResolverError("Invalid index checker: %s" % index_check) + new_path.append((node_check, index_check)) + if kind is str: + kind = ScalarNode + elif kind is list: + kind = SequenceNode + elif kind is dict: + kind = MappingNode + elif kind not in [ScalarNode, SequenceNode, MappingNode] \ + and kind is not None: + raise ResolverError("Invalid node kind: %s" % kind) + cls.yaml_path_resolvers[tuple(new_path), kind] = tag + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, + current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, + current_node, current_index): + node_check, index_check = path[depth-1] + if isinstance(node_check, str): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if (index_check is False or index_check is None) \ + and current_index is None: + return + if isinstance(index_check, str): + if not (isinstance(current_index, ScalarNode) + and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit): + if kind is ScalarNode and implicit[0]: + if value == '': + resolvers = self.yaml_implicit_resolvers.get('', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + wildcard_resolvers = self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers + wildcard_resolvers: + if regexp.match(value): + return tag + implicit = implicit[1] + if self.yaml_path_resolvers: + exact_paths = self.resolver_exact_paths[-1] + if kind in exact_paths: + return exact_paths[kind] + if None in exact_paths: + return exact_paths[None] + if kind is ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is MappingNode: + return self.DEFAULT_MAPPING_TAG + +class Resolver(BaseResolver): + pass + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:bool', + re.compile(r'''^(?:yes|Yes|YES|no|No|NO + |true|True|TRUE|false|False|FALSE + |on|On|ON|off|Off|OFF)$''', re.X), + list('yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:float', + re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? + |\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* + |[-+]?\.(?:inf|Inf|INF) + |\.(?:nan|NaN|NAN))$''', re.X), + list('-+0123456789.')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:int', + re.compile(r'''^(?:[-+]?0b[0-1_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list('-+0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:merge', + re.compile(r'^(?:<<)$'), + ['<']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:null', + re.compile(r'''^(?: ~ + |null|Null|NULL + | )$''', re.X), + ['~', 'n', 'N', '']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:timestamp', + re.compile(r'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? + (?:[Tt]|[ \t]+)[0-9][0-9]? + :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? + (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), + list('0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:value', + re.compile(r'^(?:=)$'), + ['=']) + +# The following resolver is only for documentation purposes. It cannot work +# because plain scalars cannot start with '!', '&', or '*'. +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:yaml', + re.compile(r'^(?:!|&|\*)$'), + list('!&*')) + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/scanner.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/scanner.py new file mode 100644 index 00000000..7437ede1 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/scanner.py @@ -0,0 +1,1435 @@ + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DIRECTIVE(name, value) +# DOCUMENT-START +# DOCUMENT-END +# BLOCK-SEQUENCE-START +# BLOCK-MAPPING-START +# BLOCK-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# BLOCK-ENTRY +# FLOW-ENTRY +# KEY +# VALUE +# ALIAS(value) +# ANCHOR(value) +# TAG(value) +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. +# + +__all__ = ['Scanner', 'ScannerError'] + +from .error import MarkedYAMLError +from .tokens import * + +class ScannerError(MarkedYAMLError): + pass + +class SimpleKey: + # See below simple keys treatment. + + def __init__(self, token_number, required, index, line, column, mark): + self.token_number = token_number + self.required = required + self.index = index + self.line = line + self.column = column + self.mark = mark + +class Scanner: + + def __init__(self): + """Initialize the scanner.""" + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # The current indentation level. + self.indent = -1 + + # Past indentation levels. + self.indents = [] + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # Example of simple keys: + # --- + # block simple key: value + # ? not a simple key: + # : { flow simple key: value } + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line and 1024 characters. + + # Can a simple key start at the current position? A simple key may + # start: + # - at the beginning of the line, not counting indentation spaces + # (in block context), + # - after '{', '[', ',' (in the flow context), + # - after '?', ':', '-' (in the block context). + # In the block context, this flag also signifies if a block collection + # may start at the current position. + self.allow_simple_key = True + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, required, index, line, column, mark) + # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), + # '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + # Return None if no more tokens. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + else: + return None + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Compare the current indentation and column. It may add some tokens + # and decrease the current indentation level. + self.unwind_indent(self.column) + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == '\0': + return self.fetch_stream_end() + + # Is it a directive? + if ch == '%' and self.check_directive(): + return self.fetch_directive() + + # Is it the document start? + if ch == '-' and self.check_document_start(): + return self.fetch_document_start() + + # Is it the document end? + if ch == '.' and self.check_document_end(): + return self.fetch_document_end() + + # TODO: support for BOM within a stream. + #if ch == '\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == '[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == '{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == ']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == '}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == ',': + return self.fetch_flow_entry() + + # Is it the block entry indicator? + if ch == '-' and self.check_block_entry(): + return self.fetch_block_entry() + + # Is it the key indicator? + if ch == '?' and self.check_key(): + return self.fetch_key() + + # Is it the value indicator? + if ch == ':' and self.check_value(): + return self.fetch_value() + + # Is it an alias? + if ch == '*': + return self.fetch_alias() + + # Is it an anchor? + if ch == '&': + return self.fetch_anchor() + + # Is it a tag? + if ch == '!': + return self.fetch_tag() + + # Is it a literal scalar? + if ch == '|' and not self.flow_level: + return self.fetch_literal() + + # Is it a folded scalar? + if ch == '>' and not self.flow_level: + return self.fetch_folded() + + # Is it a single quoted scalar? + if ch == '\'': + return self.fetch_single() + + # Is it a double quoted scalar? + if ch == '\"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It's an error. Let's produce a nice error message. + raise ScannerError("while scanning for the next token", None, + "found character %r that cannot start any token" % ch, + self.get_mark()) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don't need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # - should be no longer than 1024 characters. + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in list(self.possible_simple_keys): + key = self.possible_simple_keys[level] + if key.line != self.line \ + or self.index-key.index > 1024: + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it's possible + # and save its position. This function is called for + # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. + + # Check if a simple key is required at the current position. + required = not self.flow_level and self.indent == self.column + + # The next token might be a simple key. Let's save it's number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken+len(self.tokens) + key = SimpleKey(token_number, required, + self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + key = self.possible_simple_keys[self.flow_level] + + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + + del self.possible_simple_keys[self.flow_level] + + # Indentation functions. + + def unwind_indent(self, column): + + ## In flow context, tokens should respect indentation. + ## Actually the condition should be `self.indent >= column` according to + ## the spec. But this condition will prohibit intuitively correct + ## constructions such as + ## key : { + ## } + #if self.flow_level and self.indent > column: + # raise ScannerError(None, None, + # "invalid indentation or unclosed '[' or '{'", + # self.get_mark()) + + # In the flow context, indentation is ignored. We make the scanner less + # restrictive then specification requires. + if self.flow_level: + return + + # In block context, we may need to issue the BLOCK-END tokens. + while self.indent > column: + mark = self.get_mark() + self.indent = self.indents.pop() + self.tokens.append(BlockEndToken(mark, mark)) + + def add_indent(self, column): + # Check if we need to increase indentation. + if self.indent < column: + self.indents.append(self.indent) + self.indent = column + return True + return False + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(StreamStartToken(mark, mark, + encoding=self.encoding)) + + + def fetch_stream_end(self): + + # Set the current indentation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_directive(self): + + # Set the current indentation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Scan and add DIRECTIVE. + self.tokens.append(self.scan_directive()) + + def fetch_document_start(self): + self.fetch_document_indicator(DocumentStartToken) + + def fetch_document_end(self): + self.fetch_document_indicator(DocumentEndToken) + + def fetch_document_indicator(self, TokenClass): + + # Set the current indentation to -1. + self.unwind_indent(-1) + + # Reset simple keys. Note that there could not be a block collection + # after '---'. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Add DOCUMENT-START or DOCUMENT-END. + start_mark = self.get_mark() + self.forward(3) + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_entry(self): + + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(FlowEntryToken(start_mark, end_mark)) + + def fetch_block_entry(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a new entry? + if not self.allow_simple_key: + raise ScannerError(None, None, + "sequence entries are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-SEQUENCE-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockSequenceStartToken(mark, mark)) + + # It's an error for the block entry to occur in the flow context, + # but we let the parser detect this. + else: + pass + + # Simple keys are allowed after '-'. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add BLOCK-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(BlockEntryToken(start_mark, end_mark)) + + def fetch_key(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a key (not necessary a simple)? + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping keys are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-MAPPING-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after '?' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add KEY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(KeyToken(start_mark, end_mark)) + + def fetch_value(self): + + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number-self.tokens_taken, + KeyToken(key.mark, key.mark)) + + # If this key starts a new block mapping, we need to add + # BLOCK-MAPPING-START. + if not self.flow_level: + if self.add_indent(key.column): + self.tokens.insert(key.token_number-self.tokens_taken, + BlockMappingStartToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # It must be a part of a complex key. + else: + + # Block context needs additional checks. + # (Do we really need them? They will be caught by the parser + # anyway.) + if not self.flow_level: + + # We are allowed to start a complex value if and only if + # we can start a simple key. + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping values are not allowed here", + self.get_mark()) + + # If this value starts a new block mapping, we need to add + # BLOCK-MAPPING-START. It will be detected as an error later by + # the parser. + if not self.flow_level: + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after ':' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(ValueToken(start_mark, end_mark)) + + def fetch_alias(self): + + # ALIAS could be a simple key. + self.save_possible_simple_key() + + # No simple keys after ALIAS. + self.allow_simple_key = False + + # Scan and add ALIAS. + self.tokens.append(self.scan_anchor(AliasToken)) + + def fetch_anchor(self): + + # ANCHOR could start a simple key. + self.save_possible_simple_key() + + # No simple keys after ANCHOR. + self.allow_simple_key = False + + # Scan and add ANCHOR. + self.tokens.append(self.scan_anchor(AnchorToken)) + + def fetch_tag(self): + + # TAG could start a simple key. + self.save_possible_simple_key() + + # No simple keys after TAG. + self.allow_simple_key = False + + # Scan and add TAG. + self.tokens.append(self.scan_tag()) + + def fetch_literal(self): + self.fetch_block_scalar(style='|') + + def fetch_folded(self): + self.fetch_block_scalar(style='>') + + def fetch_block_scalar(self, style): + + # A simple key may follow a block scalar. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Scan and add SCALAR. + self.tokens.append(self.scan_block_scalar(style)) + + def fetch_single(self): + self.fetch_flow_scalar(style='\'') + + def fetch_double(self): + self.fetch_flow_scalar(style='"') + + def fetch_flow_scalar(self, style): + + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar(style)) + + def fetch_plain(self): + + # A plain scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after plain scalars. But note that `scan_plain` will + # change this flag if the scan is finished at the beginning of the + # line. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_directive(self): + + # DIRECTIVE: ^ '%' ... + # The '%' indicator is already checked. + if self.column == 0: + return True + + def check_document_start(self): + + # DOCUMENT-START: ^ '---' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '---' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_document_end(self): + + # DOCUMENT-END: ^ '...' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '...' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_block_entry(self): + + # BLOCK-ENTRY: '-' (' '|'\n') + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_key(self): + + # KEY(flow context): '?' + if self.flow_level: + return True + + # KEY(block context): '?' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_value(self): + + # VALUE(flow context): ':' + if self.flow_level: + return True + + # VALUE(block context): ':' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_plain(self): + + # A plain scalar may start with any non-space character except: + # '-', '?', ':', ',', '[', ']', '{', '}', + # '#', '&', '*', '!', '|', '>', '\'', '\"', + # '%', '@', '`'. + # + # It may also start with + # '-', '?', ':' + # if it is followed by a non-space character. + # + # Note that we limit the last rule to the block context (except the + # '-' character) because we want the flow context to be space + # independent. + ch = self.peek() + return ch not in '\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ + or (self.peek(1) not in '\0 \t\r\n\x85\u2028\u2029' + and (ch == '-' or (not self.flow_level and ch in '?:'))) + + # Scanners. + + def scan_to_next_token(self): + # We ignore spaces, line breaks and comments. + # If we find a line break in the block context, we set the flag + # `allow_simple_key` on. + # The byte order mark is stripped if it's the first character in the + # stream. We do not yet support BOM inside the stream as the + # specification requires. Any such mark will be considered as a part + # of the document. + # + # TODO: We need to make tab handling rules more sane. A good rule is + # Tabs cannot precede tokens + # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, + # KEY(block), VALUE(block), BLOCK-ENTRY + # So the checking code is + # if : + # self.allow_simple_keys = False + # We also need to add the check for `allow_simple_keys == True` to + # `unwind_indent` before issuing BLOCK-END. + # Scanners for block, flow, and plain scalars need to be modified. + + if self.index == 0 and self.peek() == '\uFEFF': + self.forward() + found = False + while not found: + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + if self.scan_line_break(): + if not self.flow_level: + self.allow_simple_key = True + else: + found = True + + def scan_directive(self): + # See the specification for details. + start_mark = self.get_mark() + self.forward() + name = self.scan_directive_name(start_mark) + value = None + if name == 'YAML': + value = self.scan_yaml_directive_value(start_mark) + end_mark = self.get_mark() + elif name == 'TAG': + value = self.scan_tag_directive_value(start_mark) + end_mark = self.get_mark() + else: + end_mark = self.get_mark() + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + self.scan_directive_ignored_line(start_mark) + return DirectiveToken(name, value, start_mark, end_mark) + + def scan_directive_name(self, start_mark): + # See the specification for details. + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + return value + + def scan_yaml_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + major = self.scan_yaml_directive_number(start_mark) + if self.peek() != '.': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or '.', but found %r" % self.peek(), + self.get_mark()) + self.forward() + minor = self.scan_yaml_directive_number(start_mark) + if self.peek() not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or ' ', but found %r" % self.peek(), + self.get_mark()) + return (major, minor) + + def scan_yaml_directive_number(self, start_mark): + # See the specification for details. + ch = self.peek() + if not ('0' <= ch <= '9'): + raise ScannerError("while scanning a directive", start_mark, + "expected a digit, but found %r" % ch, self.get_mark()) + length = 0 + while '0' <= self.peek(length) <= '9': + length += 1 + value = int(self.prefix(length)) + self.forward(length) + return value + + def scan_tag_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + handle = self.scan_tag_directive_handle(start_mark) + while self.peek() == ' ': + self.forward() + prefix = self.scan_tag_directive_prefix(start_mark) + return (handle, prefix) + + def scan_tag_directive_handle(self, start_mark): + # See the specification for details. + value = self.scan_tag_handle('directive', start_mark) + ch = self.peek() + if ch != ' ': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_tag_directive_prefix(self, start_mark): + # See the specification for details. + value = self.scan_tag_uri('directive', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_directive_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a comment or a line break, but found %r" + % ch, self.get_mark()) + self.scan_line_break() + + def scan_anchor(self, TokenClass): + # The specification does not restrict characters for anchors and + # aliases. This may lead to problems, for instance, the document: + # [ *alias, value ] + # can be interpreted in two ways, as + # [ "value" ] + # and + # [ *alias , "value" ] + # Therefore we restrict aliases to numbers and ASCII letters. + start_mark = self.get_mark() + indicator = self.peek() + if indicator == '*': + name = 'alias' + else: + name = 'anchor' + self.forward() + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \t\r\n\x85\u2028\u2029?:,]}%@`': + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + end_mark = self.get_mark() + return TokenClass(value, start_mark, end_mark) + + def scan_tag(self): + # See the specification for details. + start_mark = self.get_mark() + ch = self.peek(1) + if ch == '<': + handle = None + self.forward(2) + suffix = self.scan_tag_uri('tag', start_mark) + if self.peek() != '>': + raise ScannerError("while parsing a tag", start_mark, + "expected '>', but found %r" % self.peek(), + self.get_mark()) + self.forward() + elif ch in '\0 \t\r\n\x85\u2028\u2029': + handle = None + suffix = '!' + self.forward() + else: + length = 1 + use_handle = False + while ch not in '\0 \r\n\x85\u2028\u2029': + if ch == '!': + use_handle = True + break + length += 1 + ch = self.peek(length) + handle = '!' + if use_handle: + handle = self.scan_tag_handle('tag', start_mark) + else: + handle = '!' + self.forward() + suffix = self.scan_tag_uri('tag', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a tag", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + value = (handle, suffix) + end_mark = self.get_mark() + return TagToken(value, start_mark, end_mark) + + def scan_block_scalar(self, style): + # See the specification for details. + + if style == '>': + folded = True + else: + folded = False + + chunks = [] + start_mark = self.get_mark() + + # Scan the header. + self.forward() + chomping, increment = self.scan_block_scalar_indicators(start_mark) + self.scan_block_scalar_ignored_line(start_mark) + + # Determine the indentation level and go to the first non-empty line. + min_indent = self.indent+1 + if min_indent < 1: + min_indent = 1 + if increment is None: + breaks, max_indent, end_mark = self.scan_block_scalar_indentation() + indent = max(min_indent, max_indent) + else: + indent = min_indent+increment-1 + breaks, end_mark = self.scan_block_scalar_breaks(indent) + line_break = '' + + # Scan the inner part of the block scalar. + while self.column == indent and self.peek() != '\0': + chunks.extend(breaks) + leading_non_space = self.peek() not in ' \t' + length = 0 + while self.peek(length) not in '\0\r\n\x85\u2028\u2029': + length += 1 + chunks.append(self.prefix(length)) + self.forward(length) + line_break = self.scan_line_break() + breaks, end_mark = self.scan_block_scalar_breaks(indent) + if self.column == indent and self.peek() != '\0': + + # Unfortunately, folding rules are ambiguous. + # + # This is the folding according to the specification: + + if folded and line_break == '\n' \ + and leading_non_space and self.peek() not in ' \t': + if not breaks: + chunks.append(' ') + else: + chunks.append(line_break) + + # This is Clark Evans's interpretation (also in the spec + # examples): + # + #if folded and line_break == '\n': + # if not breaks: + # if self.peek() not in ' \t': + # chunks.append(' ') + # else: + # chunks.append(line_break) + #else: + # chunks.append(line_break) + else: + break + + # Chomp the tail. + if chomping is not False: + chunks.append(line_break) + if chomping is True: + chunks.extend(breaks) + + # We are done. + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + def scan_block_scalar_indicators(self, start_mark): + # See the specification for details. + chomping = None + increment = None + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + elif ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected chomping or indentation indicators, but found %r" + % ch, self.get_mark()) + return chomping, increment + + def scan_block_scalar_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected a comment or a line break, but found %r" % ch, + self.get_mark()) + self.scan_line_break() + + def scan_block_scalar_indentation(self): + # See the specification for details. + chunks = [] + max_indent = 0 + end_mark = self.get_mark() + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() != ' ': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + else: + self.forward() + if self.column > max_indent: + max_indent = self.column + return chunks, max_indent, end_mark + + def scan_block_scalar_breaks(self, indent): + # See the specification for details. + chunks = [] + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + while self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + return chunks, end_mark + + def scan_flow_scalar(self, style): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don't need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + if style == '"': + double = True + else: + double = False + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + self.forward() + end_mark = self.get_mark() + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + ESCAPE_REPLACEMENTS = { + '0': '\0', + 'a': '\x07', + 'b': '\x08', + 't': '\x09', + '\t': '\x09', + 'n': '\x0A', + 'v': '\x0B', + 'f': '\x0C', + 'r': '\x0D', + 'e': '\x1B', + ' ': '\x20', + '\"': '\"', + '\\': '\\', + '/': '/', + 'N': '\x85', + '_': '\xA0', + 'L': '\u2028', + 'P': '\u2029', + } + + ESCAPE_CODES = { + 'x': 2, + 'u': 4, + 'U': 8, + } + + def scan_flow_scalar_non_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in '\'\"\\\0 \t\r\n\x85\u2028\u2029': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if not double and ch == '\'' and self.peek(1) == '\'': + chunks.append('\'') + self.forward(2) + elif (double and ch == '\'') or (not double and ch in '\"\\'): + chunks.append(ch) + self.forward() + elif double and ch == '\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "expected escape sequence of %d hexdecimal numbers, but found %r" % + (length, self.peek(k)), self.get_mark()) + code = int(self.prefix(length), 16) + chunks.append(chr(code)) + self.forward(length) + elif ch in '\r\n\x85\u2028\u2029': + self.scan_line_break() + chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) + else: + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "found unknown escape character %r" % ch, self.get_mark()) + else: + return chunks + + def scan_flow_scalar_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in ' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == '\0': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected end of stream", self.get_mark()) + elif ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + breaks = self.scan_flow_scalar_breaks(double, start_mark) + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + else: + chunks.append(whitespaces) + return chunks + + def scan_flow_scalar_breaks(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + # Instead of checking indentation, we check for document + # separators. + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected document separator", self.get_mark()) + while self.peek() in ' \t': + self.forward() + if self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + else: + return chunks + + def scan_plain(self): + # See the specification for details. + # We add an additional restriction for the flow context: + # plain scalars in the flow context cannot contain ',' or '?'. + # We also keep track of the `allow_simple_key` flag here. + # Indentation rules are loosed for the flow context. + chunks = [] + start_mark = self.get_mark() + end_mark = start_mark + indent = self.indent+1 + # We allow zero indentation for scalars, but then we need to check for + # document separators at the beginning of the line. + #if indent == 0: + # indent = 1 + spaces = [] + while True: + length = 0 + if self.peek() == '#': + break + while True: + ch = self.peek(length) + if ch in '\0 \t\r\n\x85\u2028\u2029' \ + or (ch == ':' and + self.peek(length+1) in '\0 \t\r\n\x85\u2028\u2029' + + (u',[]{}' if self.flow_level else u''))\ + or (self.flow_level and ch in ',?[]{}'): + break + length += 1 + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + spaces = self.scan_plain_spaces(indent, start_mark) + if not spaces or self.peek() == '#' \ + or (not self.flow_level and self.column < indent): + break + return ScalarToken(''.join(chunks), True, start_mark, end_mark) + + def scan_plain_spaces(self, indent, start_mark): + # See the specification for details. + # The specification is really confusing about tabs in plain scalars. + # We just forbid them completely. Do not use tabs in YAML! + chunks = [] + length = 0 + while self.peek(length) in ' ': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + self.allow_simple_key = True + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + breaks = [] + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() == ' ': + self.forward() + else: + breaks.append(self.scan_line_break()) + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + elif whitespaces: + chunks.append(whitespaces) + return chunks + + def scan_tag_handle(self, name, start_mark): + # See the specification for details. + # For some strange reasons, the specification does not allow '_' in + # tag handles. I have allowed it anyway. + ch = self.peek() + if ch != '!': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length = 1 + ch = self.peek(length) + if ch != ' ': + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if ch != '!': + self.forward(length) + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length += 1 + value = self.prefix(length) + self.forward(length) + return value + + def scan_tag_uri(self, name, start_mark): + # See the specification for details. + # Note: we do not check if URI is well-formed. + chunks = [] + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.!~*\'()[]%': + if ch == '%': + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + chunks.append(self.scan_uri_escapes(name, start_mark)) + else: + length += 1 + ch = self.peek(length) + if length: + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + if not chunks: + raise ScannerError("while parsing a %s" % name, start_mark, + "expected URI, but found %r" % ch, self.get_mark()) + return ''.join(chunks) + + def scan_uri_escapes(self, name, start_mark): + # See the specification for details. + codes = [] + mark = self.get_mark() + while self.peek() == '%': + self.forward() + for k in range(2): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected URI escape sequence of 2 hexdecimal numbers, but found %r" + % self.peek(k), self.get_mark()) + codes.append(int(self.prefix(2), 16)) + self.forward(2) + try: + value = bytes(codes).decode('utf-8') + except UnicodeDecodeError as exc: + raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) + return value + + def scan_line_break(self): + # Transforms: + # '\r\n' : '\n' + # '\r' : '\n' + # '\n' : '\n' + # '\x85' : '\n' + # '\u2028' : '\u2028' + # '\u2029 : '\u2029' + # default : '' + ch = self.peek() + if ch in '\r\n\x85': + if self.prefix(2) == '\r\n': + self.forward(2) + else: + self.forward() + return '\n' + elif ch in '\u2028\u2029': + self.forward() + return ch + return '' diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/serializer.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/serializer.py new file mode 100644 index 00000000..fe911e67 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/serializer.py @@ -0,0 +1,111 @@ + +__all__ = ['Serializer', 'SerializerError'] + +from .error import YAMLError +from .events import * +from .nodes import * + +class SerializerError(YAMLError): + pass + +class Serializer: + + ANCHOR_TEMPLATE = 'id%03d' + + def __init__(self, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + self.use_encoding = encoding + self.use_explicit_start = explicit_start + self.use_explicit_end = explicit_end + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + self.closed = None + + def open(self): + if self.closed is None: + self.emit(StreamStartEvent(encoding=self.use_encoding)) + self.closed = False + elif self.closed: + raise SerializerError("serializer is closed") + else: + raise SerializerError("serializer is already opened") + + def close(self): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif not self.closed: + self.emit(StreamEndEvent()) + self.closed = True + + #def __del__(self): + # self.close() + + def serialize(self, node): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif self.closed: + raise SerializerError("serializer is closed") + self.emit(DocumentStartEvent(explicit=self.use_explicit_start, + version=self.use_version, tags=self.use_tags)) + self.anchor_node(node) + self.serialize_node(node, None, None) + self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + + def anchor_node(self, node): + if node in self.anchors: + if self.anchors[node] is None: + self.anchors[node] = self.generate_anchor(node) + else: + self.anchors[node] = None + if isinstance(node, SequenceNode): + for item in node.value: + self.anchor_node(item) + elif isinstance(node, MappingNode): + for key, value in node.value: + self.anchor_node(key) + self.anchor_node(value) + + def generate_anchor(self, node): + self.last_anchor_id += 1 + return self.ANCHOR_TEMPLATE % self.last_anchor_id + + def serialize_node(self, node, parent, index): + alias = self.anchors[node] + if node in self.serialized_nodes: + self.emit(AliasEvent(alias)) + else: + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if isinstance(node, ScalarNode): + detected_tag = self.resolve(ScalarNode, node.value, (True, False)) + default_tag = self.resolve(ScalarNode, node.value, (False, True)) + implicit = (node.tag == detected_tag), (node.tag == default_tag) + self.emit(ScalarEvent(alias, node.tag, implicit, node.value, + style=node.style)) + elif isinstance(node, SequenceNode): + implicit = (node.tag + == self.resolve(SequenceNode, node.value, True)) + self.emit(SequenceStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + index = 0 + for item in node.value: + self.serialize_node(item, node, index) + index += 1 + self.emit(SequenceEndEvent()) + elif isinstance(node, MappingNode): + implicit = (node.tag + == self.resolve(MappingNode, node.value, True)) + self.emit(MappingStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + for key, value in node.value: + self.serialize_node(key, node, None) + self.serialize_node(value, node, key) + self.emit(MappingEndEvent()) + self.ascend_resolver() + diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/tokens.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/tokens.py new file mode 100644 index 00000000..4d0b48a3 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/venv/yaml/tokens.py @@ -0,0 +1,104 @@ + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in self.__dict__ + if not key.endswith('_mark')] + attributes.sort() + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +#class BOMToken(Token): +# id = '' + +class DirectiveToken(Token): + id = '' + def __init__(self, name, value, start_mark, end_mark): + self.name = name + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class DocumentStartToken(Token): + id = '' + +class DocumentEndToken(Token): + id = '' + +class StreamStartToken(Token): + id = '' + def __init__(self, start_mark=None, end_mark=None, + encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndToken(Token): + id = '' + +class BlockSequenceStartToken(Token): + id = '' + +class BlockMappingStartToken(Token): + id = '' + +class BlockEndToken(Token): + id = '' + +class FlowSequenceStartToken(Token): + id = '[' + +class FlowMappingStartToken(Token): + id = '{' + +class FlowSequenceEndToken(Token): + id = ']' + +class FlowMappingEndToken(Token): + id = '}' + +class KeyToken(Token): + id = '?' + +class ValueToken(Token): + id = ':' + +class BlockEntryToken(Token): + id = '-' + +class FlowEntryToken(Token): + id = ',' + +class AliasToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class AnchorToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class TagToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class ScalarToken(Token): + id = '' + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + diff --git a/hackfest_virtual-pc_vnfd/cloud_init/virtual-pc_init b/hackfest_virtual-pc_vnfd/cloud_init/virtual-pc_init new file mode 100644 index 00000000..a9acf627 --- /dev/null +++ b/hackfest_virtual-pc_vnfd/cloud_init/virtual-pc_init @@ -0,0 +1,4 @@ +#cloud-config +password: osm2020 +chpasswd: { expire: False } +ssh_pwauth: True diff --git a/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml b/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml new file mode 100644 index 00000000..49e4b4cf --- /dev/null +++ b/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml @@ -0,0 +1,66 @@ +vnfd: + description: Virtual Desktop Computer with Xubuntu Desktop and RDP + df: + - id: default-df + instantiation-level: + - id: default-instantiation-level + vdu-level: + - number-of-instances: 1 + vdu-id: virtual-pc + vdu-profile: + - id: virtual-pc + min-number-of-instances: 1 + vdu-configuration-id: virtual-pc-vdu-configuration + ext-cpd: + - id: virtual-pc-mgmt-ext + int-cpd: + cpd: eth0-int + vdu-id: virtual-pc + id: virtual-pc_vnfd + mgmt-cp: virtual-pc-mgmt-ext + product-name: virtual-pc_vnfd + provider: Canonical + sw-image-desc: + - id: ubuntu20.04 + image: ubuntu20.04 + name: ubuntu20.04 + vdu: + - cloud-init-file: virtual-pc_init + description: virtual-pc + id: virtual-pc + int-cpd: + - id: eth0-int + virtual-network-interface-requirement: + - name: eth0 + virtual-interface: + type: PARAVIRT + name: virtual-pc-vdu + sw-image-desc: ubuntu20.04 + virtual-compute-desc: virtual-pc-vdu-compute + virtual-storage-desc: + - virtual-pc-vdu-storage + vdu-configuration: + - id: virtual-pc-vdu-configuration + config-access: + ssh-access: + required: true + config-access: + ssh-access: + default-user: ubuntu + required: true + initial-config-primitive: + - name: config + seq: '1' + juju: + charm: virtual-pc + proxy: false + version: '1.0' + virtual-compute-desc: + - id: virtual-pc-vdu-compute + virtual-cpu: + num-virtual-cpu: 4 + virtual-memory: + size: 8.0 + virtual-storage-desc: + - id: virtual-pc-vdu-storage + size-of-storage: 20 -- GitLab