summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* | | | compute: Fix 'server * -f yaml' outputStephen Finucane2021-01-064-115/+99
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Make use of 'FormattableColumn'-derived formatters, which provide better output than what we were using before, particularly for the YAML output format. For example, compare before for the 'server show' command: $ openstack --os-compute-api-version 2.79 server show test-server -f yaml ... addresses: private=fdff:77e3:9bb4:0:f816:3eff:fe6d:a944, 10.0.0.44 flavor: disk='1', ephemeral='0', extra_specs.hw_rng:allowed='True', original_name='m1.tiny', ram='512', swap='0', vcpus='1' ... To after: $ openstack --os-compute-api-version 2.79 server show test-server -f yaml ... addresses: private: - fdff:77e3:9bb4:0:f816:3eff:fe6d:a944 - 10.0.0.44 flavor: disk: 1 ephemeral: 0 extra_specs: hw_rng:allowed: 'True' original_name: m1.tiny ram: 512 swap: 0 vcpus: 1 ... Similarly, compare before for 'server list': $ openstack --os-compute-api-version 2.79 server list -f yaml - ... Networks: private=fdff:77e3:9bb4:0:f816:3eff:fe6d:a944, 10.0.0.44 Power State: Running Properties: '' ... To after: $ openstack --os-compute-api-version 2.79 server list -f yaml - ... Networks: private: - fdff:77e3:9bb4:0:f816:3eff:fe6d:a944 - 10.0.0.44 Power State: 1 Properties: {} ... We also fix the human-readable output for the 'tags' field. Before: $ openstack --os-compute-api-version 2.79 server list ... | tags | ['bar', 'foo'] | After: $ openstack --os-compute-api-version 2.79 server list ... | tags | bar, foo | Change-Id: I7a8349106e211c57c4577b75326b39b88bd9ac1e Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | Merge "trivial: Cleanup docs for 'server list'"Zuul2021-01-061-57/+85
|\ \ \ \
| * | | | trivial: Cleanup docs for 'server list'Stephen Finucane2020-12-091-57/+85
| | | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I2f2033a8d49ee42eb21696a9cd28e63ad9712fad Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | Merge "compute: Add missing options for 'server rebuild'"Zuul2021-01-063-74/+446
|\ \ \ \ \ | |/ / / /
| * | | | compute: Add missing options for 'server rebuild'Stephen Finucane2020-12-093-74/+446
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This accepts a large number of options that we weren't exposing. Add the following options: '--name', '--preserve-ephemeral', '--user-data', '--no-user-data', '--trusted-image-cert' and '--no-trusted-image-certs'. In addition, rename the '--key-unset' parameter to '--no-key-name', to mimic e.g. '--no-property' on other commands. Change-Id: I61c46e18bef1f086b62a015ebdc56be91071b826 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | Merge "Add 'flavor list --min-disk', '--min-ram' options"Zuul2021-01-063-7/+73
|\ \ \ \ \
| * | | | | Add 'flavor list --min-disk', '--min-ram' optionsStephen Finucane2020-12-093-7/+73
| |/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Allow us to filter on minimum disk and RAM, and close another gap with novaclient. Change-Id: Ib3f0bdf419675e1c35c3406fbac8a4c18ac56a33 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | Merge "image: Unset properties rather than setting to None"Zuul2021-01-063-17/+16
|\ \ \ \ \
| * | | | | image: Unset properties rather than setting to NoneStephen Finucane2020-12-223-17/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently, we attempt to unset an image property by setting it to None. This doesn't work for known properties and is rightly rejected by the Glance API with the following error: BadRequestException: 400: Client Error for url: http://172.20.4.87/image/v2/images/368c5751-2b0b-4a38-a255-fd146fe52d31, Bad Request The solution is to actually unset the field by deleting it. Change-Id: Ie156bedbe0f9244f82c81401679706f484caf9aa Signed-off-by: Stephen Finucane <sfinucan@redhat.com> Story: #2008463 Task: #41493
* | | | | | Add support '--progress' option for 'image create'youngho choi2021-01-044-0/+161
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | openstack-client doesn’t support the upload progress bar. This patch shows progressbar when create image if you added '--progress' option like a python-glanceclient. like this. [=============================>] 100% +------------------+---------------------------+ | Field | Value | +------------------+---------------------------+ | container_format | bare | | created_at | 2020-09-06T20:44:40Z | ... How to use Add the'--progress' option on the 'openstack image create' command. Code was written by referring to 'python-glanceclient' project on stable/ussuri branch Change-Id: Ic3035b49da10b6555066eee607a14a5b73797c00 task: 40003 story: 2007777
* | | | | | Merge "Change 'Volume' to 'Block Storage'"Zuul2020-12-224-4/+4
|\ \ \ \ \ \
| * | | | | | Change 'Volume' to 'Block Storage'yangxi2020-03-094-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In volume*.rst files, 'Volume' should be instead of 'Block Storage'. Change-Id: Iafc8bfa19e87edf1ffad2340c75e9d867042cae5
* | | | | | | Merge "Add project field in image list subcommand"Zuul2020-12-223-0/+35
|\ \ \ \ \ \ \
| * | | | | | | Add project field in image list subcommandokozachenko2020-12-153-0/+35
| | |/ / / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The motivation is to filter the image by owner Change-Id: I1f08da175a06e62a844f76b0ec18cb3332efef86
* | | | | | | Merge "Add name and enabled param in ListDomain parser"Zuul2020-12-223-1/+80
|\ \ \ \ \ \ \
| * | | | | | | Add name and enabled param in ListDomain parserVishakha Agarwal2020-07-213-1/+80
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | when doing openstack domain list --name xyz_id, and openstack domain list --enabled CLI raising error unrecognized arguments, whereas in api-ref document [1], user can pass name and enabled as optional query param. This addresses the above issue, by adding param --name and --enabled in parser of ListDomain. [1]https://docs.openstack.org/api-ref/identity/v3/?expanded=list-domains-detail#list-domains Change-Id: I3cdb511d3c7059ddfb802ca025188d8976c9302c
* | | | | | | | Merge "Add option to filter instances by AZ"Zuul2020-12-222-0/+9
|\ \ \ \ \ \ \ \ | |_|/ / / / / / |/| | | | | | |
| * | | | | | | Add option to filter instances by AZDmitriy Rabotyagov2020-12-012-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since nova API microversion 2.83 it is possible for users to filter instances by AZ. However even before that this functionality was available for admin role. Change-Id: Ife4c8e81aad2ff1dde50d9f23913d9dd9397b00c
* | | | | | | | Make use of comparable 'FormattableColumn' subclassesStephen Finucane2020-12-0933-306/+295
| |_|_|/ / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This requires fixes found in cliff 3.5.0 [1] and osc-lib 2.3.0 [2]. With these fixes in place, we can remove the icky, still broken 'assertItemEqual' and 'assertListItemEqual' helpers. [1] https://review.opendev.org/761421 [2] https://review.opendev.org/761394 Change-Id: Id6c26b37c3c7d5ec6761361abca57f9219b76838 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | | | Merge "Remove retired Searchlight support"Zuul2020-12-094-7/+0
|\ \ \ \ \ \ \
| * | | | | | | Remove retired Searchlight supportGhanshyam Mann2020-12-084-7/+0
| |/ / / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Searchlight project is retiring in Wallaby cycle[1]. This commit removes the support/usage of Searchlight project before its code is removed. Needed-By: https://review.opendev.org/c/openstack/searchlight/+/764526 [1] http://lists.openstack.org/pipermail/openstack-discuss/2020-November/018637.html Change-Id: Idad97343b9ce66186d50ee0560a2fded66655f9b
* | | | | | | Update lower-constraintsStephen Finucane2020-12-081-47/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This had gotten pretty out-of-date and included a whole load of OSC plugins which I don't think we need to track from here. This updated version is simply generated via 'pip freeze' using pip >= 20.3, which includes the new dependency resolver. Change-Id: I4fb0b69dbd538f313c6fef97126c22078904c69f Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | | | Fix lower-constraints jobStephen Finucane2020-12-083-7/+8
| |_|_|/ / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | pip 20.3 finally includes a proper dependency resolver. Its use is causing the following error messages on the lower-constraints job: ERROR: Cannot install ... because these package versions have conflicting dependencies. The conflict is caused by: bandit 1.1.0 depends on PyYAML>=3.1.0 cliff 3.4.0 depends on PyYAML>=3.12 openstacksdk 0.52.0 depends on PyYAML>=3.13 Bump our lower constraint for PyYAML to resolve this issue. With that resolved, we see a new issue: ERROR: Could not find a version that satisfies the requirement cryptography>=2.7 (from openstacksdk) ERROR: No matching distribution found for cryptography>=2.7 This is less self-explanatory but looking at the lower-constraints for openstacksdk 0.52.0 shows a dependency on cryptography 2.7 [1], meaning we need to bump this also. Next up, flake8-import-order seems to cause the dependency resolver to go nuts, eventually ending with the following error message in a Python 3.6 environment: Using cached enum34-1.1.2.zip (49 kB) ERROR: Command errored out with exit status 1: command: ... cwd: ... Complete output (9 lines): Traceback (most recent call last): File "<string>", line 1, in <module> File ".../lib/python3.6/site-packages/setuptools/__init__.py", line 7, in <module> import setuptools.distutils_patch # noqa: F401 File ".../lib/python3.6/site-packages/setuptools/distutils_patch.py", line 9, in <module> import re File "/usr/lib64/python3.6/re.py", line 142, in <module> class RegexFlag(enum.IntFlag): AttributeError: module 'enum' has no attribute 'IntFlag' ---------------------------------------- A quick Google suggests this is because the enum34 package is not complete [2]. We shouldn't even be using it since our base virtualenv should at least use Python 3.6, but I guess some dependency doesn't properly restrict the dependency to <= Python 3.4. This is moved from 'test-requirements.txt' to 'tox.ini' since we don't need to use our constraints machinery for linters. Finally, the versions of bandit and hacking that pip is bringing in both requires in a newer version of babel, which in turn requires a new version of pytz. Collecting hacking>=2.0.0 ... ERROR: Cannot install oslo.i18n because these package versions have conflicting dependencies. The conflict is caused by: babel 2.9.0 depends on pytz>=2015.7 babel 2.8.1 depends on pytz>=2015.7 babel 2.8.0 depends on pytz>=2015.7 babel 2.7.0 depends on pytz>=2015.7 Seeing as we shouldn't be tracking bandit in lower-constraints, I'm not sure why we're want to bump these dependencies for just that. As above, we move these dependencies out of 'test-requirements' and into 'tox.ini' since we can do that for linters. [1] https://opendev.org/openstack/openstacksdk/src/tag/0.52.0/requirements.txt#L19 [2] https://github.com/iterative/dvc/issues/1995#issuecomment-491889669 Change-Id: I8ec738fbcabc8d8553db79a876e5592576cd18fa Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | | Merge "trivial: Cleanup docs for 'server rebuild'"Zuul2020-12-051-29/+52
|\ \ \ \ \ \ | |_|_|_|_|/ |/| | | | |
| * | | | | trivial: Cleanup docs for 'server rebuild'Stephen Finucane2020-12-031-29/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use consistent help strings and error messages. Change-Id: I42647a6b7e67ce4b8dd5f826e20802ade691c266 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | | Merge "Switch compute aggregate functions to SDK"Zuul2020-12-054-212/+313
|\ \ \ \ \ \
| * | | | | | Switch compute aggregate functions to SDKArtem Goncharov2020-12-024-212/+313
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Continue journey towards having OSC consuming SDK for nova part. Depends-On: https://review.opendev.org/#/c/762131/ Change-Id: Id16e6c47aa93f02f15f49e1f59f73fecaa3e3b80
* | | | | | | Merge "Switch compute flavors from novaclient/direct to SDK"Zuul2020-12-056-339/+453
|\ \ \ \ \ \ \ | |/ / / / / / | | / / / / / | |/ / / / / |/| | | | |
| * | | | | Switch compute flavors from novaclient/direct to SDKArtem Goncharov2020-12-026-339/+453
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Let's switch flavors from novaclient or direct API requests onto using SDK. Microversion agreement comes out of the box. SDK normalizes property names, while OSC uses server side names. In order not to break OSC users continue using server-side names. Depends-On: https://review.opendev.org/#/c/762989/ Change-Id: I62b2ed8488ee4ac9c42051311bcfb455506ddd90
* | | | | | Add documentation about login with federationpedro2020-12-023-19/+183
|/ / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The documentation presents the parameters necessary to authenticate via federation (using password) and do a brief description of each parameter used in the process. Change-Id: Iae3b6d0b56ebd2bbbb94f9f3637b5086e75559a7
* | | | | Merge "stop image downloads to memory"Zuul2020-12-024-3/+19
|\ \ \ \ \
| * | | | | stop image downloads to memorySimon Merrick2020-11-254-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + Fixes issue with large images hogging memory + stream image downloads + output to stdout if file not specified Change-Id: Ia01ff9b21a2dac5d0ccf2bd58a8640e88c5cbb36 Story: 2007672 Task: 39776
* | | | | | Merge "Add NODE and HOST parameters in "server create" help text"Zuul2020-12-011-1/+6
|\ \ \ \ \ \
| * | | | | | Add NODE and HOST parameters in "server create" help textyanpuqing2020-12-011-1/+6
| | |/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add optional parameters "NODE" and "HOST" in the help text of the server create comand for --availability-zone. Co-Authored-By: tianhui <tianhui@awcloud.com> Change-Id: I4faea8a3d3aecb21ec535e55c238c71745fc68cb Task: 24274 Story: 2003313
* | | | | | Merge "Let autoprogram-cliff know who's running"Zuul2020-12-011-0/+3
|\ \ \ \ \ \
| * | | | | | Let autoprogram-cliff know who's runningEric Fried2020-12-011-0/+3
| |/ / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The autoprogram-cliff directive has a habit of producing text like This command is provided by the $me plugin. which doesn't make any sense. Cliff recently added a config option whereby consumers can let it know who $me is so it can suppress that message where appropriate (while still producing it for $plugin, as intended). Depends-On: https://review.opendev.org/692464 Change-Id: I0d580fb1d34dd56740eb6d976caa795e0e951047
* | | | | | Merge "Remove None valued network quota entries"Zuul2020-12-013-4/+36
|\ \ \ \ \ \
| * | | | | | Remove None valued network quota entriesasarfaty2020-09-223-4/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since the openstack SDK still has the neutron-lbaas entries in the network quota, but those are already deprecated [1], the 'opentack quota show' command shows those as None value. This fix removes those empty deprecated values from the output. [1] https://review.opendev.org/#/c/658494/ Change-Id: I8dbdba2a029ea8e6a268ddf29627e1466a7e3a8a
* | | | | | | Merge "Add id and enabled param in ListIdentityProvider parser"Zuul2020-12-013-1/+81
|\ \ \ \ \ \ \ | |_|/ / / / / |/| | | | | |
| * | | | | | Add id and enabled param in ListIdentityProvider parserVishakha Agarwal2020-07-243-1/+81
| | |_|/ / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | when doing openstack identity provider list --name xyz_id, and openstack identity provider list --enabled CLI raising error unrecognized arguments, whereas in api-ref document [1], user can pass name and enabled as optional query param. This addresses the above issue, by adding param --id and --enabled in parser of ListIdentityProvider. [1] https://docs.openstack.org/api-ref/identity/v3-ext/?expanded=list-identity-providers-detail#list-identity-providers Change-Id: I59ce3a5f54700ba5a735f0b3b4b3b73b3a8658fa
* | | | | | Add "fields" parameter to ListPort queryRodolfo Alonso Hernandez2020-11-184-22/+58
| |_|/ / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This new query parameter will allow to send a query to the Neutron server filtering only by those parameters needed by the list command: ID, name, MAC address, fixed IPs and status. When using input parameter "long", security groups IDs, device owner and tags will be added to the fields filter. With 4500 ports, those are the execution times for the command "openstack port list" (average values in a development environment): Neutron API (seconds) CLI (seconds) Without filter: 3.05 10.15 With filter: 2.76 8.19 Depends-On: https://review.opendev.org/#/c/754113/ Change-Id: I1cccf0bc3533f8085e8dd61bf2fbe78c49b74b31 Closes-Bug: #1897100
* | | | | Merge "update lower-constraints.txt"Zuul2020-11-181-2/+2
|\ \ \ \ \
| * | | | | update lower-constraints.txtlikui2020-10-291-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We also need to change the lower-constraint requirements to make them py3.8 compatible. See https://bugs.launchpad.net/nova/+bug/1886298 MarkupSafe==1.1.1 paramiko==2.7.1 Change-Id: I04a0fcd98327b9f41e24e19bcab97c813760f414
* | | | | | Merge "Add a few selectable fields to the "openstack server list" output"Zuul2020-11-183-0/+44
|\ \ \ \ \ \
| * | | | | | Add a few selectable fields to the "openstack server list" outputjay2020-11-053-0/+44
| | |/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added ``-c project_id | user_id | created_at`` to ``openstack server list`` command to get these columns as an output. Change-Id: I18991adf899c7b72c98bb89871bf0715d35943f0 Story: 2007925
* | | | | | Merge "trivial: Document removal of support for agents"Zuul2020-11-181-4/+24
|\ \ \ \ \ \
| * | | | | | trivial: Document removal of support for agentsStephen Finucane2020-11-171-4/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We can't remove these commands for a long time, given OSC's intention to support multiple releases of OpenStack, but we can at least indicate to users that this thing might not work anymore. Change-Id: I9093cc1197a0287984d83e2020fba100d0c958b3 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | | | | | Merge "Switch 'openstack keypair' ops to use SDK"Zuul2020-11-173-146/+128
|\ \ \ \ \ \ \
| * | | | | | | Switch 'openstack keypair' ops to use SDKArtem Goncharov2020-11-093-146/+128
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Let's continue our journey and start using SDK for the keypair operations Depends-On: https://review.opendev.org/#/c/761883/ Change-Id: Id411e70b8e1a79c0e88a0e22be7ff37e5c30fcda
* | | | | | | | Merge "Allow to resize in-use volumes"Zuul2020-11-172-6/+15
|\ \ \ \ \ \ \ \ | |_|/ / / / / / |/| | | | | | |