diff --git a/Makefile b/Makefile index bfadb1c1d..8690a199c 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ scan: echo "Trivy version is $${TRIVY_VERSION} and platform is $${uname_S}"; \ for i in $$images; do \ echo "Scanning image - '$$i'"; \ - $$trivy --clear-cache && $$trivy --exit-code 1 -severity HIGH,CRITICAL --light --no-progress --ignore-unfixed "$$i"; \ + $$trivy --clear-cache && $$trivy --exit-code 1 --severity HIGH,CRITICAL --no-progress --ignore-unfixed "$$i"; \ done; \ # Make the python source distribution diff --git a/examples/Pipelines-with-Gordo.ipynb b/examples/Pipelines-with-Gordo.ipynb index 6320a933b..d54edac4f 100644 --- a/examples/Pipelines-with-Gordo.ipynb +++ b/examples/Pipelines-with-Gordo.ipynb @@ -122,8 +122,7 @@ " random_state: null\n", " verbose: 0\n", " warm_start: false\n", - " verbose: false\n", - "\n" + " verbose: false\n" ] } ], @@ -178,7 +177,7 @@ "from gordo.serializer import from_definition\n", "\n", "\n", - "pipe = from_definition(yaml.load(yaml_definition_of_pipeline))\n", + "pipe = from_definition(yaml.load(yaml_definition_of_pipeline, Loader=yaml.FullLoader))\n", "pprint(pipe.steps)" ] }, diff --git a/mypy.ini b/mypy.ini index 09838ed5d..ccb70b12c 100644 --- a/mypy.ini +++ b/mypy.ini @@ -3,4 +3,5 @@ [mypy] python_version = 3.9 ignore_missing_imports = True +no_implicit_optional = False plugins = numpy.typing.mypy_plugin diff --git a/requirements/docs_requirements.in b/requirements/docs_requirements.in index a9d87d6e1..8184a883f 100644 --- a/requirements/docs_requirements.in +++ b/requirements/docs_requirements.in @@ -1,7 +1,7 @@ -sphinx~=6.2 +sphinx~=7.2 sphinx-autobuild~=2021.3 sphinx-copybutton~=0.5 -furo~=2023.5 +furo~=2023.8 sphinx-click~=4.4 ipython~=8.13 nbsphinx~=0.9 diff --git a/requirements/full_requirements.txt b/requirements/full_requirements.txt index c671b23ea..1489b3e58 100644 --- a/requirements/full_requirements.txt +++ b/requirements/full_requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --output-file=full_requirements.txt mlflow_requirements.in postgres_requirements.in requirements.in +# pip-compile --no-emit-index-url --output-file=full_requirements.txt mlflow_requirements.in postgres_requirements.in requirements.in # absl-py==1.4.0 # via @@ -12,7 +12,7 @@ adal==1.2.7 # via # azureml-core # msrestazure -alembic==1.11.1 +alembic==1.12.0 # via mlflow argcomplete==2.1.2 # via @@ -26,10 +26,11 @@ azure-common==1.1.28 # azure-mgmt-authorization # azure-mgmt-containerregistry # azure-mgmt-keyvault + # azure-mgmt-network # azure-mgmt-resource # azure-mgmt-storage # azureml-core -azure-core==1.28.0 +azure-core==1.29.1 # via # azure-mgmt-core # azureml-core @@ -45,15 +46,18 @@ azure-mgmt-core==1.4.0 # azure-mgmt-authorization # azure-mgmt-containerregistry # azure-mgmt-keyvault + # azure-mgmt-network # azure-mgmt-resource # azure-mgmt-storage -azure-mgmt-keyvault==10.2.2 +azure-mgmt-keyvault==10.2.3 + # via azureml-core +azure-mgmt-network==21.0.1 # via azureml-core azure-mgmt-resource==22.0.0 # via azureml-core azure-mgmt-storage==21.0.0 # via azureml-core -azureml-core==1.52.0 +azureml-core==1.53.0 # via -r mlflow_requirements.in backports-tempfile==1.0 # via azureml-core @@ -69,7 +73,7 @@ cachetools==5.3.1 # gordo-core catboost==1.1.1 # via -r requirements.in -certifi==2023.5.7 +certifi==2023.7.22 # via # msrest # requests @@ -79,7 +83,7 @@ cffi==1.15.1 # pynacl charset-normalizer==3.2.0 # via requests -click==8.1.5 +click==8.1.7 # via # databricks-cli # flask @@ -91,7 +95,7 @@ contextlib2==21.6.0 # via azureml-core contourpy==1.1.0 # via matplotlib -cryptography==41.0.2 +cryptography==41.0.3 # via # adal # azureml-core @@ -104,7 +108,7 @@ cycler==0.11.0 # via matplotlib databricks-cli==0.17.7 # via mlflow -dataclasses-json==0.5.12 +dataclasses-json==0.5.14 # via -r requirements.in dictdiffer==0.9.0 # via -r requirements.in @@ -114,19 +118,19 @@ docker==6.1.3 # mlflow entrypoints==0.4 # via mlflow -flask==2.3.2 +flask==2.3.3 # via # -r requirements.in # mlflow flatbuffers==23.5.26 # via tensorflow -fonttools==4.41.0 +fonttools==4.42.1 # via matplotlib gast==0.4.0 # via tensorflow gitdb==4.0.10 # via gitpython -gitpython==3.1.32 +gitpython==3.1.34 # via mlflow google-auth==2.22.0 # via @@ -136,15 +140,15 @@ google-auth-oauthlib==1.0.0 # via tensorboard google-pasta==0.2.0 # via tensorflow -gordo-client==6.2.3 +gordo-client==6.2.5 # via -r requirements.in -gordo-core==0.3.2 +gordo-core==0.3.3 # via gordo-client graphviz==0.20.1 # via catboost greenlet==2.0.2 # via sqlalchemy -grpcio==1.56.0 +grpcio==1.57.0 # via # tensorboard # tensorflow @@ -170,7 +174,7 @@ isodate==0.6.1 # msrest itsdangerous==2.1.2 # via flask -jax==0.4.13 +jax==0.4.14 # via tensorflow jeepney==0.8.0 # via secretstorage @@ -183,13 +187,13 @@ jmespath==1.0.1 # via # azureml-core # knack -joblib==1.3.1 +joblib==1.3.2 # via scikit-learn -jsonpickle==3.0.1 +jsonpickle==3.0.2 # via azureml-core keras==2.12.0 # via tensorflow -kiwisolver==1.4.4 +kiwisolver==1.4.5 # via matplotlib knack==0.10.1 # via azureml-core @@ -197,7 +201,7 @@ libclang==16.0.6 # via tensorflow mako==1.2.4 # via alembic -markdown==3.4.3 +markdown==3.4.4 # via # mlflow # tensorboard @@ -206,7 +210,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -marshmallow==3.19.0 +marshmallow==3.20.1 # via dataclasses-json matplotlib==3.7.2 # via @@ -214,9 +218,9 @@ matplotlib==3.7.2 # mlflow ml-dtypes==0.2.0 # via jax -mlflow==2.5.0 +mlflow==2.6.0 # via -r mlflow_requirements.in -msal==1.22.0 +msal==1.23.0 # via # azureml-core # msal-extensions @@ -229,6 +233,7 @@ msrest==0.7.1 # azure-graphrbac # azure-mgmt-authorization # azure-mgmt-containerregistry + # azure-mgmt-network # azure-mgmt-resource # azure-mgmt-storage # azureml-core @@ -241,7 +246,7 @@ mypy-extensions==1.0.0 # via typing-inspect ndg-httpsclient==0.5.1 # via azureml-core -numexpr==2.8.4 +numexpr==2.8.5 # via gordo-core numpy==1.24.3 # via @@ -287,28 +292,28 @@ pandas==1.5.3 # gordo-core # mlflow # xarray -paramiko==3.2.0 +paramiko==3.3.1 # via azureml-core -pathspec==0.11.1 +pathspec==0.11.2 # via azureml-core -peewee==3.16.2 +peewee==3.16.3 # via -r postgres_requirements.in pillow==10.0.0 # via matplotlib pkginfo==1.9.6 # via azureml-core -plotly==5.15.0 +plotly==5.16.1 # via catboost portalocker==2.7.0 # via msal-extensions prometheus-client==0.17.1 # via -r requirements.in -protobuf==4.23.4 +protobuf==4.24.2 # via # mlflow # tensorboard # tensorflow -psycopg2-binary==2.9.6 +psycopg2-binary==2.9.7 # via -r postgres_requirements.in pyarrow==10.0.1 # via @@ -323,11 +328,11 @@ pyasn1-modules==0.3.0 # via google-auth pycparser==2.21 # via cffi -pydantic==1.10.11 +pydantic==1.10.12 # via gordo-client -pygments==2.15.1 +pygments==2.16.1 # via knack -pyjwt[crypto]==2.7.0 +pyjwt[crypto]==2.8.0 # via # adal # azureml-core @@ -390,7 +395,7 @@ scikit-learn==1.3.0 # via # gordo-core # mlflow -scipy==1.11.1 +scipy==1.11.2 # via # catboost # jax @@ -418,7 +423,7 @@ six==1.16.0 # tensorflow smmap==5.0.0 # via gitdb -sqlalchemy==2.0.19 +sqlalchemy==2.0.20 # via # alembic # mlflow @@ -428,7 +433,7 @@ tabulate==0.9.0 # via # databricks-cli # knack -tenacity==8.2.2 +tenacity==8.2.3 # via plotly tensorboard==2.12.3 # via tensorflow @@ -438,7 +443,7 @@ tensorflow==2.12.1 # via -r requirements.in tensorflow-estimator==2.12.0 # via tensorflow -tensorflow-io-gcs-filesystem==0.32.0 +tensorflow-io-gcs-filesystem==0.33.0 # via tensorflow termcolor==2.3.0 # via tensorflow @@ -461,13 +466,13 @@ urllib3==1.26.16 # docker # google-auth # requests -websocket-client==1.6.1 +websocket-client==1.6.2 # via docker -werkzeug==2.3.6 +werkzeug==2.3.7 # via # flask # tensorboard -wheel==0.40.0 +wheel==0.41.2 # via # astunparse # tensorboard @@ -475,7 +480,7 @@ wrapt==1.14.1 # via # gordo-client # tensorflow -xarray==2023.7.0 +xarray==2023.8.0 # via gordo-core zipp==3.16.2 # via importlib-metadata diff --git a/requirements/test_requirements.txt b/requirements/test_requirements.txt index 9459e495a..3ddd4a799 100644 --- a/requirements/test_requirements.txt +++ b/requirements/test_requirements.txt @@ -1,34 +1,36 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --output-file=test_requirements.txt test_requirements.in +# pip-compile --no-emit-index-url --output-file=test_requirements.txt test_requirements.in # -anyio==3.6.2 +anyio==4.0.0 # via jupyter-server -argon2-cffi==21.3.0 +argon2-cffi==23.1.0 # via # jupyter-server # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -asttokens==2.1.0 +arrow==1.2.3 + # via isoduration +asttokens==2.3.0 # via stack-data -attrs==22.1.0 +attrs==23.1.0 # via # jsonschema - # pytest # pytest-mypy + # referencing backcall==0.2.0 # via ipython -beautifulsoup4==4.11.1 +beautifulsoup4==4.12.2 # via nbconvert black==22.12.0 # via -r test_requirements.in -bleach==5.0.1 +bleach==6.0.0 # via nbconvert -certifi==2022.12.7 +certifi==2023.7.22 # via # -c full_requirements.txt # requests @@ -36,23 +38,25 @@ cffi==1.15.1 # via # -c full_requirements.txt # argon2-cffi-bindings -charset-normalizer==3.1.0 +charset-normalizer==3.2.0 # via # -c full_requirements.txt # requests -click==8.1.3 +click==8.1.7 # via # -c full_requirements.txt # black -coverage[toml]==6.5.0 +comm==0.1.4 + # via ipykernel +coverage[toml]==7.3.0 # via pytest-cov -debugpy==1.6.3 +debugpy==1.6.7.post1 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -docker==6.0.1 +docker==6.1.3 # via # -c full_requirements.txt # -r test_requirements.in @@ -60,34 +64,42 @@ entrypoints==0.4 # via # -c full_requirements.txt # jupyter-client -exceptiongroup==1.1.1 - # via pytest -execnet==1.9.0 +exceptiongroup==1.1.3 + # via + # anyio + # ipython + # pytest +execnet==2.0.2 # via pytest-xdist executing==1.2.0 # via stack-data -fastjsonschema==2.16.2 +fastjsonschema==2.18.0 # via nbformat -filelock==3.8.0 +filelock==3.12.2 # via pytest-mypy +fqdn==1.5.1 + # via jsonschema idna==3.4 # via # -c full_requirements.txt # anyio + # jsonschema # requests -iniconfig==1.1.1 +iniconfig==2.0.0 # via pytest -ipykernel==6.17.0 +ipykernel==6.25.1 # via # nbclassic # notebook -ipython==8.6.0 +ipython==8.15.0 # via ipykernel ipython-genutils==0.2.0 # via # nbclassic # notebook -jedi==0.18.1 +isoduration==20.11.0 + # via jsonschema +jedi==0.19.0 # via ipython jinja2==3.1.2 # via @@ -96,30 +108,42 @@ jinja2==3.1.2 # nbclassic # nbconvert # notebook -jsonschema==4.17.0 - # via nbformat -jupyter-client==7.4.4 +jsonpointer==2.4 + # via jsonschema +jsonschema[format-nongpl]==4.19.0 + # via + # jupyter-events + # nbformat +jsonschema-specifications==2023.7.1 + # via jsonschema +jupyter-client==7.4.9 # via # ipykernel # jupyter-server # nbclassic # nbclient # notebook -jupyter-core==4.11.2 +jupyter-core==5.3.1 # via + # ipykernel # jupyter-client # jupyter-server # nbclassic + # nbclient # nbconvert # nbformat # notebook -jupyter-server==1.21.0 +jupyter-events==0.7.0 + # via jupyter-server +jupyter-server==2.7.3 # via # nbclassic # notebook-shim +jupyter-server-terminals==0.4.4 + # via jupyter-server jupyterlab-pygments==0.2.2 # via nbconvert -markupsafe==2.1.2 +markupsafe==2.1.3 # via # -c full_requirements.txt # jinja2 @@ -128,45 +152,46 @@ matplotlib-inline==0.1.6 # via # ipykernel # ipython -mistune==2.0.5 +mistune==3.0.1 # via nbconvert -mock==5.0.1 +mock==5.1.0 # via -r test_requirements.in -mypy==0.982 +mypy==1.5.1 # via pytest-mypy mypy-extensions==1.0.0 # via # -c full_requirements.txt # black # mypy -nbclassic==0.4.8 +nbclassic==1.0.0 # via notebook -nbclient==0.5.13 +nbclient==0.8.0 # via nbconvert -nbconvert==7.4.0 +nbconvert==7.8.0 # via # -r test_requirements.in # jupyter-server # nbclassic # notebook -nbformat==5.7.0 +nbformat==5.9.2 # via # jupyter-server # nbclassic # nbclient # nbconvert # notebook -nest-asyncio==1.5.6 +nest-asyncio==1.5.7 # via # ipykernel # jupyter-client # nbclassic - # nbclient # notebook -notebook==6.5.2 +notebook==6.5.5 # via -r test_requirements.in -notebook-shim==0.2.2 +notebook-shim==0.2.3 # via nbclassic +overrides==7.4.0 + # via jupyter-server packaging==21.3 # via # -c full_requirements.txt @@ -179,7 +204,7 @@ pandocfilters==1.5.0 # via nbconvert parso==0.8.3 # via jedi -pathspec==0.11.1 +pathspec==0.11.2 # via # -c full_requirements.txt # black @@ -187,19 +212,21 @@ pexpect==4.8.0 # via ipython pickleshare==0.7.5 # via ipython -platformdirs==2.5.2 - # via black -pluggy==1.0.0 +platformdirs==3.10.0 + # via + # black + # jupyter-core +pluggy==1.3.0 # via pytest -prometheus-client==0.16.0 +prometheus-client==0.17.1 # via # -c full_requirements.txt # jupyter-server # nbclassic # notebook -prompt-toolkit==3.0.31 +prompt-toolkit==3.0.39 # via ipython -psutil==5.9.3 +psutil==5.9.5 # via ipykernel ptyprocess==0.7.0 # via @@ -213,9 +240,9 @@ pycparser==2.21 # via # -c full_requirements.txt # cffi -pyflakes==2.5.0 +pyflakes==3.1.0 # via pytest-flakes -pygments==2.15.0 +pygments==2.16.1 # via # -c full_requirements.txt # ipython @@ -224,13 +251,7 @@ pyparsing==3.0.9 # via # -c full_requirements.txt # packaging -pyrsistent==0.19.2 - # via jsonschema -pysocks==1.7.1 - # via - # -c full_requirements.txt - # requests -pytest==7.2.2 +pytest==7.4.1 # via # -r test_requirements.in # pytest-benchmark @@ -242,25 +263,29 @@ pytest==7.2.2 # pytest-xdist pytest-benchmark==4.0.0 # via -r test_requirements.in -pytest-cov==4.0.0 +pytest-cov==4.1.0 # via -r test_requirements.in pytest-flakes==4.0.5 # via -r test_requirements.in -pytest-mock==3.10.0 +pytest-mock==3.11.1 # via -r test_requirements.in -pytest-mypy==0.10.0 +pytest-mypy==0.10.3 # via -r test_requirements.in pytest-timeout==2.1.0 # via -r test_requirements.in -pytest-xdist==3.2.1 +pytest-xdist==3.3.1 # via -r test_requirements.in python-dateutil==2.8.2 # via # -c full_requirements.txt + # arrow # jupyter-client -pyyaml==5.4.1 +python-json-logger==2.0.7 + # via jupyter-events +pyyaml==6.0.1 # via # -c full_requirements.txt + # jupyter-events # responses pyzmq==24.0.1 # via @@ -269,14 +294,31 @@ pyzmq==24.0.1 # jupyter-server # nbclassic # notebook -requests[socks]==2.28.2 +referencing==0.30.2 + # via + # jsonschema + # jsonschema-specifications + # jupyter-events +requests==2.31.0 # via # -c full_requirements.txt # docker # responses -responses==0.23.1 +responses==0.23.3 # via -r test_requirements.in -send2trash==1.8.0 +rfc3339-validator==0.1.4 + # via + # jsonschema + # jupyter-events +rfc3986-validator==0.1.1 + # via + # jsonschema + # jupyter-events +rpds-py==0.10.0 + # via + # jsonschema + # referencing +send2trash==1.8.2 # via # jupyter-server # nbclassic @@ -284,28 +326,31 @@ send2trash==1.8.0 six==1.16.0 # via # -c full_requirements.txt + # asttokens # bleach # python-dateutil + # rfc3339-validator sniffio==1.3.0 # via anyio -soupsieve==2.3.2.post1 +soupsieve==2.5 # via beautifulsoup4 -stack-data==0.6.0 +stack-data==0.6.2 # via ipython -terminado==0.17.0 +terminado==0.17.1 # via # jupyter-server + # jupyter-server-terminals # nbclassic # notebook tinycss2==1.2.1 # via nbconvert -tomli==1.2.3 +tomli==2.0.1 # via # black # coverage # mypy # pytest -tornado==6.3.2 +tornado==6.3.3 # via # ipykernel # jupyter-client @@ -313,12 +358,14 @@ tornado==6.3.2 # nbclassic # notebook # terminado -traitlets==5.5.0 +traitlets==5.9.0 # via + # comm # ipykernel # ipython # jupyter-client # jupyter-core + # jupyter-events # jupyter-server # matplotlib-inline # nbclassic @@ -326,41 +373,45 @@ traitlets==5.5.0 # nbconvert # nbformat # notebook -types-mock==4.0.15.2 +types-mock==5.1.0.2 # via -r test_requirements.in -types-python-dateutil==2.8.19.2 +types-python-dateutil==2.8.19.14 # via -r test_requirements.in -types-pytz==2022.6.0.1 +types-pytz==2023.3.0.1 # via -r test_requirements.in -types-pyyaml==6.0.12.1 +types-pyyaml==6.0.12.11 # via # -r test_requirements.in # responses -types-requests==2.28.11.2 +types-requests==2.31.0.2 # via -r test_requirements.in -types-setuptools==65.5.0.2 +types-setuptools==68.1.0.1 # via -r test_requirements.in -types-simplejson==3.17.7.1 +types-simplejson==3.19.0.2 # via -r test_requirements.in -types-urllib3==1.26.25.1 +types-urllib3==1.26.25.14 # via types-requests typing-extensions==4.5.0 # via # -c full_requirements.txt # mypy -urllib3==1.26.15 +uri-template==1.3.0 + # via jsonschema +urllib3==1.26.16 # via # -c full_requirements.txt # docker # requests # responses -wcwidth==0.2.5 +wcwidth==0.2.6 # via prompt-toolkit +webcolors==1.13 + # via jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.5.1 +websocket-client==1.6.2 # via # -c full_requirements.txt # docker diff --git a/scripts/trivy_scan.sh b/scripts/trivy_scan.sh index 069aeae00..662ac0d75 100644 --- a/scripts/trivy_scan.sh +++ b/scripts/trivy_scan.sh @@ -28,4 +28,4 @@ trivy_version=$(trivy -v 2>/dev/null | head -1 | cut -d ' ' -f 2); echo "Trivy version is ${trivy_version} and platform is ${uname}" echo "Scanning image - '$image'" -trivy image --clear-cache --exit-code 10 -severity HIGH,CRITICAL --light --no-progress --ignore-unfixed --timeout "5m" "$image" +trivy image --clear-cache --exit-code 10 --severity HIGH,CRITICAL --no-progress --ignore-unfixed --timeout "5m" "$image" diff --git a/tests/gordo/machine/test_machine.py b/tests/gordo/machine/test_machine.py index cb8e80556..0480bfa68 100644 --- a/tests/gordo/machine/test_machine.py +++ b/tests/gordo/machine/test_machine.py @@ -53,7 +53,7 @@ def test_to_json(): def test_to_yaml(): machine = create_machine() yaml_result = machine.to_yaml() - result = yaml.load(yaml_result) + result = yaml.load(yaml_result, Loader=yaml.FullLoader) for field in MACHINE_YAML_FIELDS: if field in result: - yaml.load(result[field]) + yaml.load(result[field], Loader=yaml.FullLoader) diff --git a/tests/gordo/serializer/test_serializer_from_definition.py b/tests/gordo/serializer/test_serializer_from_definition.py index 4260c81c9..b97ee3e9c 100644 --- a/tests/gordo/serializer/test_serializer_from_definition.py +++ b/tests/gordo/serializer/test_serializer_from_definition.py @@ -74,7 +74,7 @@ def test_from_definition_test_model(): tests.gordo.serializer.definition_test_model.DefinitionTestModel: depth: "300" """ - definition = yaml.load(config) + definition = yaml.load(config, Loader=yaml.FullLoader) model = serializer.from_definition(definition) assert type(model) == DefinitionTestModel assert model.depth == 300 @@ -222,7 +222,7 @@ def test_from_definition(self): for raw_yaml, model, model_kind in self.setup_gen(): self.assertTrue(model) logger.info(raw_yaml) - config = yaml.load(raw_yaml) + config = yaml.load(raw_yaml, Loader=yaml.FullLoader) logger.debug("{}".format(config)) config_clone = copy.deepcopy(config) # To ensure no mutation occurs diff --git a/tests/gordo/workflow/test_workflow_generator/test_workflow_generator.py b/tests/gordo/workflow/test_workflow_generator/test_workflow_generator.py index 991eb1bab..547db5916 100644 --- a/tests/gordo/workflow/test_workflow_generator/test_workflow_generator.py +++ b/tests/gordo/workflow/test_workflow_generator/test_workflow_generator.py @@ -363,7 +363,7 @@ def test_runtime_image_override(path_to_config_files): server_task_deployment = server_task["steps"][0][0]["arguments"]["parameters"][0][ "value" ] - server_task_yaml = yaml.load(server_task_deployment) + server_task_yaml = yaml.load(server_task_deployment, Loader=yaml.FullLoader) actual_server_task_image = ( server_task_yaml["spec"]["template"]["spec"]["containers"][0]["image"] .split("/")[-1]