From d0917e3e660543637da8d07691c4b0c3b90552e2 Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Thu, 3 Apr 2025 16:04:10 +0800 Subject: [PATCH 01/55] bump base version for v2.14 (#21819) Signed-off-by: wang yan --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c757c9824bf..d4174a4e192 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.13.0 +v2.14.0 From 7ad799c7c7937abd6c00bfa6bfcf81522451c14f Mon Sep 17 00:00:00 2001 From: Prasanth Baskar Date: Mon, 7 Apr 2025 13:56:52 +0530 Subject: [PATCH 02/55] Update dependencies in Harbor UI (#21823) * deps: update src/portal/app-swagger-ui Signed-off-by: bupd * deps: update swagger-ui Signed-off-by: bupd * deps: update src/portal Signed-off-by: bupd --------- Signed-off-by: bupd --- src/portal/app-swagger-ui/package-lock.json | 2325 +++++++++---------- src/portal/app-swagger-ui/package.json | 2 +- src/portal/package-lock.json | 128 +- 3 files changed, 1111 insertions(+), 1344 deletions(-) diff --git a/src/portal/app-swagger-ui/package-lock.json b/src/portal/app-swagger-ui/package-lock.json index f7056ef22ac..06fb6d26da0 100644 --- a/src/portal/app-swagger-ui/package-lock.json +++ b/src/portal/app-swagger-ui/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "css-loader": "^6.11.0", "style-loader": "^3.3.4", - "swagger-ui": "5.17.14" + "swagger-ui": "5.20.1" }, "devDependencies": { "clean-webpack-plugin": "^4.0.0", @@ -22,9 +22,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -33,9 +33,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", - "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", + "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -44,11 +44,6 @@ "node": ">=6.9.0" } }, - "node_modules/@braintree/sanitize-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.2.tgz", - "integrity": "sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==" - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -151,13 +146,19 @@ "node": ">= 8" } }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true + }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-alpha.9.tgz", - "integrity": "sha512-SAOQrFSFwgDiI4QSIPDwAIJEb4Za+8bu45sNojgV3RMtCz+n4Agw66iqGsDib5YSI/Cg1h4AKFovT3iWdfGWfw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.30.tgz", + "integrity": "sha512-5Wj3zdt0dxS9ERVk4qSuqDIsMQ8dP2vop8b494OpJ/O2W261yCV39Z+vN+PqeJ2NiKDRMlJ+QoQ1uVfKwEo8Kg==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -165,13 +166,13 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-alpha.9.tgz", - "integrity": "sha512-vGl8BWRf6ODl39fxElcIOjRE2QG5AJhn8tTNMqjjHB/2WppNBuxOVStYZeVJoWfK03OPK8v4Fp/TAcaP9+R7DQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.30.tgz", + "integrity": "sha512-pDnUhXIKKUvmeezQfwKLL05rkOH1L7ueiy5ja5ob9y2w4r+HXDID7qHtDGeRxKZoIt4E3Sd1K37OjcE9fNcknQ==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -181,36 +182,51 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-alpha.9.tgz", - "integrity": "sha512-FU/2sFSgsICB9HYFELJ79caRpXXzlAV41QTHsAM46WfRehbzZUQpOBQm4jRi3qJGSa/Jk+mQ7Vt8HLRFMpJFfg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.30.tgz", + "integrity": "sha512-hVDx0kUF1DTyaEXwmsF3wpJClEfnH0pxjEubqtvHpjjeTMgZzmKc5azbYtvgBX3uUpGHyQZyG/O9g94/wIhhMA==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-alpha.9.tgz", - "integrity": "sha512-/W8Ktbgbs29zdhed6KHTFk0qmuIRbvEFi8wu2MHGQ5UT4i99Bdu2OyUiayhnpejWztfQxDgL08pjrQPEwgY8Yg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.30.tgz", + "integrity": "sha512-G+BDNXU/ARJCbJiFq1A6dh6pNDDp1J0jPfKeIHjsD8aZoRdpJC0F3F7onm8TjQm2cnvAi4B7vPOKzjWrYN1VWw==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-alpha.9.tgz", - "integrity": "sha512-aduC2vbwGgn6ia9IkKpqBYBaKyIDGM/80M3oU3DFgaYIIwynzuwVpN1TkBOLIFy3mAzkWoYKUS0jdZJhMy/6Ug==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.30.tgz", + "integrity": "sha512-YsFtttsq39qVU2J9lMD3i+aeuiMD8EjeageszDEePYgb4/k2PZX9YJqb9urwxydBM7BFG7H/r9K/dVUMHFV5hw==", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-arazzo-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.30.tgz", + "integrity": "sha512-HpszcpuDlSOXWruHzasR64L8640VHVDuy8xXJrhx1iBu+gDHriOM8gbh8jQgWST91H0smtPeTG9WV1/h6frhRw==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -218,28 +234,58 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-hZjxXJgMt517ADnAauWJh01k7WNRwkbWT5p6b7AXF2H3tl549A2hhLnIg3BBSE3GwB3Nv25GyrI3aA/1dFVC8A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-/DvnCZY2cVz8E79Nc5mXD8J0++D8QT/c1PKPMMGEGVwGWB6XLh8jZM0HERb6yAiLUC0qzv4Jau/iQH1gs/ZtiQ==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, + "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.30.tgz", + "integrity": "sha512-HZL76SJaUDmL1GuFcev23UX1vVuxSHIED3vvKso+k3KWNfVWZJrr7GX1ELJx84fWW8g3b5S5+nyz5q1ApT084A==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.30.tgz", + "integrity": "sha512-D2adAcu/ISoBe0zRbcX0HyaDvWoMhmaL8iPR4pvjLY7soB2tCR4uLEzAkqPa2zaOKBRA2ziF74aNKrKbM5sX8w==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-alpha.9.tgz", - "integrity": "sha512-OfX4UBb08C0xD5+F80dQAM2yt5lXxcURWkVEeCwxz7i23BB3nNEbnZXNV91Qo9eaJflPh8dO9iiHQxvfw5IgSg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.30.tgz", + "integrity": "sha512-u5YMIw/g74Z59wPBFS2A2LaheC+EEqRcbpUQOApTvb6zjW+xWxbCuKV1ypzIaVDDPIry8e3mpwjjXLj1mvad5w==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -247,15 +293,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-alpha.9.tgz", - "integrity": "sha512-qzUVRSSrnlYGMhK6w57o/RboNvy1FO0iFgEnTk56dD4wN49JRNuFqKI18IgXc1W2r9tTTG70nG1khe4cPE8TNg==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.30.tgz", + "integrity": "sha512-/Mp11+tBKTN6XnpOiQo/cKnqmvfJhdCniHCK6Bg8wpCI3dMi+nSSpIYgWEPVQfNsLtf/PaYegrtYY56W4UzNRw==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -263,15 +308,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-alpha.9.tgz", - "integrity": "sha512-Zml8Z8VCckdFjvTogaec1dabd85hg1+xZDseWcCuD0tYkaTY/sZ8zzI0dz6/4HsKCb58qjiWSa0w60N8Syr6WQ==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.30.tgz", + "integrity": "sha512-6sZ0LLYnEz9KXtt9xTRSc0EORBl5Fj3LUbfabUjqLQZGldsJWU+3TTQ4XtzFFHlan7z2WYyALKP7iP+b60XbPg==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -279,15 +323,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-WUZxt7Gs7P4EQsGtoD6cKAjf0uDJhkUxsIW9Bb4EAgO6tdp7LlXhbJ0fJ2QycCLY717SfJbvGLfhuSfTYo4Iow==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-nloJUjf6AtKRnBuWmaFkVk7lR7aht9cudXkR/W0ui+feLSJ5rnYy6nyLyGFLZqLnb2cSV8L6bB6tGPJnvc5KzA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -295,14 +339,14 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-7ra5uoZGrfCn1LabfJLueChPcYXyg24//LCYBtjTstyueqd5Vp7JCPeP5NnJSAaqVAP47r8ygceBPoxNp9k1EQ==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-7bz6kCgjStTKGGI4wBP2ho574lyfjH5EDPPuXhkwmAG2mOn9MZezlQhsbdo3B+vbi/58mqQb2XCoB4aeP1F+GQ==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -310,288 +354,315 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-nQOwNQgf0C8EVjf2loAAl4ifRuVOdcqycvXUdcTpsUfHN3fbndR8IKpb26mQNmnACmqgmX+LkbMdW9b+K6089g==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-pq2jxSp0I6xnGzyAiEXWYMuurp8H7TlOQ6Ijr/XX54gNmaIK+yQ3HXc7S6FZx+B2kQx03Tb8Y8O7L7J7YnmFiA==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, - "node_modules/@swagger-api/apidom-ns-workflows-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-yKo0p8OkQmDib93Kt1yqWmI7JsD6D9qUHxr/SCuAmNNWny1hxm7cZGoKJwJlGd0uAg84j4vmzWOlG3AsJbnT8g==", + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.30.tgz", + "integrity": "sha512-ER5kQtxOXG8W1cQC7xH8EYYUOAMaqVrECIZShoa6yOLoI0/a40xFF5Lansn2P9szR1hT/2neM8KLcjaxCFjXSQ==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.3" + "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-xfVMR4HrTzXU0HB4TtxwkNbUIa/cQrPa0BWutJZ0fMYMAtUox2s8GsFYnJfZP52XfpSHFM1VPclivorZqET14g==", + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.30.tgz", + "integrity": "sha512-Xghcidv1TJVwrb/jFHQZA5YHPm+LxNPpFjOJYrijugXK72D3a5fqc/2PZzkGXeYefE4lGM+YB83c08N6NDCa4w==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-alpha.9.tgz", - "integrity": "sha512-lJZkrhZ8qRTtc5fSLKefCv8j7Xzo8UBfMjpqTJhmETAtU8YfVV2i2znjgxJpm0QwV6FVQqGfK1+ASZQWPLiVcA==", + "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.30.tgz", + "integrity": "sha512-SZajkrTJ7c1I9CI3gnsdHZCQFSIyQ2H/lkWDjA/drZkRcfbR1CTbR2q0BGGlV5Y+nFHBxjRNpPbYbZrqh0WV4w==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.30.tgz", + "integrity": "sha512-T+N1ix+V5IpOWMFcamQRI50830JayD1gifnRm+mVeWJKMzp+xm08bnO8NiR9LQ2SKJZ6FWYM38oG2tAt0Lwxcg==", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-65nmKdPzw4C1bmtYn+3zoxXCI6Gnobr0StI9XE0YWiK+lpso7RH3Cgyl1yPZ0DBRVGzP+Fn9FVzmDNulEfR95w==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-KjyF966T9HVvSsk+RWaOcNDxXBqOWr/09SAw1OdBBfGHqs+xF3KOV7/2RB88Adw3+ZZ3E5oXDvVVhobq8wVvyA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-RLI4FpVB3vB6mIuT77yrsv5V2LMZ80dW9XpV+Fmbd4Jkdj+ysAFwT38cI4AsUMOxixpTDIXY1oWD7AjvylHhQQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-+6zlRD0nP7T5Yiu9hHgP3b7d016WYRXqfr9TW/yqPFInM/tI74ROPJnMQ1G3s0HyW6lB0KX7cG0O0TqcMmnSqg==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-aOewp8/3zobf/O+5Jx8y7+bX3BPRfRlHIv15qp4YVTsLs6gLISWSzTO9JpWe9cR+AfhpsAalFq4t1LwIkmLk4A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.30.tgz", + "integrity": "sha512-cciT19OOXafwBnXe9KFVwUGEVu4Zrvb4k12TYNlNqzVg1xA9pBc3Ywq5EgHIhiiQOLY3fILr0fr6B36N6irN2Q==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-zgtsAfkplCFusX2P/saqdn10J8P3kQizCXxHLvxd2j0EhMJk2wfu4HYN5Pej/7/qf/OR1QZxqtacwebd4RfpXA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-Q5b9XVTId/FiGSmGKSOxyKJZYdvWcZOqogpLkF0Q8PtPVCgp2LFl73XuJOgjxO1nkE+n/ap+93svgaaxQRaVow==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-iPuHf0cAZSUhSv8mB0FnVgatTc26cVYohgqz2cvjoGofdqoh5KKIfxOkWlIhm+qGuBp71CfZUrPYPRsd0dHgeg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-VsDpKXmRl6sXpgR6o582yyDJqfFfliYVrVWve0DCOTkpvOeOYqPPLA45oMMvunJkqVsBL4Fpy9/ZqAQvdlur7g==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-jwkfO7tzZyyrAgok+O9fKFOv1q/5njMb9DBc3D/ZF3ZLTcnEw8uj4V2HkjKxUweH5k8ip/gc8ueKmO/i7p2fng==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-Q2NQ1/IF500mFuZZDC3tTw75UOTgSknqRyBywsA159BRnqnWxwk/2//Ifh8Vwq/mMyW2zSChigCvnqI+/IvQxA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jEIDpjbjwFKXQXS/RHJeA4tthsguLoz+nJPYS3AOLfuSiby5QXsKTxgqHXxG/YJqF1xJbZL+5KcF8UyiDePumw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-6Zj1UtbQIwnsVJi2xn+Zl9yn9U014XzkX6QKrpAXIUGNCcjwWIbuOKd3u2T481OOP0BuVf3JpWhRqxumtosV3w==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-ieJL8dfIF8fmP3uJRNh/duJa3cCIIv6MzUe6o4uPT/oTDroy4qIATvnq9Dq/gtAv6rcPRpA9VhyghJ1DmjKsZQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-YaGDkZaV9ZRtbIGorsyyqL2x323gLMqqgLrPpAjaBbBFiAJRwF/gwRHMY4iJ85H2YeUxUq0jqtSc3jH3wsQJGg==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-EatIH7PZQSNDsRn9ompc62MYzboY7wAkjfYz+2FzBaSA8Vl5/+740qGQj22tu/xhwW4K72aV2NNL1m47QVF7hA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-rBa7daaUrDVAIwJZm+S4lwc5pqNt6avNTGxEB69dNZ3QDJmCC+HUnudUtsG3VqMfP46JITKUPvtzRLGjX8CgRg==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-LylC2cQdAmvR7bXqwMwBt6FHTMVGinwIdI8pjl4EbPT9hCVm1rdED53caTYM4gCm+CJGRw20r4gb9vn3+N6RrA==", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.30.tgz", + "integrity": "sha512-NRmQehyw4gbDzeBAl0zjyPqj4e/jNYgqnRLcOsxTKpWODud8RHBqEvju/M6iET6ru0o+A9265efFzqR9hiE0LA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.0.0", + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" } }, - "node_modules/@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-TlA4+1ca33D7fWxO5jKBytSCv86IGI4Lze4JfrawWUXZ5efhi4LiNmW5TrGlZUyvL7yJtZcA4tn3betlj6jVwA==", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "hasInstallScript": true, "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jSIHEB7lbh+MP3BhYIXFkeivDR01kugXN70e5FskW7oet2TIARsVEPheWKQFSP1U8bUZA4bsp9h9gOQ9xEeErw==", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-alpha.9.tgz", - "integrity": "sha512-KQ6wB5KplqdSsjxdA8BaQulj5zlF5VBCd5KP3RN/9vvixgsD/gyrVY59nisdzmPTqiL6yjhk612eQ96MgG8KiA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.30.tgz", + "integrity": "sha512-l1MpLMlmaX+y2hra5EadfR37sAMzmEz1wZomVcnw7vJEFlLQo3WwOdFvpQemPCZ9IJHUs+5zhZ++w7z60uKpSw==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", - "axios": "^1.4.0", + "axios": "^1.8.2", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-error": "^1.0.0-alpha.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1" + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0" } }, "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { @@ -616,6 +687,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@swaggerexpert/cookie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@swaggerexpert/cookie/-/cookie-2.0.2.tgz", + "integrity": "sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==", + "dependencies": { + "apg-lite": "^1.0.3" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -821,15 +903,21 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, "node_modules/@types/ws": { "version": "8.5.12", @@ -1179,9 +1267,9 @@ } }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1230,17 +1318,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -1343,30 +1420,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1400,6 +1453,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -1492,12 +1557,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -1663,6 +1722,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -1706,9 +1766,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -1822,21 +1882,6 @@ "ms": "2.0.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1961,15 +2006,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -2051,9 +2087,12 @@ } }, "node_modules/dompurify": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.4.tgz", - "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/domutils": { "version": "2.8.0", @@ -2087,6 +2126,19 @@ "node": ">=4" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2107,15 +2159,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -2150,13 +2193,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -2165,7 +2204,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -2175,6 +2213,31 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2274,15 +2337,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", @@ -2488,12 +2542,13 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -2526,12 +2581,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -2562,22 +2611,25 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2586,6 +2638,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -2598,12 +2662,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2662,12 +2720,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2704,11 +2761,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -2716,11 +2772,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2732,7 +2790,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2782,6 +2839,11 @@ "node": "*" } }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==" + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -3081,12 +3143,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -3454,6 +3510,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3560,18 +3624,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minim": { "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", @@ -3601,21 +3653,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3635,12 +3672,6 @@ "multicast-dns": "cli.js" } }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -3658,12 +3689,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -3696,23 +3721,20 @@ "tslib": "^2.0.3" } }, - "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, + "node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -3756,6 +3778,17 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -3845,7 +3878,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "dependencies": { "wrappy": "1" } @@ -3883,22 +3916,22 @@ } }, "node_modules/openapi-path-templating": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-1.6.0.tgz", - "integrity": "sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.2.1.tgz", + "integrity": "sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" } }, "node_modules/openapi-server-url-templating": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.1.0.tgz", - "integrity": "sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" @@ -4220,32 +4253,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -4257,9 +4264,9 @@ } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "engines": { "node": ">=6" } @@ -4327,16 +4334,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4462,21 +4459,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -4559,16 +4541,16 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", "redux": "^5.0.0" }, "peerDependenciesMeta": { @@ -4581,12 +4563,13 @@ } }, "node_modules/react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", + "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" @@ -4599,7 +4582,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5145,9 +5128,9 @@ } }, "node_modules/short-unique-id": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", - "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.2.tgz", + "integrity": "sha512-MlRVyT5RYfDO2kUzBgOPlZriRzG+NIAuwSy1HBN8tahXyFi3+804GGi/mzjUsi6VxgiQuDgMnhoI2FqmSHX8Tg==", "bin": { "short-unique-id": "bin/short-unique-id", "suid": "bin/short-unique-id" @@ -5177,51 +5160,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -5373,7 +5311,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -5399,15 +5337,6 @@ "node": ">=6" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -5450,41 +5379,42 @@ } }, "node_modules/swagger-client": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.29.3.tgz", - "integrity": "sha512-OhhMAO2dwDEaxtUNDxwaqzw75uiZY5lX/2vx+U6eKCYZYhXWQ5mylU/0qfk/xMR20VyitsnzRc6KcFFjRoCS7A==", + "version": "3.34.4", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.34.4.tgz", + "integrity": "sha512-Qvtu8DtARAx5GwefA0eV1WRLa4Q9bhczrtNAsiBMOx3HkxAOczy1APQhrcblJdLys0xEGQ4xYizYFXfIL9BhpA==", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-error": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-reference": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "cookie": "~0.6.0", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^1.5.1", - "openapi-server-url-templating": "^1.0.0", + "openapi-path-templating": "^2.2.1", + "openapi-server-url-templating": "^1.3.0", "ramda": "^0.30.1", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.1.0" } }, "node_modules/swagger-ui": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.17.14.tgz", - "integrity": "sha512-z9pOymwowrgkoMKNsRSN6QjOyYrMAnc4iohEebnS/ELT5jjdB13Lu4f3Bl4+o2Mw5B6QOyo4vibr/A/Vb7UbMQ==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.20.1.tgz", + "integrity": "sha512-ZgAnhAAW7ZFsfYaBc8rhOCNIohI7vDNrL66ZLa5Slt1YQsj99b7FajOXED27U+RtBiiQqXWspjDw8W6F1qvu2Q==", "dependencies": { - "@babel/runtime-corejs3": "^7.24.5", - "@braintree/sanitize-url": "=7.0.2", + "@babel/runtime-corejs3": "^7.26.7", + "@scarf/scarf": "=1.4.0", "base64-js": "^1.5.1", "classnames": "^2.5.1", "css.escape": "1.5.1", "deep-extend": "0.6.0", - "dompurify": "=3.1.4", + "dompurify": "=3.2.4", "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", @@ -5500,15 +5430,15 @@ "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "^2.2.0", "react-inspector": "^6.0.1", - "react-redux": "^9.1.2", - "react-syntax-highlighter": "^15.5.0", + "react-redux": "^9.2.0", + "react-syntax-highlighter": "^15.6.1", "redux": "^5.0.1", "redux-immutable": "^4.0.0", "remarkable": "^2.0.1", - "reselect": "^5.1.0", + "reselect": "^5.1.1", "serialize-error": "^8.1.0", "sha.js": "^2.4.11", - "swagger-client": "^3.28.1", + "swagger-client": "^3.34.1", "url-parse": "^1.5.10", "xml": "=1.0.1", "xml-but-prettier": "^1.0.1", @@ -5523,34 +5453,6 @@ "node": ">=6" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/terser": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", @@ -5684,34 +5586,34 @@ } }, "node_modules/tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "hasInstallScript": true, "optional": true, + "peer": true, "dependencies": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" } }, "node_modules/tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.18.0" - } - }, - "node_modules/tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", "hasInstallScript": true, "optional": true, "dependencies": { - "nan": "^2.14.0" + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } } }, "node_modules/ts-mixer": { @@ -5729,18 +5631,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5839,11 +5729,11 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util-deprecate": { @@ -5914,9 +5804,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", "optional": true }, "node_modules/webpack": { @@ -6233,7 +6123,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "dev": true }, "node_modules/ws": { "version": "8.18.0", @@ -6285,27 +6175,22 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/runtime-corejs3": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", - "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", + "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", "requires": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, - "@braintree/sanitize-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.2.tgz", - "integrity": "sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==" - }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -6387,13 +6272,18 @@ "fastq": "^1.6.0" } }, + "@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==" + }, "@swagger-api/apidom-ast": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-alpha.9.tgz", - "integrity": "sha512-SAOQrFSFwgDiI4QSIPDwAIJEb4Za+8bu45sNojgV3RMtCz+n4Agw66iqGsDib5YSI/Cg1h4AKFovT3iWdfGWfw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.30.tgz", + "integrity": "sha512-5Wj3zdt0dxS9ERVk4qSuqDIsMQ8dP2vop8b494OpJ/O2W261yCV39Z+vN+PqeJ2NiKDRMlJ+QoQ1uVfKwEo8Kg==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6401,13 +6291,13 @@ } }, "@swagger-api/apidom-core": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-alpha.9.tgz", - "integrity": "sha512-vGl8BWRf6ODl39fxElcIOjRE2QG5AJhn8tTNMqjjHB/2WppNBuxOVStYZeVJoWfK03OPK8v4Fp/TAcaP9+R7DQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.30.tgz", + "integrity": "sha512-pDnUhXIKKUvmeezQfwKLL05rkOH1L7ueiy5ja5ob9y2w4r+HXDID7qHtDGeRxKZoIt4E3Sd1K37OjcE9fNcknQ==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -6417,36 +6307,51 @@ } }, "@swagger-api/apidom-error": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-alpha.9.tgz", - "integrity": "sha512-FU/2sFSgsICB9HYFELJ79caRpXXzlAV41QTHsAM46WfRehbzZUQpOBQm4jRi3qJGSa/Jk+mQ7Vt8HLRFMpJFfg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.30.tgz", + "integrity": "sha512-hVDx0kUF1DTyaEXwmsF3wpJClEfnH0pxjEubqtvHpjjeTMgZzmKc5azbYtvgBX3uUpGHyQZyG/O9g94/wIhhMA==", "requires": { "@babel/runtime-corejs3": "^7.20.7" } }, "@swagger-api/apidom-json-pointer": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-alpha.9.tgz", - "integrity": "sha512-/W8Ktbgbs29zdhed6KHTFk0qmuIRbvEFi8wu2MHGQ5UT4i99Bdu2OyUiayhnpejWztfQxDgL08pjrQPEwgY8Yg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.30.tgz", + "integrity": "sha512-G+BDNXU/ARJCbJiFq1A6dh6pNDDp1J0jPfKeIHjsD8aZoRdpJC0F3F7onm8TjQm2cnvAi4B7vPOKzjWrYN1VWw==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-alpha.9.tgz", - "integrity": "sha512-aduC2vbwGgn6ia9IkKpqBYBaKyIDGM/80M3oU3DFgaYIIwynzuwVpN1TkBOLIFy3mAzkWoYKUS0jdZJhMy/6Ug==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.30.tgz", + "integrity": "sha512-YsFtttsq39qVU2J9lMD3i+aeuiMD8EjeageszDEePYgb4/k2PZX9YJqb9urwxydBM7BFG7H/r9K/dVUMHFV5hw==", + "optional": true, + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "@swagger-api/apidom-ns-arazzo-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.30.tgz", + "integrity": "sha512-HpszcpuDlSOXWruHzasR64L8640VHVDuy8xXJrhx1iBu+gDHriOM8gbh8jQgWST91H0smtPeTG9WV1/h6frhRw==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6454,28 +6359,58 @@ } }, "@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-hZjxXJgMt517ADnAauWJh01k7WNRwkbWT5p6b7AXF2H3tl549A2hhLnIg3BBSE3GwB3Nv25GyrI3aA/1dFVC8A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-/DvnCZY2cVz8E79Nc5mXD8J0++D8QT/c1PKPMMGEGVwGWB6XLh8jZM0HERb6yAiLUC0qzv4Jau/iQH1gs/ZtiQ==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, + "@swagger-api/apidom-ns-json-schema-2019-09": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.30.tgz", + "integrity": "sha512-HZL76SJaUDmL1GuFcev23UX1vVuxSHIED3vvKso+k3KWNfVWZJrr7GX1ELJx84fWW8g3b5S5+nyz5q1ApT084A==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "@swagger-api/apidom-ns-json-schema-2020-12": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.30.tgz", + "integrity": "sha512-D2adAcu/ISoBe0zRbcX0HyaDvWoMhmaL8iPR4pvjLY7soB2tCR4uLEzAkqPa2zaOKBRA2ziF74aNKrKbM5sX8w==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, "@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-alpha.9.tgz", - "integrity": "sha512-OfX4UBb08C0xD5+F80dQAM2yt5lXxcURWkVEeCwxz7i23BB3nNEbnZXNV91Qo9eaJflPh8dO9iiHQxvfw5IgSg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.30.tgz", + "integrity": "sha512-u5YMIw/g74Z59wPBFS2A2LaheC+EEqRcbpUQOApTvb6zjW+xWxbCuKV1ypzIaVDDPIry8e3mpwjjXLj1mvad5w==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6483,15 +6418,14 @@ } }, "@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-alpha.9.tgz", - "integrity": "sha512-qzUVRSSrnlYGMhK6w57o/RboNvy1FO0iFgEnTk56dD4wN49JRNuFqKI18IgXc1W2r9tTTG70nG1khe4cPE8TNg==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.30.tgz", + "integrity": "sha512-/Mp11+tBKTN6XnpOiQo/cKnqmvfJhdCniHCK6Bg8wpCI3dMi+nSSpIYgWEPVQfNsLtf/PaYegrtYY56W4UzNRw==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6499,15 +6433,14 @@ } }, "@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-alpha.9.tgz", - "integrity": "sha512-Zml8Z8VCckdFjvTogaec1dabd85hg1+xZDseWcCuD0tYkaTY/sZ8zzI0dz6/4HsKCb58qjiWSa0w60N8Syr6WQ==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.30.tgz", + "integrity": "sha512-6sZ0LLYnEz9KXtt9xTRSc0EORBl5Fj3LUbfabUjqLQZGldsJWU+3TTQ4XtzFFHlan7z2WYyALKP7iP+b60XbPg==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6515,15 +6448,15 @@ } }, "@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-WUZxt7Gs7P4EQsGtoD6cKAjf0uDJhkUxsIW9Bb4EAgO6tdp7LlXhbJ0fJ2QycCLY717SfJbvGLfhuSfTYo4Iow==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-nloJUjf6AtKRnBuWmaFkVk7lR7aht9cudXkR/W0ui+feLSJ5rnYy6nyLyGFLZqLnb2cSV8L6bB6tGPJnvc5KzA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6531,14 +6464,14 @@ } }, "@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-7ra5uoZGrfCn1LabfJLueChPcYXyg24//LCYBtjTstyueqd5Vp7JCPeP5NnJSAaqVAP47r8ygceBPoxNp9k1EQ==", - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-7bz6kCgjStTKGGI4wBP2ho574lyfjH5EDPPuXhkwmAG2mOn9MZezlQhsbdo3B+vbi/58mqQb2XCoB4aeP1F+GQ==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6546,282 +6479,302 @@ } }, "@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-nQOwNQgf0C8EVjf2loAAl4ifRuVOdcqycvXUdcTpsUfHN3fbndR8IKpb26mQNmnACmqgmX+LkbMdW9b+K6089g==", - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-pq2jxSp0I6xnGzyAiEXWYMuurp8H7TlOQ6Ijr/XX54gNmaIK+yQ3HXc7S6FZx+B2kQx03Tb8Y8O7L7J7YnmFiA==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, - "@swagger-api/apidom-ns-workflows-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-yKo0p8OkQmDib93Kt1yqWmI7JsD6D9qUHxr/SCuAmNNWny1hxm7cZGoKJwJlGd0uAg84j4vmzWOlG3AsJbnT8g==", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.30.tgz", + "integrity": "sha512-ER5kQtxOXG8W1cQC7xH8EYYUOAMaqVrECIZShoa6yOLoI0/a40xFF5Lansn2P9szR1hT/2neM8KLcjaxCFjXSQ==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.3" + "ramda-adjunct": "^5.0.0" } }, - "@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-xfVMR4HrTzXU0HB4TtxwkNbUIa/cQrPa0BWutJZ0fMYMAtUox2s8GsFYnJfZP52XfpSHFM1VPclivorZqET14g==", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.30.tgz", + "integrity": "sha512-Xghcidv1TJVwrb/jFHQZA5YHPm+LxNPpFjOJYrijugXK72D3a5fqc/2PZzkGXeYefE4lGM+YB83c08N6NDCa4w==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-alpha.9.tgz", - "integrity": "sha512-lJZkrhZ8qRTtc5fSLKefCv8j7Xzo8UBfMjpqTJhmETAtU8YfVV2i2znjgxJpm0QwV6FVQqGfK1+ASZQWPLiVcA==", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.30.tgz", + "integrity": "sha512-SZajkrTJ7c1I9CI3gnsdHZCQFSIyQ2H/lkWDjA/drZkRcfbR1CTbR2q0BGGlV5Y+nFHBxjRNpPbYbZrqh0WV4w==", + "optional": true, + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.30.tgz", + "integrity": "sha512-T+N1ix+V5IpOWMFcamQRI50830JayD1gifnRm+mVeWJKMzp+xm08bnO8NiR9LQ2SKJZ6FWYM38oG2tAt0Lwxcg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-65nmKdPzw4C1bmtYn+3zoxXCI6Gnobr0StI9XE0YWiK+lpso7RH3Cgyl1yPZ0DBRVGzP+Fn9FVzmDNulEfR95w==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-KjyF966T9HVvSsk+RWaOcNDxXBqOWr/09SAw1OdBBfGHqs+xF3KOV7/2RB88Adw3+ZZ3E5oXDvVVhobq8wVvyA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-RLI4FpVB3vB6mIuT77yrsv5V2LMZ80dW9XpV+Fmbd4Jkdj+ysAFwT38cI4AsUMOxixpTDIXY1oWD7AjvylHhQQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-+6zlRD0nP7T5Yiu9hHgP3b7d016WYRXqfr9TW/yqPFInM/tI74ROPJnMQ1G3s0HyW6lB0KX7cG0O0TqcMmnSqg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-aOewp8/3zobf/O+5Jx8y7+bX3BPRfRlHIv15qp4YVTsLs6gLISWSzTO9JpWe9cR+AfhpsAalFq4t1LwIkmLk4A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.30.tgz", + "integrity": "sha512-cciT19OOXafwBnXe9KFVwUGEVu4Zrvb4k12TYNlNqzVg1xA9pBc3Ywq5EgHIhiiQOLY3fILr0fr6B36N6irN2Q==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + }, + "dependencies": { + "tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "optional": true, + "requires": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + } + } } }, "@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-zgtsAfkplCFusX2P/saqdn10J8P3kQizCXxHLvxd2j0EhMJk2wfu4HYN5Pej/7/qf/OR1QZxqtacwebd4RfpXA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-Q5b9XVTId/FiGSmGKSOxyKJZYdvWcZOqogpLkF0Q8PtPVCgp2LFl73XuJOgjxO1nkE+n/ap+93svgaaxQRaVow==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-iPuHf0cAZSUhSv8mB0FnVgatTc26cVYohgqz2cvjoGofdqoh5KKIfxOkWlIhm+qGuBp71CfZUrPYPRsd0dHgeg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-VsDpKXmRl6sXpgR6o582yyDJqfFfliYVrVWve0DCOTkpvOeOYqPPLA45oMMvunJkqVsBL4Fpy9/ZqAQvdlur7g==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-jwkfO7tzZyyrAgok+O9fKFOv1q/5njMb9DBc3D/ZF3ZLTcnEw8uj4V2HkjKxUweH5k8ip/gc8ueKmO/i7p2fng==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-Q2NQ1/IF500mFuZZDC3tTw75UOTgSknqRyBywsA159BRnqnWxwk/2//Ifh8Vwq/mMyW2zSChigCvnqI+/IvQxA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jEIDpjbjwFKXQXS/RHJeA4tthsguLoz+nJPYS3AOLfuSiby5QXsKTxgqHXxG/YJqF1xJbZL+5KcF8UyiDePumw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-6Zj1UtbQIwnsVJi2xn+Zl9yn9U014XzkX6QKrpAXIUGNCcjwWIbuOKd3u2T481OOP0BuVf3JpWhRqxumtosV3w==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-ieJL8dfIF8fmP3uJRNh/duJa3cCIIv6MzUe6o4uPT/oTDroy4qIATvnq9Dq/gtAv6rcPRpA9VhyghJ1DmjKsZQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-YaGDkZaV9ZRtbIGorsyyqL2x323gLMqqgLrPpAjaBbBFiAJRwF/gwRHMY4iJ85H2YeUxUq0jqtSc3jH3wsQJGg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-EatIH7PZQSNDsRn9ompc62MYzboY7wAkjfYz+2FzBaSA8Vl5/+740qGQj22tu/xhwW4K72aV2NNL1m47QVF7hA==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" - } - }, - "@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-LylC2cQdAmvR7bXqwMwBt6FHTMVGinwIdI8pjl4EbPT9hCVm1rdED53caTYM4gCm+CJGRw20r4gb9vn3+N6RrA==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" - } - }, - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-TlA4+1ca33D7fWxO5jKBytSCv86IGI4Lze4JfrawWUXZ5efhi4LiNmW5TrGlZUyvL7yJtZcA4tn3betlj6jVwA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-rBa7daaUrDVAIwJZm+S4lwc5pqNt6avNTGxEB69dNZ3QDJmCC+HUnudUtsG3VqMfP46JITKUPvtzRLGjX8CgRg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jSIHEB7lbh+MP3BhYIXFkeivDR01kugXN70e5FskW7oet2TIARsVEPheWKQFSP1U8bUZA4bsp9h9gOQ9xEeErw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.30.tgz", + "integrity": "sha512-NRmQehyw4gbDzeBAl0zjyPqj4e/jNYgqnRLcOsxTKpWODud8RHBqEvju/M6iET6ru0o+A9265efFzqR9hiE0LA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" + }, + "dependencies": { + "@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "optional": true, + "requires": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + } + }, + "tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "optional": true, + "requires": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + } + } } }, "@swagger-api/apidom-reference": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-alpha.9.tgz", - "integrity": "sha512-KQ6wB5KplqdSsjxdA8BaQulj5zlF5VBCd5KP3RN/9vvixgsD/gyrVY59nisdzmPTqiL6yjhk612eQ96MgG8KiA==", - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.30.tgz", + "integrity": "sha512-l1MpLMlmaX+y2hra5EadfR37sAMzmEz1wZomVcnw7vJEFlLQo3WwOdFvpQemPCZ9IJHUs+5zhZ++w7z60uKpSw==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0", "@types/ramda": "~0.30.0", - "axios": "^1.4.0", + "axios": "^1.8.2", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", @@ -6846,6 +6799,14 @@ } } }, + "@swaggerexpert/cookie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@swaggerexpert/cookie/-/cookie-2.0.2.tgz", + "integrity": "sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==", + "requires": { + "apg-lite": "^1.0.3" + } + }, "@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -7051,15 +7012,21 @@ "@types/node": "*" } }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, "@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, "@types/ws": { "version": "8.5.12", @@ -7352,9 +7319,9 @@ } }, "axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -7383,17 +7350,6 @@ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -7468,16 +7424,6 @@ "update-browserslist-db": "^1.1.0" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "optional": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -7502,6 +7448,15 @@ "set-function-length": "^1.2.1" } }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, "camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -7559,12 +7514,6 @@ } } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -7691,7 +7640,8 @@ "cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true }, "cookie-signature": { "version": "1.0.6", @@ -7722,9 +7672,9 @@ } }, "core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==" + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==" }, "core-util-is": { "version": "1.0.3", @@ -7796,15 +7746,6 @@ "ms": "2.0.0" } }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "optional": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7896,12 +7837,6 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true - }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -7962,9 +7897,12 @@ } }, "dompurify": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.4.tgz", - "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "requires": { + "@types/trusted-types": "^2.0.7" + } }, "domutils": { "version": "2.8.0", @@ -7992,6 +7930,16 @@ "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==" }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8009,15 +7957,6 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -8040,25 +7979,39 @@ "dev": true }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -8133,12 +8086,6 @@ "strip-final-newline": "^2.0.0" } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true - }, "express": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", @@ -8301,12 +8248,13 @@ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, @@ -8327,12 +8275,6 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, "fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -8355,20 +8297,32 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, "get-stream": { @@ -8377,12 +8331,6 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8425,13 +8373,9 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "graceful-fs": { "version": "4.2.11", @@ -8458,23 +8402,23 @@ "es-define-property": "^1.0.0" } }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } }, "hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "requires": { "function-bind": "^1.1.2" } @@ -8507,6 +8451,11 @@ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" }, + "highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==" + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -8708,12 +8657,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -8980,6 +8923,11 @@ "highlight.js": "~10.7.0" } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9053,12 +9001,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true - }, "minim": { "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", @@ -9082,18 +9024,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9110,23 +9040,11 @@ "thunky": "^1.0.2" } }, - "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true - }, "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -9153,20 +9071,17 @@ "tslib": "^2.0.3" } }, - "node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "optional": true, - "requires": { - "semver": "^7.3.5" - } - }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, + "node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "optional": true + }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -9187,6 +9102,12 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, + "node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "optional": true + }, "node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -9252,7 +9173,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "requires": { "wrappy": "1" } @@ -9278,19 +9199,19 @@ } }, "openapi-path-templating": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-1.6.0.tgz", - "integrity": "sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.2.1.tgz", + "integrity": "sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==", "requires": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" } }, "openapi-server-url-templating": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.1.0.tgz", - "integrity": "sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", "requires": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" } }, "p-limit": { @@ -9511,26 +9432,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -9542,9 +9443,9 @@ } }, "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" }, "process": { "version": "0.11.10", @@ -9598,16 +9499,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9687,18 +9578,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -9760,21 +9639,22 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "requires": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" } }, "react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", + "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", "requires": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" @@ -9784,7 +9664,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10190,9 +10070,9 @@ "dev": true }, "short-unique-id": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", - "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==" + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.2.tgz", + "integrity": "sha512-MlRVyT5RYfDO2kUzBgOPlZriRzG+NIAuwSy1HBN8tahXyFi3+804GGi/mzjUsi6VxgiQuDgMnhoI2FqmSHX8Tg==" }, "side-channel": { "version": "1.0.6", @@ -10212,23 +10092,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "optional": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "optional": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -10346,7 +10209,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -10366,12 +10229,6 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true - }, "style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -10393,41 +10250,42 @@ "dev": true }, "swagger-client": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.29.3.tgz", - "integrity": "sha512-OhhMAO2dwDEaxtUNDxwaqzw75uiZY5lX/2vx+U6eKCYZYhXWQ5mylU/0qfk/xMR20VyitsnzRc6KcFFjRoCS7A==", + "version": "3.34.4", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.34.4.tgz", + "integrity": "sha512-Qvtu8DtARAx5GwefA0eV1WRLa4Q9bhczrtNAsiBMOx3HkxAOczy1APQhrcblJdLys0xEGQ4xYizYFXfIL9BhpA==", "requires": { "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-error": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-reference": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "cookie": "~0.6.0", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^1.5.1", - "openapi-server-url-templating": "^1.0.0", + "openapi-path-templating": "^2.2.1", + "openapi-server-url-templating": "^1.3.0", "ramda": "^0.30.1", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.1.0" } }, "swagger-ui": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.17.14.tgz", - "integrity": "sha512-z9pOymwowrgkoMKNsRSN6QjOyYrMAnc4iohEebnS/ELT5jjdB13Lu4f3Bl4+o2Mw5B6QOyo4vibr/A/Vb7UbMQ==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.20.1.tgz", + "integrity": "sha512-ZgAnhAAW7ZFsfYaBc8rhOCNIohI7vDNrL66ZLa5Slt1YQsj99b7FajOXED27U+RtBiiQqXWspjDw8W6F1qvu2Q==", "requires": { - "@babel/runtime-corejs3": "^7.24.5", - "@braintree/sanitize-url": "=7.0.2", + "@babel/runtime-corejs3": "^7.26.7", + "@scarf/scarf": "=1.4.0", "base64-js": "^1.5.1", "classnames": "^2.5.1", "css.escape": "1.5.1", "deep-extend": "0.6.0", - "dompurify": "=3.1.4", + "dompurify": "=3.2.4", "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", @@ -10443,15 +10301,15 @@ "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "^2.2.0", "react-inspector": "^6.0.1", - "react-redux": "^9.1.2", - "react-syntax-highlighter": "^15.5.0", + "react-redux": "^9.2.0", + "react-syntax-highlighter": "^15.6.1", "redux": "^5.0.1", "redux-immutable": "^4.0.0", "remarkable": "^2.0.1", - "reselect": "^5.1.0", + "reselect": "^5.1.1", "serialize-error": "^8.1.0", "sha.js": "^2.4.11", - "swagger-client": "^3.28.1", + "swagger-client": "^3.34.1", "url-parse": "^1.5.10", "xml": "=1.0.1", "xml-but-prettier": "^1.0.1", @@ -10463,31 +10321,6 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "terser": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", @@ -10579,31 +10412,24 @@ "dev": true }, "tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "optional": true, + "peer": true, "requires": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" } }, "tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", - "optional": true, - "requires": { - "nan": "^2.18.0" - } - }, - "tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", "optional": true, "requires": { - "nan": "^2.14.0" + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" } }, "ts-mixer": { @@ -10621,15 +10447,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -10696,9 +10513,9 @@ } }, "use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "requires": {} }, "util-deprecate": { @@ -10754,9 +10571,9 @@ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" }, "web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", "optional": true }, "webpack": { @@ -10965,7 +10782,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "dev": true }, "ws": { "version": "8.18.0", diff --git a/src/portal/app-swagger-ui/package.json b/src/portal/app-swagger-ui/package.json index ab4197d3747..338697c2836 100644 --- a/src/portal/app-swagger-ui/package.json +++ b/src/portal/app-swagger-ui/package.json @@ -9,7 +9,7 @@ "dependencies": { "css-loader": "^6.11.0", "style-loader": "^3.3.4", - "swagger-ui": "5.17.14" + "swagger-ui": "5.20.1" }, "devDependencies": { "clean-webpack-plugin": "^4.0.0", diff --git a/src/portal/package-lock.json b/src/portal/package-lock.json index 39a9716cc4a..b61f9c47152 100644 --- a/src/portal/package-lock.json +++ b/src/portal/package-lock.json @@ -786,11 +786,12 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -1159,17 +1160,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } @@ -1211,50 +1212,36 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -2609,13 +2596,12 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -5276,6 +5262,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -5501,9 +5488,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -6078,19 +6065,6 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -6299,6 +6273,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -6306,7 +6281,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/color-support": { "version": "1.1.3", @@ -8443,6 +8419,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -9898,14 +9875,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -17128,17 +17097,6 @@ "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", "optional": true }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-hyperlinks": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", @@ -17546,14 +17504,6 @@ "node": ">=8.17.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", From 259c8a2053d00becf14fcb7ef0dfab07a6c01ebf Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Tue, 8 Apr 2025 16:35:02 +0800 Subject: [PATCH 03/55] Update robot testcase related to security hub row count to 15 by default (#21846) Signed-off-by: stonezdj --- .../resources/Harbor-Pages/SecurityHub.robot | 22 +++++++++---------- tests/robot-cases/Group1-Nightly/Trivy.robot | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/resources/Harbor-Pages/SecurityHub.robot b/tests/resources/Harbor-Pages/SecurityHub.robot index 16366fc2a07..dd1a1a50b48 100644 --- a/tests/resources/Harbor-Pages/SecurityHub.robot +++ b/tests/resources/Harbor-Pages/SecurityHub.robot @@ -74,19 +74,19 @@ Check The Search By One Condition Select From List By Value ${vulnerabilities_filter_select} project_id Retry Text Input ${vulnerabilities_filter_input} ${project_name} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][starts-with(@title, '${project_name}')] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][starts-with(@title, '${project_name}')] 15 # Check the search by repository name Select From List By Value ${vulnerabilities_filter_select} repository_name Retry Text Input ${vulnerabilities_filter_input} ${repository_name} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][@title='${repository_name}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][@title='${repository_name}'] 15 # Check the search by artifact digest Select From List By Value ${vulnerabilities_filter_select} digest Retry Text Input ${vulnerabilities_filter_input} ${digest} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3][@title='${digest}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3][@title='${digest}'] 15 ${short_digest}= Set Variable ${digest}[0:15] - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3]//a[text()='${short_digest}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3]//a[text()='${short_digest}'] 15 # Check the search by CVE ID Select From List By Value ${vulnerabilities_filter_select} cve_id Retry Text Input ${vulnerabilities_filter_input} ${cve_id} @@ -96,12 +96,12 @@ Check The Search By One Condition Select From List By Value ${vulnerabilities_filter_select} package Retry Text Input ${vulnerabilities_filter_input} ${package} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[7][@title='${package}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[7][@title='${package}'] 15 # Check the search by tag Select From List By Value ${vulnerabilities_filter_select} tag Retry Text Input ${vulnerabilities_filter_input} ${tag} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[4][text()='${tag}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[4][text()='${tag}'] 15 # Check the search by CVSS3 Select From List By Value ${vulnerabilities_filter_select} cvss_score_v3 ${cvss3_from_input}= Format String {}{} ${vulnerabilities_filter_input} [1] @@ -109,28 +109,28 @@ Check The Search By One Condition Retry Text Input ${cvss3_from_input} ${cvss_score_v3_from} Retry Text Input ${cvss3_to_input} ${cvss_score_v3_to} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[5][text()>=${cvss_score_v3_from} and text()<=${cvss_score_v3_to}] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[5][text()>=${cvss_score_v3_from} and text()<=${cvss_score_v3_to}] 15 # Check the search by severity # Critical Select From List By Value ${vulnerabilities_filter_select} severity Select From List By Value //form//div[2]//select Critical Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Critical'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Critical'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["critical_cnt"]} CVEs'] # High Select From List By Value //form//div[2]//select High Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='High'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='High'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["high_cnt"]} CVEs'] # Medium Select From List By Value //form//div[2]//select Medium Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Medium'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Medium'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["medium_cnt"]} CVEs'] # Low Select From List By Value //form//div[2]//select Low Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Low'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Low'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["low_cnt"]} CVEs'] # n/a Select From List By Value //form//div[2]//select Unknown diff --git a/tests/robot-cases/Group1-Nightly/Trivy.robot b/tests/robot-cases/Group1-Nightly/Trivy.robot index 33fa8279d22..42333152826 100644 --- a/tests/robot-cases/Group1-Nightly/Trivy.robot +++ b/tests/robot-cases/Group1-Nightly/Trivy.robot @@ -86,7 +86,7 @@ Test Case - Security Hub # Check the vulnerabilities search Retry Wait Element Not Visible ${add_search_criteria_icon} Retry Wait Element Not Visible ${remove_search_criteria_icon} - Retry Wait Element Count ${vulnerabilities_datagrid_row} 10 + Retry Wait Element Count ${vulnerabilities_datagrid_row} 15 Check The Quick Search Check The Search By One Condition project${d} project${d}/${images}[2] ${digest} ${cve_id} ${package} ${tag} ${cvss_score_v3_from} ${cvss_score_v3_to} ${summary} Check The Search By All Condition project${d} project${d}/${images}[2] ${digest} ${cve_id} ${package} ${tag} ${cvss_score_v3_from} ${cvss_score_v3_to} ${severity} From bfc29904f96e17248a4e6204d12058c1d7d05ab8 Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Tue, 8 Apr 2025 19:49:46 +0800 Subject: [PATCH 04/55] fix: support preheat cnai model artifact (#21849) Signed-off-by: chlins --- src/controller/p2p/preheat/enforcer.go | 12 +++-- src/lib/strings.go | 10 ++++ src/lib/strings_test.go | 54 +++++++++++++++++++ src/pkg/p2p/preheat/provider/dragonfly.go | 14 ++++- src/pkg/p2p/preheat/provider/preheat_image.go | 12 +++-- 5 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/controller/p2p/preheat/enforcer.go b/src/controller/p2p/preheat/enforcer.go index 8a97b13ec5a..c36739cf705 100644 --- a/src/controller/p2p/preheat/enforcer.go +++ b/src/controller/p2p/preheat/enforcer.go @@ -28,6 +28,7 @@ import ( "github.com/goharbor/harbor/src/controller/scan" "github.com/goharbor/harbor/src/core/service/token" "github.com/goharbor/harbor/src/jobservice/job" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/config" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" @@ -341,13 +342,18 @@ func (de *defaultEnforcer) PreheatArtifact(ctx context.Context, art *artifact.Ar // getCandidates get the initial candidates by evaluating the policy func (de *defaultEnforcer) getCandidates(ctx context.Context, ps *pol.Schema, p *proModels.Project) ([]*selector.Candidate, error) { + // Filter the candidates by supported types. + var supportedTypes []any + for _, t := range lib.SliceToUpper(pr.SupportedTypes) { + supportedTypes = append(supportedTypes, t) + } // Get the initial candidates // Here we have a hidden filter, the artifact type filter. // Only get the image type at this moment. arts, err := de.artCtl.List(ctx, &q.Query{ Keywords: map[string]interface{}{ "ProjectID": ps.ProjectID, - "Type": strings.ToUpper(pr.SupportedType), + "Type": q.NewOrList(supportedTypes), }, }, &artifact.Option{ WithLabel: true, @@ -433,7 +439,7 @@ func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, can } pi := &pr.PreheatImage{ - Type: pr.SupportedType, + Type: candidate.Kind, URL: u, Headers: map[string]interface{}{ accessCredHeaderKey: cred, @@ -517,7 +523,7 @@ func (de *defaultEnforcer) toCandidates(ctx context.Context, p *proModels.Projec NamespaceID: p.ProjectID, Namespace: p.Name, Repository: pureRepository(p.Name, a.RepositoryName), - Kind: pr.SupportedType, + Kind: strings.ToLower(a.Type), Digest: a.Digest, Tags: []string{t.Name}, Labels: getLabels(a.Labels), diff --git a/src/lib/strings.go b/src/lib/strings.go index 9b6bbb8090f..a35b910af8e 100644 --- a/src/lib/strings.go +++ b/src/lib/strings.go @@ -33,3 +33,13 @@ func Title(s string) string { title := cases.Title(language.Und) return title.String(strings.ToLower(s)) } + +// SliceToUpper converts a slice of strings to uppercase. +func SliceToUpper(s []string) []string { + result := make([]string, len(s)) + for i, str := range s { + result[i] = strings.ToUpper(str) + } + + return result +} diff --git a/src/lib/strings_test.go b/src/lib/strings_test.go index bcb4bfa48aa..a2bf61325d4 100644 --- a/src/lib/strings_test.go +++ b/src/lib/strings_test.go @@ -15,6 +15,7 @@ package lib import ( + "reflect" "testing" "github.com/stretchr/testify/assert" @@ -52,3 +53,56 @@ func TestTitle(t *testing.T) { }) } } + +func TestSliceToUpper(t *testing.T) { + tests := []struct { + name string + input []string + expected []string + }{ + { + name: "Empty slice", + input: []string{}, + expected: []string{}, + }, + { + name: "Single element", + input: []string{"hello"}, + expected: []string{"HELLO"}, + }, + { + name: "Multiple elements", + input: []string{"hello", "world", "go"}, + expected: []string{"HELLO", "WORLD", "GO"}, + }, + { + name: "Already uppercase", + input: []string{"HELLO", "WORLD"}, + expected: []string{"HELLO", "WORLD"}, + }, + { + name: "Mixed case", + input: []string{"Hello", "World", "Go"}, + expected: []string{"HELLO", "WORLD", "GO"}, + }, + { + name: "With special characters", + input: []string{"hello!", "world?", "go#"}, + expected: []string{"HELLO!", "WORLD?", "GO#"}, + }, + { + name: "With numbers", + input: []string{"hello123", "world456"}, + expected: []string{"HELLO123", "WORLD456"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := SliceToUpper(tt.input) + if !reflect.DeepEqual(result, tt.expected) { + t.Errorf("SliceToUpper() = %v, want %v", result, tt.expected) + } + }) + } +} diff --git a/src/pkg/p2p/preheat/provider/dragonfly.go b/src/pkg/p2p/preheat/provider/dragonfly.go index bbf6e905593..623c45b18b7 100644 --- a/src/pkg/p2p/preheat/provider/dragonfly.go +++ b/src/pkg/p2p/preheat/provider/dragonfly.go @@ -36,7 +36,17 @@ const ( // dragonflyJobPath is the job path for dragonfly openapi. dragonflyJobPath = "/oapi/v1/jobs" +) + +const ( + // preheatTypeImage represents the image to the dragonfly cluster. + preheatTypeImage = "image" + // preheatTypeFile represents the file to the dragonfly cluster. + preheatTypeFile = "file" +) + +const ( // scopeTypeSingleSeedPeer represents preheat image to single seed peer in p2p cluster. scopeTypeSingleSeedPeer = "single_seed_peer" @@ -233,9 +243,9 @@ func (dd *DragonflyDriver) Preheat(preheatingImage *PreheatImage) (*PreheatingSt // Construct the preheat job request by the given parameters of the preheating image . req := &dragonflyCreateJobRequest{ Type: "preheat", - // TODO: Support set SchedulerClusterIDs, FilteredQueryParam, ConcurrentCount and Timeout. + // TODO: Support set FilteredQueryParam, ConcurrentCount and Timeout. Args: dragonflyCreateJobRequestArgs{ - Type: preheatingImage.Type, + Type: preheatTypeImage, URL: preheatingImage.URL, Headers: headerToMapString(preheatingImage.Headers), }, diff --git a/src/pkg/p2p/preheat/provider/preheat_image.go b/src/pkg/p2p/preheat/provider/preheat_image.go index 56e81a629fb..081ac21f726 100644 --- a/src/pkg/p2p/preheat/provider/preheat_image.go +++ b/src/pkg/p2p/preheat/provider/preheat_image.go @@ -17,13 +17,17 @@ package provider import ( "encoding/json" "net/url" + "slices" "github.com/pkg/errors" ) -const ( - // SupportedType indicates the supported preheating type 'image'. - SupportedType = "image" +var ( + // SupportedTypes indicates the supported preheating types. + SupportedTypes = []string{ + "image", + "cnai", + } ) // PreheatImage contains related information which can help providers to get/pull the images. @@ -75,7 +79,7 @@ func (img *PreheatImage) ToJSON() (string, error) { // Validate PreheatImage func (img *PreheatImage) Validate() error { - if img.Type != SupportedType { + if !slices.Contains(SupportedTypes, img.Type) { return errors.Errorf("unsupported type '%s'", img.Type) } From f8f1994c9ee97e41067870c4ed46b15eb21da3b6 Mon Sep 17 00:00:00 2001 From: miner Date: Tue, 15 Apr 2025 14:07:39 +0800 Subject: [PATCH 05/55] fix jobservice container loglevel consistent with job_log (#21874) Signed-off-by: yminer --- make/photon/prepare/templates/jobservice/env.jinja | 2 ++ 1 file changed, 2 insertions(+) diff --git a/make/photon/prepare/templates/jobservice/env.jinja b/make/photon/prepare/templates/jobservice/env.jinja index 38e8e1ba6c9..f575fc5f12d 100644 --- a/make/photon/prepare/templates/jobservice/env.jinja +++ b/make/photon/prepare/templates/jobservice/env.jinja @@ -6,6 +6,8 @@ REGISTRY_CONTROLLER_URL={{registry_controller_url}} JOBSERVICE_WEBHOOK_JOB_MAX_RETRY={{notification_webhook_job_max_retry}} JOBSERVICE_WEBHOOK_JOB_HTTP_CLIENT_TIMEOUT={{notification_webhook_job_http_client_timeout}} +LOG_LEVEL={{log_level}} + {%if internal_tls.enabled %} INTERNAL_TLS_ENABLED=true INTERNAL_TLS_TRUST_CA_PATH=/harbor_cust_cert/harbor_internal_ca.crt From 9dcbd56e52ca7d49ba3d7201c5f49d0e31d604e6 Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Thu, 17 Apr 2025 14:28:55 +0800 Subject: [PATCH 06/55] chore: bump golangci-lint to v2 (#21887) Signed-off-by: chlins --- Makefile | 2 +- src/.golangci.yaml | 118 ++++++++++++++-------------------- src/common/utils/utils.go | 12 ++-- src/jobservice/mgt/manager.go | 4 +- src/lib/q/builder.go | 14 ++-- src/lib/q/query.go | 6 +- src/lib/retry/retry.go | 4 +- tests/ci/ut_install.sh | 4 +- 8 files changed, 72 insertions(+), 92 deletions(-) diff --git a/Makefile b/Makefile index 2bbdcfe86c3..2664567d12b 100644 --- a/Makefile +++ b/Makefile @@ -471,7 +471,7 @@ misspell: @find . -type d \( -path ./tests \) -prune -o -name '*.go' -print | xargs misspell -error # golangci-lint binary installation or refer to https://golangci-lint.run/usage/install/#local-installation -# curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 +# curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.2 GOLANGCI_LINT := $(shell go env GOPATH)/bin/golangci-lint lint: @echo checking lint diff --git a/src/.golangci.yaml b/src/.golangci.yaml index 7377e88da02..6d993241540 100644 --- a/src/.golangci.yaml +++ b/src/.golangci.yaml @@ -1,76 +1,56 @@ -linters-settings: - gofmt: - # Simplify code: gofmt with `-s` option. - # Default: true - simplify: false - misspell: - locale: US,UK - goimports: - local-prefixes: github.com/goharbor/harbor - stylecheck: - checks: [ - "ST1019", # Importing the same package multiple times. - ] - goheader: - template-path: copyright.tmpl - +version: "2" linters: - disable-all: true + default: none enable: - - gofmt + - bodyclose + - errcheck - goheader - - misspell - - typecheck - # - dogsled - # - dupl - # - depguard - # - funlen - # - goconst - # - gocritic - # - gocyclo - # - goimports - # - goprintffuncname + - govet - ineffassign - # - nakedret - # - nolintlint + - misspell - revive + - staticcheck - whitespace - - bodyclose - - errcheck - # - gosec - - gosimple + settings: + goheader: + template-path: copyright.tmpl + misspell: + locale: US,UK + staticcheck: + checks: + - ST1019 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ + - _test\.go + - .*test\.go + - testing + - src/jobservice/mgt/mock_manager.go +formatters: + enable: + - gofmt - goimports - - govet - # - noctx - # - rowserrcheck - - staticcheck - - stylecheck - # - unconvert - # - unparam - # - unused // disabled due to too many false positive check and limited support golang 1.19 https://github.com/dominikh/go-tools/issues/1282 - -run: - skip-files: - - ".*_test.go" - - ".*test.go" - skip-dirs: - - "testing" - timeout: 20m - -issue: - max-same-issues: 0 - max-per-linter: 0 - -issues: - # Excluding configuration per-path, per-linter, per-text and per-source - exclude-rules: - # Exclude some linters from running on tests files. - - path: _test\.go - linters: - - goimports - - path: src/testing/*.go - linters: - - goimports - - path: src/jobservice/mgt/mock_manager.go - linters: - - goimports + settings: + gofmt: + simplify: false + goimports: + local-prefixes: + - github.com/goharbor/harbor + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ + - _test\.go + - .*test\.go + - testing + - src/jobservice/mgt/mock_manager.go diff --git a/src/common/utils/utils.go b/src/common/utils/utils.go index 61e816bee8c..01942310738 100644 --- a/src/common/utils/utils.go +++ b/src/common/utils/utils.go @@ -237,14 +237,14 @@ func GetStrValueOfAnyType(value interface{}) string { } // IsIllegalLength ... -func IsIllegalLength(s string, min int, max int) bool { - if min == -1 { - return (len(s) > max) +func IsIllegalLength(s string, minVal int, maxVal int) bool { + if minVal == -1 { + return (len(s) > maxVal) } - if max == -1 { - return (len(s) <= min) + if maxVal == -1 { + return (len(s) <= minVal) } - return (len(s) < min || len(s) > max) + return (len(s) < minVal || len(s) > maxVal) } // ParseJSONInt ... diff --git a/src/jobservice/mgt/manager.go b/src/jobservice/mgt/manager.go index e28b8bf5057..1ab54a25d12 100644 --- a/src/jobservice/mgt/manager.go +++ b/src/jobservice/mgt/manager.go @@ -226,8 +226,8 @@ func (bm *basicManager) GetPeriodicExecution(pID string, q *query.Parameter) (re return results, total, nil } - min, max := (pageNumber-1)*pageSize, pageNumber*pageSize-1 - args := []interface{}{key, min, max} + minVal, maxVal := (pageNumber-1)*pageSize, pageNumber*pageSize-1 + args := []interface{}{key, minVal, maxVal} list, err := redis.Values(conn.Do("ZREVRANGE", args...)) if err != nil { return nil, 0, err diff --git a/src/lib/q/builder.go b/src/lib/q/builder.go index 98a885ead16..da9fd49bc71 100644 --- a/src/lib/q/builder.go +++ b/src/lib/q/builder.go @@ -132,17 +132,17 @@ func parseRange(value string) (*Range, error) { return nil, fmt.Errorf(`range must start with "[", end with "]" and contains only one "~"`) } strs := strings.SplitN(value[1:length-1], "~", 2) - min := strings.TrimSpace(strs[0]) - max := strings.TrimSpace(strs[1]) - if len(min) == 0 && len(max) == 0 { + minVal := strings.TrimSpace(strs[0]) + maxVal := strings.TrimSpace(strs[1]) + if len(minVal) == 0 && len(maxVal) == 0 { return nil, fmt.Errorf(`min and max at least one should be set in range'`) } r := &Range{} - if len(min) > 0 { - r.Min = parseValue(min) + if len(minVal) > 0 { + r.Min = parseValue(minVal) } - if len(max) > 0 { - r.Max = parseValue(max) + if len(maxVal) > 0 { + r.Max = parseValue(maxVal) } return r, nil } diff --git a/src/lib/q/query.go b/src/lib/q/query.go index 8910a0e40e9..a1cd5339c72 100644 --- a/src/lib/q/query.go +++ b/src/lib/q/query.go @@ -105,10 +105,10 @@ func NewSort(key string, desc bool) *Sort { } // NewRange creates a new range -func NewRange(min, max interface{}) *Range { +func NewRange(minVal, maxVal interface{}) *Range { return &Range{ - Min: min, - Max: max, + Min: minVal, + Max: maxVal, } } diff --git a/src/lib/retry/retry.go b/src/lib/retry/retry.go index e22a81599dd..ed907af8c9e 100644 --- a/src/lib/retry/retry.go +++ b/src/lib/retry/retry.go @@ -70,9 +70,9 @@ func InitialInterval(initial time.Duration) Option { } // MaxInterval set max interval -func MaxInterval(max time.Duration) Option { +func MaxInterval(maxInterval time.Duration) Option { return func(opts *Options) { - opts.MaxInterval = max + opts.MaxInterval = maxInterval } } diff --git a/tests/ci/ut_install.sh b/tests/ci/ut_install.sh index 09431586ec1..a207780b388 100755 --- a/tests/ci/ut_install.sh +++ b/tests/ci/ut_install.sh @@ -18,11 +18,11 @@ set -e # cd ../ # binary will be $(go env GOPATH)/bin/golangci-lint # go get installation aren't guaranteed to work. We recommend using binary installation. -curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.61.0 +curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.2 sudo service postgresql stop || echo no postgresql need to be stopped sleep 2 -sudo rm -rf /data/* +sudo rm -rf /data/* sudo -E env "PATH=$PATH" make go_check sudo ./tests/hostcfg.sh sudo ./tests/generateCerts.sh From b58a60e273b7698cfd67af337deea986df2f4029 Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Mon, 21 Apr 2025 10:13:21 +0800 Subject: [PATCH 07/55] update gitaction machine to 22.04 (#21900) Per https://github.com/actions/runner-images/issues/11101, the ubuntu 20.04 is out of support. Up it to the 22.04 Signed-off-by: wang yan --- .github/workflows/build-package.yml | 2 +- .github/workflows/publish_release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index 881c1e58e8e..5ea1aa50700 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -13,7 +13,7 @@ jobs: env: BUILD_PACKAGE: true runs-on: - - ubuntu-20.04 + - ubuntu-22.04 steps: - uses: actions/checkout@v3 - uses: 'google-github-actions/auth@v2' diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 64f4940e2cf..0c9f2b545a1 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -7,7 +7,7 @@ on: jobs: release: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - name: Setup env From a13a16383a41a8e20f524593cb290dc52f86f088 Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Mon, 21 Apr 2025 15:24:04 +0800 Subject: [PATCH 08/55] update artifact info (#21902) Signed-off-by: stonezdj --- src/server/v2.0/handler/repository.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/v2.0/handler/repository.go b/src/server/v2.0/handler/repository.go index 2f864aedc52..64ce4b24140 100644 --- a/src/server/v2.0/handler/repository.go +++ b/src/server/v2.0/handler/repository.go @@ -17,6 +17,7 @@ package handler import ( "context" "fmt" + "html/template" "github.com/go-openapi/runtime/middleware" @@ -235,7 +236,7 @@ func (r *repositoryAPI) UpdateRepository(ctx context.Context, params operation.U if err := r.repoCtl.Update(ctx, &repomodel.RepoRecord{ RepositoryID: repository.RepositoryID, Name: repository.Name, - Description: params.Repository.Description, + Description: template.HTMLEscapeString(params.Repository.Description), }, "Description"); err != nil { return r.SendError(ctx, err) } From 6772477e8a3eb4cafe3db75d850ec138c71b3793 Mon Sep 17 00:00:00 2001 From: Bin Liu Date: Mon, 21 Apr 2025 16:08:51 +0800 Subject: [PATCH 09/55] fix: check blob exist before copying layers samller than chunk size (#21883) `copyBlobByChunk()` should like `copyBlob()`, first try to mount an exists layer, if not mounted or exist, then copy the layer monolithic or by chunks. Signed-off-by: Bin Liu Signed-off-by: Bin Liu --- src/controller/replication/transfer/image/transfer.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controller/replication/transfer/image/transfer.go b/src/controller/replication/transfer/image/transfer.go index 09c1bea27e9..bf76eee9559 100644 --- a/src/controller/replication/transfer/image/transfer.go +++ b/src/controller/replication/transfer/image/transfer.go @@ -403,11 +403,6 @@ func (t *transfer) copyBlobByMonolithic(srcRepo, dstRepo, digest string, sizeFro // copyBlobByChunk copy blob by chunk with specified start and end range. // The refers to the byte range of the chunk, and MUST be inclusive on both ends. The first chunk's range MUST begin with 0. func (t *transfer) copyBlobByChunk(srcRepo, dstRepo, digest string, sizeFromDescriptor int64, start, end *int64, location *string, speed int32) error { - // fallback to copy by monolithic if the blob size is equal or less than chunk size. - if sizeFromDescriptor <= replicationChunkSize { - return t.copyBlobByMonolithic(srcRepo, dstRepo, digest, sizeFromDescriptor, speed) - } - mounted, err := t.tryMountBlob(srcRepo, dstRepo, digest) if err != nil { return err @@ -417,6 +412,11 @@ func (t *transfer) copyBlobByChunk(srcRepo, dstRepo, digest string, sizeFromDesc return nil } + // fallback to copy by monolithic if the blob size is equal or less than chunk size. + if sizeFromDescriptor <= replicationChunkSize { + return t.copyBlobByMonolithic(srcRepo, dstRepo, digest, sizeFromDescriptor, speed) + } + // end range should equal (blobSize - 1) endRange := sizeFromDescriptor - 1 for { From ad7be0b42fd4ce1a56a54706e7155e30d5808c19 Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Tue, 22 Apr 2025 13:36:37 +0800 Subject: [PATCH 10/55] revise make file for lint api (#21906) Decouple the lint from the api generation step in the makefile. Signed-off-by: wang yan --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2664567d12b..c0eeb05f586 100644 --- a/Makefile +++ b/Makefile @@ -308,7 +308,7 @@ define swagger_generate_server @$(SWAGGER_GENERATE_SERVER) -f $(1) -A $(3) --target $(2) endef -gen_apis: lint_apis +gen_apis: $(call prepare_docker_image,${SWAGGER_IMAGENAME},${SWAGGER_VERSION},${SWAGGER_IMAGE_BUILD_CMD}) $(call swagger_generate_server,api/v2.0/swagger.yaml,src/server/v2.0,harbor) @@ -338,7 +338,7 @@ versions_prepare: check_environment: @$(MAKEPATH)/$(CHECKENVCMD) -compile_core: gen_apis +compile_core: lint_apis gen_apis @echo "compiling binary for core (golang image)..." @echo $(GOBUILDPATHINCONTAINER) @$(DOCKERCMD) run --rm -v $(BUILDPATH):$(GOBUILDPATHINCONTAINER) -w $(GOBUILDPATH_CORE) $(GOBUILDIMAGE) $(GOIMAGEBUILD_CORE) -o $(GOBUILDPATHINCONTAINER)/$(GOBUILDMAKEPATH_CORE)/$(CORE_BINARYNAME) From 9850f1404da914600f42030e9165f376082cdc9d Mon Sep 17 00:00:00 2001 From: Prasanth Baskar Date: Wed, 23 Apr 2025 08:32:26 +0530 Subject: [PATCH 11/55] Add missing step in e2e pipeline setup (#21888) add missing step in e2e Signed-off-by: bupd --- tests/e2e_setup/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/e2e_setup/README.md b/tests/e2e_setup/README.md index f6e037af8e7..99939a39d3d 100644 --- a/tests/e2e_setup/README.md +++ b/tests/e2e_setup/README.md @@ -36,6 +36,11 @@ cp robotvars.sample.py robotvars.py ./e2e_container.sh ``` +Check if harbor_ca.crt exists in /ca directory. if not copy it +``` +cp /ca/ca.crt /ca/harbor_ca.crt +``` + #### 4. Run setup, in the previous container console, run the following command. ``` robot -V /drone/tests/e2e_setup/robotvars.py /drone/tests/robot-cases/Group1-Nightly/Setup_Nightly.robot From ff2f4b0e712647a5fabe6d094ba1daceea6ba1da Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Thu, 24 Apr 2025 10:41:16 +0800 Subject: [PATCH 12/55] Remove the error check never happen (#21916) Signed-off-by: stonezdj --- src/server/v2.0/handler/scanexport.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/server/v2.0/handler/scanexport.go b/src/server/v2.0/handler/scanexport.go index 09c5e0580c2..cc0d6dc5439 100644 --- a/src/server/v2.0/handler/scanexport.go +++ b/src/server/v2.0/handler/scanexport.go @@ -97,10 +97,6 @@ func (se *scanDataExportAPI) ExportScanData(ctx context.Context, params operatio userContext := context.WithValue(ctx, export.CsvJobVendorIDKey, usr.UserID) - if err != nil { - return se.SendError(ctx, err) - } - jobID, err := se.scanDataExportCtl.Start(userContext, se.convertToCriteria(params.Criteria, secContext.GetUsername(), usr.UserID)) if err != nil { return se.SendError(ctx, err) @@ -134,9 +130,6 @@ func (se *scanDataExportAPI) GetScanDataExportExecution(ctx context.Context, par return se.SendError(ctx, err) } - if err != nil { - return se.SendError(ctx, err) - } sdeExec := models.ScanDataExportExecution{ EndTime: strfmt.DateTime(execution.EndTime), ID: execution.ID, From 187f1a9ffbb824d6849345d50c5ab798a8aa6c9f Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Thu, 24 Apr 2025 18:20:33 +0800 Subject: [PATCH 13/55] enhance the query judgement (#21924) the query parameter cannot contains orm.ExerSep which is key characters that used by orm. the pull request enhances the validation for query parameters. Signed-off-by: wang yan --- src/lib/orm/query.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib/orm/query.go b/src/lib/orm/query.go index a51a3ca35d9..373569a2571 100644 --- a/src/lib/orm/query.go +++ b/src/lib/orm/query.go @@ -22,6 +22,7 @@ import ( "github.com/beego/beego/v2/client/orm" + "github.com/goharbor/harbor/src/lib/log" "github.com/goharbor/harbor/src/lib/q" ) @@ -155,7 +156,12 @@ func setFilters(ctx context.Context, qs orm.QuerySeter, query *q.Query, meta *me // The "strings.SplitN()" here is a workaround for the incorrect usage of query which should be avoided // e.g. use the query with the knowledge of underlying ORM implementation, the "OrList" should be used instead: // https://github.com/goharbor/harbor/blob/v2.2.0/src/controller/project/controller.go#L348 - k := strings.SplitN(key, orm.ExprSep, 2)[0] + keyPieces := strings.Split(key, orm.ExprSep) + if len(keyPieces) > 2 { + log.Warningf("The separator '%s' is not valid in the query parameter '%s__%s'. Please use the correct field name.", orm.ExprSep, keyPieces[0], keyPieces[1]) + continue + } + k := keyPieces[0] mk, filterable := meta.Filterable(k) if !filterable { // This is a workaround for the unsuitable usage of query, the keyword format for field and method should be consistent From 972965ff5aecea1da7f56b8c93facfbd7db7413b Mon Sep 17 00:00:00 2001 From: Prasanth Baskar Date: Thu, 24 Apr 2025 17:53:09 +0530 Subject: [PATCH 14/55] FIX: Display 'No SBOM' in multi-arch images in HarborUI (#21459) fix: handle multi-arch images with SBOMs in HarborUI * Updated the `hasChild` method to check for the presence of `child_digest` in the `references` array. * This ensures that SBOMs are correctly displayed for multi-arch images, where child artifacts may contain their own SBOMs. * Previously, No SBOM label was displayed for multi-arch images. Signed-off-by: bupd --- .../artifact-list-tab.component.html | 4 +++- .../artifact-list-tab.component.spec.ts | 20 +++++++++++++++++++ .../artifact-list-tab.component.ts | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html index d3936a48520..3231851702e 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html @@ -465,7 +465,9 @@ (submitStopFinish)="submitSbomStopFinish($event)" (scanFinished)="sbomFinished($event)" *ngIf=" - hasSbom(artifact) && !artifact?.accessoryLoading + hasSbom(artifact) && + !artifact?.accessoryLoading && + !hasChild(artifact) " [inputScanner]=" handleSbomOverview(artifact.sbom_overview) diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts index 9e96dcc03e7..45101eb70c3 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts @@ -502,6 +502,26 @@ describe('ArtifactListTabComponent', () => { ); expect(comp.handleScanOverview(mockArtifacts[0])).not.toBeNull(); }); + it('Should return true for artifacts with child references', async () => { + const artifactWithChild = { + ...mockArtifacts[0], + references: [{ child_digest: 'childDigest123' }], // child reference + }; + + const result = comp.hasChild(artifactWithChild); + + expect(result).toBeTruthy(); + }); + it('Should return false for artifacts without child references', async () => { + const artifactWithoutChild = { + ...mockArtifacts[0], + references: [], // No child references + }; + + const result = comp.hasChild(artifactWithoutChild); + + expect(result).toBeFalsy(); + }); it('Test utils', async () => { fixture = TestBed.createComponent(ArtifactListTabComponent); comp = fixture.componentInstance; diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts index fc225a663b2..38628601e14 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts @@ -915,6 +915,14 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy { ); } + hasChild(artifact: Artifact): boolean { + return !!( + artifact && + artifact.references && + artifact.references.some(ref => ref['child_digest']) + ); + } + submitFinish(e: boolean) { this.scanFinishedArtifactLength += 1; // all selected scan action has started From bef66740ec24a40fe4f0dfc45b5b5e85cb6ae70e Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Fri, 25 Apr 2025 14:30:58 +0800 Subject: [PATCH 15/55] Update the severity, fixed version and cvss_score_v3 (#21915) Signed-off-by: stonezdj --- src/pkg/scan/postprocessors/report_converters.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pkg/scan/postprocessors/report_converters.go b/src/pkg/scan/postprocessors/report_converters.go index c2603220151..2be32c434f9 100644 --- a/src/pkg/scan/postprocessors/report_converters.go +++ b/src/pkg/scan/postprocessors/report_converters.go @@ -143,8 +143,8 @@ func (c *nativeToRelationalSchemaConverter) toSchema(ctx context.Context, report } for _, record := range outOfDateRecords { - // Update the severity of the record when it's changed in the scanner, closes #14745 - if err := c.dao.Update(ctx, record, "severity"); err != nil { + // Update the severity, fixed_version, and cvss_score_v3 of the record when it's changed in the scanner, closes #14745 #21463 + if err := c.dao.Update(ctx, record, "severity", "fixed_version", "cvss_score_v3"); err != nil { return err } } From b3cfe225db888adbf87fb6e6d579e08b688b2d62 Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Sun, 27 Apr 2025 14:07:19 +0800 Subject: [PATCH 16/55] unify the golang image version (#21935) Make the golang version as a unified parameter to build all harbor components Signed-off-by: wang yan --- Makefile | 2 +- make/photon/Makefile | 4 ++-- make/photon/registry/Dockerfile.binary | 3 ++- make/photon/registry/builder | 3 ++- make/photon/trivy-adapter/Dockerfile.binary | 3 ++- make/photon/trivy-adapter/builder.sh | 5 +++-- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index c0eeb05f586..0e6dfcf2b25 100644 --- a/Makefile +++ b/Makefile @@ -399,7 +399,7 @@ build: -e TRIVY_DOWNLOAD_URL=$(TRIVY_DOWNLOAD_URL) -e TRIVY_ADAPTER_DOWNLOAD_URL=$(TRIVY_ADAPTER_DOWNLOAD_URL) \ -e PULL_BASE_FROM_DOCKERHUB=$(PULL_BASE_FROM_DOCKERHUB) -e BUILD_BASE=$(BUILD_BASE) \ -e REGISTRYUSER=$(REGISTRYUSER) -e REGISTRYPASSWORD=$(REGISTRYPASSWORD) \ - -e PUSHBASEIMAGE=$(PUSHBASEIMAGE) + -e PUSHBASEIMAGE=$(PUSHBASEIMAGE) -e GOBUILDIMAGE=$(GOBUILDIMAGE) build_standalone_db_migrator: compile_standalone_db_migrator make -f $(MAKEFILEPATH_PHOTON)/Makefile _build_standalone_db_migrator -e BASEIMAGETAG=$(BASEIMAGETAG) -e VERSIONTAG=$(VERSIONTAG) diff --git a/make/photon/Makefile b/make/photon/Makefile index 181e6c09d44..ff4aa8180f2 100644 --- a/make/photon/Makefile +++ b/make/photon/Makefile @@ -154,7 +154,7 @@ _build_trivy_adapter: $(call _extract_archive, $(TRIVY_ADAPTER_DOWNLOAD_URL), $(DOCKERFILEPATH_TRIVY_ADAPTER)/binary/) ; \ else \ echo "Building Trivy adapter $(TRIVYADAPTERVERSION) from sources..." ; \ - cd $(DOCKERFILEPATH_TRIVY_ADAPTER) && $(DOCKERFILEPATH_TRIVY_ADAPTER)/builder.sh $(TRIVYADAPTERVERSION) && cd - ; \ + cd $(DOCKERFILEPATH_TRIVY_ADAPTER) && $(DOCKERFILEPATH_TRIVY_ADAPTER)/builder.sh $(TRIVYADAPTERVERSION) $(GOBUILDIMAGE) && cd - ; \ fi ; \ echo "Building Trivy adapter container for photon..." ; \ $(DOCKERBUILD_WITH_PULL_PARA) --build-arg harbor_base_image_version=$(BASEIMAGETAG) \ @@ -178,7 +178,7 @@ _build_registry: rm -rf $(DOCKERFILEPATH_REG)/binary && mkdir -p $(DOCKERFILEPATH_REG)/binary && \ $(call _get_binary, $(REGISTRYURL), $(DOCKERFILEPATH_REG)/binary/registry); \ else \ - cd $(DOCKERFILEPATH_REG) && $(DOCKERFILEPATH_REG)/builder $(REGISTRY_SRC_TAG) $(DISTRIBUTION_SRC) && cd - ; \ + cd $(DOCKERFILEPATH_REG) && $(DOCKERFILEPATH_REG)/builder $(REGISTRY_SRC_TAG) $(DISTRIBUTION_SRC) $(GOBUILDIMAGE) && cd - ; \ fi @echo "building registry container for photon..." @chmod 655 $(DOCKERFILEPATH_REG)/binary/registry && $(DOCKERBUILD_WITH_PULL_PARA) --build-arg harbor_base_image_version=$(BASEIMAGETAG) --build-arg harbor_base_namespace=$(BASEIMAGENAMESPACE) -f $(DOCKERFILEPATH_REG)/$(DOCKERFILENAME_REG) -t $(DOCKERIMAGENAME_REG):$(VERSIONTAG) . diff --git a/make/photon/registry/Dockerfile.binary b/make/photon/registry/Dockerfile.binary index ab13727efc2..f6e35357a08 100644 --- a/make/photon/registry/Dockerfile.binary +++ b/make/photon/registry/Dockerfile.binary @@ -1,4 +1,5 @@ -FROM golang:1.23.8 +ARG golang_image +FROM ${golang_image} ENV DISTRIBUTION_DIR /go/src/github.com/docker/distribution ENV BUILDTAGS include_oss include_gcs diff --git a/make/photon/registry/builder b/make/photon/registry/builder index 92e9e1d862a..6e6a8280e4e 100755 --- a/make/photon/registry/builder +++ b/make/photon/registry/builder @@ -14,6 +14,7 @@ fi VERSION="$1" DISTRIBUTION_SRC="$2" +GOBUILDIMAGE="$3" set -e @@ -32,7 +33,7 @@ cd $cur echo 'build the registry binary ...' cp Dockerfile.binary $TEMP -docker build -f $TEMP/Dockerfile.binary -t registry-golang $TEMP +docker build --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t registry-golang $TEMP echo 'copy the registry binary to local...' ID=$(docker create registry-golang) diff --git a/make/photon/trivy-adapter/Dockerfile.binary b/make/photon/trivy-adapter/Dockerfile.binary index 3f3cf438058..560ffd5b707 100644 --- a/make/photon/trivy-adapter/Dockerfile.binary +++ b/make/photon/trivy-adapter/Dockerfile.binary @@ -1,4 +1,5 @@ -FROM golang:1.23.8 +ARG golang_image +FROM ${golang_image} ADD . /go/src/github.com/goharbor/harbor-scanner-trivy/ WORKDIR /go/src/github.com/goharbor/harbor-scanner-trivy/ diff --git a/make/photon/trivy-adapter/builder.sh b/make/photon/trivy-adapter/builder.sh index 2635ce37055..9b48a2e0402 100755 --- a/make/photon/trivy-adapter/builder.sh +++ b/make/photon/trivy-adapter/builder.sh @@ -8,6 +8,7 @@ if [ -z $1 ]; then fi VERSION="$1" +GOBUILDIMAGE="$2" set -e @@ -19,9 +20,9 @@ TEMP=$(mktemp -d ${TMPDIR-/tmp}/trivy-adapter.XXXXXX) git clone https://github.com/goharbor/harbor-scanner-trivy.git $TEMP cd $TEMP; git checkout $VERSION; cd - -echo "Building Trivy adapter binary based on golang:1.23.8..." +echo "Building Trivy adapter binary ..." cp Dockerfile.binary $TEMP -docker build -f $TEMP/Dockerfile.binary -t trivy-adapter-golang $TEMP +docker build --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t trivy-adapter-golang $TEMP echo "Copying Trivy adapter binary from the container to the local directory..." ID=$(docker create trivy-adapter-golang) From 70306dca0cefbb17ecb7a6810eb28f84f28ecb63 Mon Sep 17 00:00:00 2001 From: Daniel Jiang Date: Mon, 28 Apr 2025 16:23:09 +0800 Subject: [PATCH 17/55] Generate URI of token service via Host in request (#21898) This commit update the flow to generate URL of token service, which will first try to use the Host in request. This will help the situation when Harbor is configured to serve via a hostname but some client needs to pull artifacts from Harbor via IP due to limitations in the environment. Signed-off-by: Daniel Jiang --- src/server/middleware/v2auth/auth.go | 25 ++++- src/server/middleware/v2auth/auth_test.go | 109 +++++++++++++++------- 2 files changed, 93 insertions(+), 41 deletions(-) diff --git a/src/server/middleware/v2auth/auth.go b/src/server/middleware/v2auth/auth.go index a64fcf0ac97..b7d8687a0a4 100644 --- a/src/server/middleware/v2auth/auth.go +++ b/src/server/middleware/v2auth/auth.go @@ -97,11 +97,10 @@ func getChallenge(req *http.Request, accessList []access) string { return `Basic realm="harbor"` } // No auth header, treat it as CLI and redirect to token service - ep, err := tokenSvcEndpoint(req) + tokenSvc, err := tokenSvcURL(req) if err != nil { logger.Errorf("failed to get the endpoint for token service, error: %v", err) } - tokenSvc := fmt.Sprintf("%s/service/token", strings.TrimSuffix(ep, "/")) scope := "" for _, a := range accessList { if len(scope) > 0 { @@ -116,12 +115,28 @@ func getChallenge(req *http.Request, accessList []access) string { return challenge } -func tokenSvcEndpoint(req *http.Request) (string, error) { +func tokenSvcURL(req *http.Request) (string, error) { + getURL := func(ep string) string { + return fmt.Sprintf("%s/service/token", strings.TrimSuffix(ep, "/")) + } + // TODO: Double check if the internal core URL can be removed, after the token service URI is built according to the Host info in request. rawCoreURL := config.InternalCoreURL() if match(req.Context(), req.Host, rawCoreURL) { - return rawCoreURL, nil + return getURL(rawCoreURL), nil + } + extEp, err := config.ExtEndpoint() + if err != nil { + return "", err + } + if len(req.Host) > 0 { + l := strings.Split(extEp, "://") + if len(l) > 1 { + return getURL(l[0] + "://" + req.Host), nil + } + return getURL(req.Host), nil } - return config.ExtEndpoint() + log.Infof("The Host is empty in the request, forming the URL via the configured external endpoint: %s", extEp) + return getURL(extEp), nil } func match(ctx context.Context, reqHost, rawURL string) bool { diff --git a/src/server/middleware/v2auth/auth_test.go b/src/server/middleware/v2auth/auth_test.go index 060a59eb7f1..6851cecfee2 100644 --- a/src/server/middleware/v2auth/auth_test.go +++ b/src/server/middleware/v2auth/auth_test.go @@ -222,70 +222,107 @@ func TestMiddleware(t *testing.T) { } func TestGetChallenge(t *testing.T) { - req1, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) - req1x := req1.Clone(req1.Context()) - req1x.SetBasicAuth("u", "p") - req2, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/_catalog", nil) - req2x := req2.Clone(req2.Context()) - req2x.Header.Set("Authorization", "Bearer xx") - req3, _ := http.NewRequest(http.MethodPost, "https://registry.test/v2/project_1/ubuntu/blobs/uploads/mount=?mount=sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f&from=project_2/ubuntu", nil) - req3 = req3.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ - Repository: "project_1/ubuntu", - Reference: "14.04", - ProjectName: "project_1", - BlobMountRepository: "project_2/ubuntu", - BlobMountProjectName: "project_2", - BlobMountDigest: "sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f", - })) - req3x := req3.Clone(req3.Context()) - req3x.SetBasicAuth("", "") - req3x.Host = "harbor.test" - req4, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/project_1/hello-world/manifests/v1", nil) - req4 = req4.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ - Repository: "project_1/hello-world", - Reference: "v1", - ProjectName: "project_1", - })) - req4.Host = "harbor.core:8443" - cases := []struct { + name string request *http.Request challenge string }{ { - request: req1, + name: "Regular login request to '/v2' should return challenge whose realm is token URL with the Host header in Request", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) + return req + }(), + challenge: `Bearer realm="https://registry.test/service/token",service="harbor-registry"`, + }, + { + name: "Regular login request to '/v2' without 'Host', should return challenge whose realm is token URL with Ext endpoint", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) + req.Host = "" + return req + }(), challenge: `Bearer realm="https://harbor.test/service/token",service="harbor-registry"`, }, { - request: req1x, + name: "Request to 'v2' carrying basic auth header, the challenge should not have token service URI as realm b/c it's not from OCI client", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) + req.SetBasicAuth("u", "p") + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req2, + name: "Request to '/v2/_catalog' should return the challenge should not have token service URI as realm", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/_catalog", nil) + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req2x, + name: "Request to '/v2/_catalog' should return the challenge should not have token service URI as realm, disregarding the auth header in request", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/_catalog", nil) + req.Header.Set("Authorization", "Bearer xx") + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req3, + name: "Request to mount a blob from one repo to another should return challenge with scope according to the artifact info in the context of the request", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodPost, "https://harbor.test/v2/project_1/ubuntu/blobs/uploads/mount=?mount=sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f&from=project_2/ubuntu", nil) + req = req.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ + Repository: "project_1/ubuntu", + Reference: "14.04", + ProjectName: "project_1", + BlobMountRepository: "project_2/ubuntu", + BlobMountProjectName: "project_2", + BlobMountDigest: "sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f", + })) + return req + }(), challenge: `Bearer realm="https://harbor.test/service/token",service="harbor-registry",scope="repository:project_1/ubuntu:pull,push repository:project_2/ubuntu:pull"`, }, { - request: req3x, + name: "Request to be passed to registry, if it has basic auth header, it should return challenge without token URI as realm", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodPost, "https://harbor.test/v2/project_1/ubuntu/blobs/uploads/mount=?mount=sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f&from=project_2/ubuntu", nil) + req = req.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ + Repository: "project_1/ubuntu", + Reference: "14.04", + ProjectName: "project_1", + BlobMountRepository: "project_2/ubuntu", + BlobMountProjectName: "project_2", + BlobMountDigest: "sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f", + })) + req.SetBasicAuth("user", "password") + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req4, + name: "Request to be passed to registry, if it is sent from internal, the token service URI in the realm of the challenge should also point to the internal URI", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://harbor.core:8443/v2/project_1/hello-world/manifests/v1", nil) + req = req.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ + Repository: "project_1/hello-world", + Reference: "v1", + ProjectName: "project_1", + })) + return req + }(), challenge: `Bearer realm="https://harbor.core:8443/service/token",service="harbor-registry",scope="repository:project_1/hello-world:pull"`, }, } for _, c := range cases { - acs := accessList(c.request) - assert.Equal(t, c.challenge, getChallenge(c.request, acs)) + t.Run(c.name, func(t *testing.T) { + acs := accessList(c.request) + assert.Equal(t, c.challenge, getChallenge(c.request, acs)) + }) } - } func TestMatch(t *testing.T) { From f684c1c36e25de4ca7070fe5a96f8d98202e15b5 Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Wed, 30 Apr 2025 13:40:45 +0800 Subject: [PATCH 18/55] change python ./setup.py install to pip install . because deprecated (#21952) Signed-off-by: stonezdj --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0e6dfcf2b25..f1bce4e073c 100644 --- a/Makefile +++ b/Makefile @@ -539,7 +539,7 @@ swagger_client: rm -rf harborclient mkdir -p harborclient/harbor_v2_swagger_client java -jar openapi-generator-cli.jar generate -i api/v2.0/swagger.yaml -g python -o harborclient/harbor_v2_swagger_client --package-name v2_swagger_client - cd harborclient/harbor_v2_swagger_client; python ./setup.py install + cd harborclient/harbor_v2_swagger_client; pip install . pip install docker -q pip freeze From bc8653abc7c0787c9cea6f779e69ff21bc9b1de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raphael=20Z=C3=B6llner?= <34909096+raphaelzoellner@users.noreply.github.com> Date: Wed, 7 May 2025 11:22:26 +0200 Subject: [PATCH 19/55] Add manifestcache push for tag and digest to local repository (#21141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Raphael ZÃļllner --- src/controller/proxy/controller_test.go | 3 +- src/controller/proxy/manifestcache.go | 29 +++++- src/controller/proxy/manifestcache_test.go | 109 ++++++++++++++++++++- 3 files changed, 131 insertions(+), 10 deletions(-) diff --git a/src/controller/proxy/controller_test.go b/src/controller/proxy/controller_test.go index a25fe959a57..4eee2020826 100644 --- a/src/controller/proxy/controller_test.go +++ b/src/controller/proxy/controller_test.go @@ -74,7 +74,8 @@ func (l *localInterfaceMock) PushManifestList(ctx context.Context, repo string, } func (l *localInterfaceMock) CheckDependencies(ctx context.Context, repo string, man distribution.Manifest) []distribution.Descriptor { - panic("implement me") + args := l.Called(ctx, repo, man) + return args.Get(0).([]distribution.Descriptor) } func (l *localInterfaceMock) DeleteManifest(repo, ref string) { diff --git a/src/controller/proxy/manifestcache.go b/src/controller/proxy/manifestcache.go index c4b38e24a90..4cbe9c03499 100644 --- a/src/controller/proxy/manifestcache.go +++ b/src/controller/proxy/manifestcache.go @@ -16,6 +16,7 @@ package proxy import ( "context" + "errors" "fmt" "strings" "time" @@ -28,7 +29,7 @@ import ( "github.com/goharbor/harbor/src/lib" libCache "github.com/goharbor/harbor/src/lib/cache" - "github.com/goharbor/harbor/src/lib/errors" + libErrors "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" ) @@ -142,7 +143,7 @@ func (m *ManifestListCache) push(ctx context.Context, repo, reference string, ma } } if len(newMan.References()) == 0 { - return errors.New("manifest list doesn't contain any pushed manifest") + return libErrors.New("manifest list doesn't contain any pushed manifest") } _, pl, err := newMan.Payload() if err != nil { @@ -198,10 +199,30 @@ func (m *ManifestCache) CacheContent(ctx context.Context, remoteRepo string, man } } } - err := m.local.PushManifest(art.Repository, getReference(art), man) + + err := m.push(art, man) if err != nil { - log.Errorf("failed to push manifest, tag: %v, error %v", art.Tag, err) + log.Errorf("error occurred on manifest push to local: %v", err) + } +} + +func (m *ManifestCache) push(art lib.ArtifactInfo, man distribution.Manifest) error { + errs := []error{} + if len(art.Digest) > 0 { + err := m.local.PushManifest(art.Repository, art.Digest, man) + if err != nil { + log.Errorf("failed to push manifest referencing digest, tag: %v, digest: %v, error %v", art.Tag, art.Digest, err) + errs = append(errs, err) + } + } + if len(art.Tag) > 0 { + err := m.local.PushManifest(art.Repository, art.Tag, man) + if err != nil { + log.Errorf("failed to push manifest referencing tag, tag: %v, digest: %v, error %v", art.Tag, art.Digest, err) + errs = append(errs, err) + } } + return errors.Join(errs...) } func (m *ManifestCache) putBlobToLocal(remoteRepo string, localRepo string, desc distribution.Descriptor, r RemoteInterface) error { diff --git a/src/controller/proxy/manifestcache_test.go b/src/controller/proxy/manifestcache_test.go index ebbbf5dba1d..c4d1d209518 100644 --- a/src/controller/proxy/manifestcache_test.go +++ b/src/controller/proxy/manifestcache_test.go @@ -29,17 +29,41 @@ import ( "github.com/goharbor/harbor/src/controller/artifact" "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/testing/mock" + + v1 "github.com/opencontainers/image-spec/specs-go/v1" ) +const ociManifest = `{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.example.config.v1+json", + "digest": "sha256:5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03", + "size": 123 + }, + "layers": [ + { + "mediaType": "application/vnd.example.data.v1.tar+gzip", + "digest": "sha256:e258d248fda94c63753607f7c4494ee0fcbe92f1a76bfdac795c9d84101eb317", + "size": 1234 + } + ], + "annotations": { + "com.example.key1": "value1" + } +}` + type CacheTestSuite struct { suite.Suite - mHandler *ManifestListCache - local localInterfaceMock + mCache *ManifestCache + mListCache *ManifestListCache + local localInterfaceMock } func (suite *CacheTestSuite) SetupSuite() { suite.local = localInterfaceMock{} - suite.mHandler = &ManifestListCache{local: &suite.local} + suite.mListCache = &ManifestListCache{local: &suite.local} + suite.mCache = &ManifestCache{local: &suite.local} } func (suite *CacheTestSuite) TearDownSuite() { @@ -89,7 +113,7 @@ func (suite *CacheTestSuite) TestUpdateManifestList() { suite.local.On("GetManifest", ctx, artInfo1).Return(ar, nil) suite.local.On("GetManifest", ctx, mock.Anything).Return(nil, nil) - newMan, err := suite.mHandler.updateManifestList(ctx, "library/hello-world", manList) + newMan, err := suite.mListCache.updateManifestList(ctx, "library/hello-world", manList) suite.Require().Nil(err) suite.Assert().Equal(len(newMan.References()), 1) } @@ -147,10 +171,85 @@ func (suite *CacheTestSuite) TestPushManifestList() { suite.local.On("PushManifest", repo, originDigest, mock.Anything).Return(fmt.Errorf("wrong digest")) suite.local.On("PushManifest", repo, mock.Anything, mock.Anything).Return(nil) - err = suite.mHandler.push(ctx, "library/hello-world", string(originDigest), manList) + err = suite.mListCache.push(ctx, "library/hello-world", string(originDigest), manList) suite.Require().Nil(err) } +func (suite *CacheTestSuite) TestManifestCache_CacheContent() { + defer suite.local.AssertExpectations(suite.T()) + + manifest := ociManifest + man, desc, err := distribution.UnmarshalManifest(v1.MediaTypeImageManifest, []byte(manifest)) + suite.Require().NoError(err) + + ctx := context.Background() + repo := "library/hello-world" + + artInfo := lib.ArtifactInfo{ + Repository: repo, + Digest: string(desc.Digest), + Tag: "latest", + } + + suite.local.On("CheckDependencies", ctx, artInfo.Repository, man).Once().Return([]distribution.Descriptor{}) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Digest, man).Once().Return(nil) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Tag, man).Once().Return(nil) + + suite.mCache.CacheContent(ctx, repo, man, artInfo, nil, "") +} + +func (suite *CacheTestSuite) TestManifestCache_push_succeeds() { + defer suite.local.AssertExpectations(suite.T()) + + manifest := ociManifest + man, desc, err := distribution.UnmarshalManifest(v1.MediaTypeImageManifest, []byte(manifest)) + suite.Require().NoError(err) + + repo := "library/hello-world" + + artInfo := lib.ArtifactInfo{ + Repository: repo, + Digest: string(desc.Digest), + Tag: "latest", + } + + suite.local.On("PushManifest", artInfo.Repository, artInfo.Digest, man).Once().Return(nil) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Tag, man).Once().Return(nil) + + err = suite.mCache.push(artInfo, man) + suite.Assert().NoError(err) +} + +func (suite *CacheTestSuite) TestManifestCache_push_fails() { + defer suite.local.AssertExpectations(suite.T()) + + manifest := ociManifest + man, desc, err := distribution.UnmarshalManifest(v1.MediaTypeImageManifest, []byte(manifest)) + suite.Require().NoError(err) + + repo := "library/hello-world" + + artInfo := lib.ArtifactInfo{ + Repository: repo, + Digest: string(desc.Digest), + Tag: "latest", + } + + digestErr := fmt.Errorf("error during manifest push referencing digest") + tagErr := fmt.Errorf("error during manifest push referencing tag") + suite.local.On("PushManifest", artInfo.Repository, artInfo.Digest, man).Once().Return(digestErr) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Tag, man).Once().Return(tagErr) + + err = suite.mCache.push(artInfo, man) + suite.Assert().Error(err) + wrappedErr, isWrappedErr := err.(interface{ Unwrap() []error }) + suite.Assert().True(isWrappedErr) + errs := wrappedErr.Unwrap() + suite.Assert().Len(errs, 2) + suite.Assert().Contains(errs, digestErr) + suite.Assert().Contains(errs, tagErr) +} + func TestCacheTestSuite(t *testing.T) { suite.Run(t, &CacheTestSuite{}) } From 49df3b4362d75a5dbd7645c975909f7911ea810e Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Thu, 8 May 2025 14:25:05 +0800 Subject: [PATCH 20/55] Display gc progress information in running state (#21974) fix #21411 Signed-off-by: stonezdj --- .../clearing-job/gc-page/gc/gc-history/gc-history.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts b/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts index 60d1a507464..709f0d16e4d 100644 --- a/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts +++ b/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts @@ -284,6 +284,6 @@ export class GcHistoryComponent implements OnInit, OnDestroy { } shouldShowDetails(status: string): boolean { - return status !== JOB_STATUS.PENDING && status !== JOB_STATUS.RUNNING; + return status !== JOB_STATUS.PENDING; } } From 9e18bbc112de62ecc517cdc99e33a270574c3571 Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Thu, 8 May 2025 19:02:49 +0800 Subject: [PATCH 21/55] refactor: replace interface{} to any (#21973) Signed-off-by: chlins --- src/.golangci.yaml | 4 +- src/common/api/base.go | 6 +- src/common/dao/base.go | 2 +- src/common/dao/dao_test.go | 2 +- src/common/http/client.go | 8 +- src/common/job/models/models.go | 4 +- src/common/rbac/project/namespace.go | 2 +- src/common/rbac/system/namespace.go | 2 +- src/common/security/v2token/context.go | 2 +- src/common/utils/test/config.go | 4 +- src/common/utils/test/registryctl.go | 2 +- src/common/utils/test/test.go | 6 +- src/common/utils/uaa/client.go | 2 +- src/common/utils/utils.go | 18 +-- src/common/utils/utils_test.go | 14 +-- .../artifact/annotation/v1alpha1_test.go | 12 +- src/controller/artifact/controller.go | 8 +- src/controller/artifact/helper_test.go | 4 +- src/controller/artifact/model.go | 2 +- .../artifact/processor/base/manifest.go | 6 +- .../artifact/processor/chart/chart_test.go | 2 +- src/controller/artifact/processor/default.go | 2 +- .../artifact/processor/default_test.go | 4 +- .../artifact/processor/image/manifest_v1.go | 2 +- .../artifact/processor/image/manifest_v2.go | 2 +- .../artifact/processor/wasm/wasm.go | 4 +- src/controller/blob/controller.go | 4 +- src/controller/config/controller.go | 26 ++--- src/controller/config/controller_test.go | 18 +-- src/controller/config/test/controller_test.go | 14 +-- .../event/handler/auditlog/auditlog.go | 2 +- .../event/handler/internal/artifact.go | 4 +- .../event/handler/internal/project.go | 2 +- src/controller/event/handler/p2p/preheat.go | 2 +- .../event/handler/p2p/preheat_test.go | 2 +- .../event/handler/replication/replication.go | 6 +- .../event/handler/util/util_test.go | 2 +- .../handler/webhook/artifact/artifact.go | 2 +- .../handler/webhook/artifact/replication.go | 2 +- .../webhook/artifact/replication_test.go | 2 +- .../handler/webhook/artifact/retention.go | 2 +- .../webhook/artifact/retention_test.go | 2 +- .../event/handler/webhook/quota/quota.go | 2 +- .../event/handler/webhook/quota/quota_test.go | 4 +- .../event/handler/webhook/scan/scan.go | 6 +- .../event/handler/webhook/scan/scan_test.go | 6 +- src/controller/event/metadata/robot_test.go | 4 +- src/controller/gc/controller.go | 8 +- src/controller/gc/controller_test.go | 4 +- src/controller/gc/model.go | 12 +- src/controller/icon/controller.go | 2 +- src/controller/jobservice/model.go | 2 +- src/controller/jobservice/schedule.go | 4 +- src/controller/jobservice/schedule_test.go | 4 +- src/controller/ldap/controller_test.go | 2 +- src/controller/member/controller.go | 24 ++-- src/controller/p2p/preheat/controller.go | 12 +- src/controller/p2p/preheat/controllor_test.go | 16 +-- src/controller/p2p/preheat/enforcer.go | 18 +-- src/controller/project/controller.go | 8 +- src/controller/proxy/inflight.go | 4 +- src/controller/purge/controller.go | 2 +- src/controller/purge/model.go | 12 +- src/controller/purge/model_test.go | 6 +- src/controller/quota/controller.go | 2 +- src/controller/quota/controller_test.go | 2 +- src/controller/quota/driver/project/util.go | 2 +- src/controller/quota/util.go | 2 +- src/controller/registry/controller.go | 6 +- src/controller/replication/execution.go | 6 +- src/controller/replication/execution_test.go | 4 +- src/controller/replication/flow/copy.go | 4 +- src/controller/replication/flow/deletion.go | 4 +- src/controller/replication/model/model.go | 12 +- src/controller/replication/policy.go | 10 +- .../replication/transfer/transfer.go | 16 +-- src/controller/repository/controller.go | 4 +- src/controller/retention/controller.go | 12 +- src/controller/retention/controller_test.go | 18 +-- src/controller/robot/controller_test.go | 6 +- src/controller/robot/model.go | 2 +- src/controller/scan/base_controller.go | 32 +++--- src/controller/scan/base_controller_test.go | 10 +- src/controller/scan/callback.go | 4 +- src/controller/scan/callback_test.go | 6 +- src/controller/scan/controller.go | 4 +- src/controller/scandataexport/execution.go | 10 +- .../scandataexport/execution_test.go | 12 +- src/controller/scanner/base_controller.go | 2 +- src/controller/securityhub/controller.go | 2 +- src/controller/systemartifact/execution.go | 2 +- .../systemartifact/execution_test.go | 6 +- src/controller/systeminfo/controller.go | 2 +- src/controller/systeminfo/controller_test.go | 10 +- src/controller/tag/controller.go | 2 +- src/controller/task/sweep.go | 4 +- src/controller/user/controller.go | 2 +- .../usergroup/test/controller_test.go | 2 +- src/controller/webhook/controller.go | 2 +- src/core/api/api_test.go | 6 +- src/core/api/base.go | 10 +- src/core/auth/authproxy/auth_test.go | 2 +- src/core/auth/ldap/ldap_test.go | 2 +- src/core/controllers/oidc.go | 2 +- src/core/service/token/token_test.go | 4 +- src/core/session/codec.go | 10 +- src/core/session/codec_test.go | 4 +- src/core/session/session.go | 14 +-- src/jobservice/README.md | 2 +- src/jobservice/api/handler.go | 2 +- src/jobservice/common/list/list.go | 4 +- src/jobservice/common/list/list_test.go | 2 +- src/jobservice/common/query/q.go | 6 +- src/jobservice/common/rds/utils.go | 10 +- src/jobservice/common/utils/utils_test.go | 2 +- src/jobservice/config/config.go | 2 +- src/jobservice/core/controller_test.go | 12 +- src/jobservice/errs/errors.go | 2 +- src/jobservice/job/context.go | 2 +- src/jobservice/job/impl/context.go | 12 +- src/jobservice/job/impl/context_test.go | 4 +- src/jobservice/job/impl/default_context.go | 8 +- .../job/impl/gc/garbage_collection.go | 4 +- .../job/impl/gc/garbage_collection_test.go | 10 +- .../job/impl/notification/slack_job.go | 4 +- .../job/impl/notification/slack_job_test.go | 4 +- .../job/impl/notification/webhook_job.go | 4 +- .../job/impl/notification/webhook_job_test.go | 4 +- .../job/impl/replication/replication.go | 4 +- .../job/impl/replication/replication_test.go | 4 +- .../impl/scandataexport/scan_data_export.go | 10 +- .../scandataexport/scan_data_export_test.go | 54 ++++----- src/jobservice/job/interface.go | 2 +- src/jobservice/job/models.go | 2 +- src/jobservice/job/status_test.go | 4 +- src/jobservice/job/tracker.go | 14 +-- src/jobservice/lcm/controller.go | 2 +- src/jobservice/logger/backend/db_logger.go | 20 ++-- src/jobservice/logger/backend/file_logger.go | 20 ++-- src/jobservice/logger/backend/std_logger.go | 20 ++-- src/jobservice/logger/base.go | 4 +- src/jobservice/logger/base_test.go | 16 +-- src/jobservice/logger/entry.go | 20 ++-- src/jobservice/logger/interface.go | 20 ++-- .../logger/log_data_handler_test.go | 4 +- src/jobservice/logger/options.go | 10 +- src/jobservice/logger/service.go | 20 ++-- src/jobservice/mgt/manager.go | 8 +- src/jobservice/mgt/manager_test.go | 2 +- src/jobservice/migration/manager_test.go | 12 +- src/jobservice/migration/migrator_v180.go | 18 +-- src/jobservice/period/basic_scheduler.go | 2 +- src/jobservice/period/basic_scheduler_test.go | 4 +- src/jobservice/period/policy_store.go | 12 +- src/jobservice/runner/redis.go | 4 +- src/jobservice/runner/redis_test.go | 6 +- src/jobservice/runner/wrapper.go | 2 +- src/jobservice/runtime/bootstrap.go | 2 +- src/jobservice/sync/schedule.go | 4 +- src/jobservice/sync/schedule_test.go | 4 +- src/jobservice/worker/cworker/c_worker.go | 12 +- .../worker/cworker/c_worker_test.go | 6 +- .../worker/cworker/de_duplicator.go | 4 +- .../worker/cworker/de_duplicator_test.go | 2 +- src/jobservice/worker/cworker/reaper.go | 4 +- src/jobservice/worker/cworker/reaper_test.go | 6 +- src/jobservice/worker/interface.go | 14 +-- src/lib/cache/cache.go | 4 +- src/lib/cache/codec.go | 8 +- src/lib/cache/helper.go | 2 +- src/lib/cache/helper_test.go | 12 +- src/lib/cache/memory/memory.go | 6 +- src/lib/cache/memory/memory_test.go | 4 +- src/lib/cache/redis/redis.go | 4 +- src/lib/cache/redis/redis_test.go | 4 +- src/lib/cache/util.go | 4 +- src/lib/config/config.go | 14 +-- src/lib/config/metadata/type.go | 24 ++-- src/lib/config/metadata/type_test.go | 2 +- src/lib/config/metadata/value.go | 4 +- src/lib/config/metadata/value_test.go | 2 +- src/lib/config/models/model.go | 4 +- src/lib/config/test/userconfig_test.go | 8 +- src/lib/config/userconfig.go | 2 +- src/lib/context.go | 4 +- src/lib/convert_types.go | 2 +- src/lib/convert_types_test.go | 2 +- src/lib/encrypt/encrypt.go | 2 +- src/lib/encrypt/keyprovider.go | 6 +- src/lib/errors/errors.go | 8 +- src/lib/json_copy.go | 2 +- src/lib/json_copy_test.go | 6 +- src/lib/log/logger.go | 54 ++++----- src/lib/orm/error.go | 10 +- src/lib/orm/metadata.go | 6 +- src/lib/orm/metadata_test.go | 2 +- src/lib/orm/orm.go | 6 +- src/lib/orm/query.go | 8 +- src/lib/orm/test/orm_test.go | 2 +- src/lib/q/builder.go | 12 +- src/lib/q/query.go | 18 +-- src/lib/selector/selector.go | 4 +- .../selector/selectors/doublestar/selector.go | 2 +- src/lib/selector/selectors/index/index.go | 2 +- src/lib/selector/selectors/label/selector.go | 2 +- .../selector/selectors/severity/selector.go | 2 +- .../selector/selectors/signature/selector.go | 2 +- src/lib/set.go | 10 +- src/pkg/accessory/dao/dao_test.go | 10 +- src/pkg/artifact/dao/dao.go | 12 +- src/pkg/artifact/dao/dao_test.go | 26 ++--- src/pkg/artifact/model.go | 34 +++--- src/pkg/artifact/model_test.go | 2 +- src/pkg/audit/dao/dao.go | 2 +- src/pkg/audit/dao/dao_test.go | 6 +- src/pkg/auditext/dao/dao_test.go | 6 +- src/pkg/auditext/event/utils.go | 10 +- src/pkg/auditext/event/utils_test.go | 10 +- src/pkg/blob/dao/dao.go | 12 +- src/pkg/blob/dao/dao_test.go | 4 +- src/pkg/blob/manager_test.go | 8 +- src/pkg/blob/models/blob.go | 6 +- src/pkg/cached/base_manager.go | 4 +- src/pkg/cached/base_manager_test.go | 2 +- src/pkg/cached/manager.go | 2 +- src/pkg/cached/project/redis/manager.go | 2 +- src/pkg/chart/model.go | 2 +- src/pkg/chart/operator.go | 6 +- src/pkg/config/db/cache.go | 8 +- src/pkg/config/db/cache_test.go | 4 +- src/pkg/config/db/dao/dao.go | 2 +- src/pkg/config/db/db.go | 6 +- src/pkg/config/db/db_test.go | 6 +- src/pkg/config/db/manager_test.go | 10 +- src/pkg/config/inmemory/manager.go | 10 +- src/pkg/config/inmemory/manager_test.go | 2 +- src/pkg/config/manager.go | 14 +-- src/pkg/config/rest/rest.go | 10 +- src/pkg/config/rest/rest_test.go | 8 +- src/pkg/config/store/driver.go | 4 +- src/pkg/config/store/store.go | 12 +- src/pkg/config/validate/ldapgroup.go | 2 +- .../config/validate/test/ldapgroup_test.go | 10 +- src/pkg/config/validate/validate.go | 2 +- src/pkg/exporter/cache.go | 6 +- src/pkg/exporter/statistics_collector.go | 4 +- src/pkg/label/dao/dao_test.go | 2 +- src/pkg/label/manager.go | 6 +- src/pkg/member/dao/dao.go | 8 +- src/pkg/notification/hook/hook.go | 4 +- src/pkg/notification/policy/dao/dao_test.go | 4 +- src/pkg/notifier/event/event.go | 2 +- .../handler/notification/http_handler.go | 4 +- .../handler/notification/slack_handler.go | 6 +- src/pkg/notifier/model/event.go | 10 +- src/pkg/notifier/notification_handler.go | 2 +- src/pkg/notifier/notifier.go | 4 +- src/pkg/notifier/notifier_test.go | 4 +- src/pkg/oidc/helper.go | 8 +- src/pkg/oidc/helper_test.go | 36 +++--- src/pkg/p2p/preheat/dao/instance/dao_test.go | 2 +- src/pkg/p2p/preheat/dao/policy/dao_test.go | 2 +- src/pkg/p2p/preheat/job_test.go | 2 +- src/pkg/p2p/preheat/models/policy/policy.go | 16 +-- .../p2p/preheat/models/policy/policy_test.go | 4 +- src/pkg/p2p/preheat/policy/manager.go | 2 +- .../preheat/provider/client/http_client.go | 4 +- src/pkg/p2p/preheat/provider/dragonfly.go | 2 +- .../p2p/preheat/provider/dragonfly_test.go | 2 +- src/pkg/p2p/preheat/provider/preheat_image.go | 4 +- .../permission/evaluator/rbac/casbin_match.go | 6 +- .../evaluator/rbac/casbin_match_test.go | 2 +- src/pkg/permission/types/namespace.go | 2 +- src/pkg/project/dao/dao.go | 2 +- src/pkg/project/manager.go | 4 +- src/pkg/project/models/project.go | 10 +- src/pkg/proxy/secret/manager.go | 2 +- src/pkg/quota/dao/dao.go | 6 +- src/pkg/quota/dao/util.go | 4 +- src/pkg/quota/driver/driver.go | 2 +- src/pkg/rbac/dao/dao.go | 2 +- src/pkg/rbac/dao/dao_test.go | 6 +- src/pkg/reg/adapter/dtr/client.go | 2 +- src/pkg/reg/adapter/gitlab/adapter.go | 2 +- src/pkg/reg/adapter/gitlab/client.go | 2 +- src/pkg/reg/adapter/harbor/base/adapter.go | 18 +-- .../reg/adapter/harbor/base/adapter_test.go | 32 +++--- src/pkg/reg/adapter/harbor/base/client.go | 6 +- src/pkg/reg/adapter/huawei/huawei_adapter.go | 6 +- .../reg/adapter/huawei/huawei_adapter_test.go | 2 +- src/pkg/reg/adapter/huawei/image_registry.go | 2 +- src/pkg/reg/adapter/volcenginecr/consts.go | 2 +- src/pkg/reg/dao/dao_test.go | 4 +- src/pkg/reg/model/namespace.go | 4 +- src/pkg/reg/model/policy.go | 8 +- src/pkg/reg/model/resource.go | 12 +- .../interceptor/readonly/interceptor_test.go | 2 +- src/pkg/replication/dao/dao_test.go | 4 +- src/pkg/repository/dao/dao_test.go | 4 +- src/pkg/repository/manager.go | 2 +- src/pkg/repository/model/model.go | 2 +- src/pkg/retention/dao/retention_test.go | 2 +- src/pkg/retention/job_test.go | 22 ++-- src/pkg/retention/launcher.go | 8 +- src/pkg/retention/manager_test.go | 4 +- .../retention/policy/action/index/index.go | 2 +- .../policy/action/index/index_test.go | 4 +- src/pkg/retention/policy/action/performer.go | 4 +- src/pkg/retention/policy/models.go | 4 +- src/pkg/retention/policy/models_test.go | 12 +- src/pkg/retention/policy/rule/index/index.go | 2 +- src/pkg/retention/policy/rule/models.go | 2 +- src/pkg/robot/dao/dao_test.go | 10 +- src/pkg/scan/dao/scan/report_test.go | 4 +- src/pkg/scan/dao/scan/vulnerability_test.go | 2 +- src/pkg/scan/dao/scanner/model.go | 6 +- src/pkg/scan/dao/scanner/registration_test.go | 4 +- src/pkg/scan/export/manager.go | 2 +- src/pkg/scan/export/manager_test.go | 4 +- src/pkg/scan/handler.go | 4 +- src/pkg/scan/init_test.go | 20 ++-- src/pkg/scan/job.go | 4 +- .../scan/postprocessors/report_converters.go | 8 +- src/pkg/scan/report/manager.go | 2 +- src/pkg/scan/report/report.go | 10 +- src/pkg/scan/report/summary.go | 12 +- src/pkg/scan/report/supported_mimes.go | 4 +- src/pkg/scan/rest/v1/client.go | 2 +- src/pkg/scan/rest/v1/models.go | 6 +- src/pkg/scan/sbom/dao/dao_test.go | 6 +- src/pkg/scan/sbom/manager.go | 2 +- src/pkg/scan/sbom/model/report.go | 2 +- src/pkg/scan/sbom/model/summary.go | 2 +- src/pkg/scan/sbom/sbom.go | 10 +- src/pkg/scan/scanner/manager_test.go | 2 +- src/pkg/scan/vuln/report.go | 4 +- src/pkg/scan/vulnerability/vul.go | 6 +- src/pkg/scheduler/dao_test.go | 2 +- src/pkg/scheduler/scheduler.go | 32 +++--- src/pkg/scheduler/scheduler_test.go | 2 +- src/pkg/securityhub/dao/security.go | 20 ++-- src/pkg/securityhub/dao/security_test.go | 16 +-- src/pkg/systemartifact/cleanupcriteria.go | 2 +- .../systemartifact/cleanupcriteria_test.go | 2 +- src/pkg/systemartifact/dao/dao_test.go | 2 +- src/pkg/tag/dao/dao.go | 2 +- src/pkg/tag/dao/dao_test.go | 8 +- src/pkg/task/dao/execution.go | 8 +- src/pkg/task/dao/execution_test.go | 8 +- src/pkg/task/dao/task.go | 2 +- src/pkg/task/dao/task_test.go | 8 +- src/pkg/task/execution.go | 18 +-- src/pkg/task/execution_test.go | 4 +- src/pkg/task/hook.go | 2 +- src/pkg/task/model.go | 12 +- src/pkg/task/sweep_job_test.go | 2 +- src/pkg/task/sweep_manager.go | 8 +- src/pkg/task/task.go | 12 +- src/pkg/task/task_test.go | 6 +- src/pkg/token/options.go | 2 +- src/pkg/token/token.go | 2 +- src/pkg/user/dao/user.go | 2 +- src/registryctl/api/base.go | 2 +- src/server/middleware/cosign/cosign_test.go | 4 +- src/server/middleware/csrf/csrf_test.go | 6 +- src/server/middleware/log/log_test.go | 2 +- .../middleware/security/auth_proxy_test.go | 2 +- src/server/middleware/security/robot_test.go | 2 +- src/server/middleware/subject/subject_test.go | 6 +- .../transaction/transaction_test.go | 4 +- src/server/middleware/v2auth/auth_test.go | 8 +- src/server/registry/referrers.go | 4 +- src/server/registry/tag.go | 2 +- src/server/v2.0/handler/artifact.go | 4 +- src/server/v2.0/handler/artifact_test.go | 12 +- src/server/v2.0/handler/assembler/report.go | 4 +- .../v2.0/handler/assembler/report_test.go | 8 +- src/server/v2.0/handler/base.go | 6 +- src/server/v2.0/handler/config.go | 4 +- src/server/v2.0/handler/gc.go | 6 +- src/server/v2.0/handler/handler.go | 2 +- src/server/v2.0/handler/immutable.go | 2 +- src/server/v2.0/handler/model/artifact.go | 4 +- src/server/v2.0/handler/model/quota.go | 2 +- src/server/v2.0/handler/preheat.go | 8 +- src/server/v2.0/handler/project.go | 6 +- src/server/v2.0/handler/project_test.go | 10 +- src/server/v2.0/handler/purge.go | 10 +- src/server/v2.0/handler/purge_test.go | 26 ++--- src/server/v2.0/handler/quota_test.go | 12 +- src/server/v2.0/handler/replication.go | 6 +- src/server/v2.0/handler/repository.go | 6 +- src/server/v2.0/handler/retention.go | 2 +- src/server/v2.0/handler/robot.go | 2 +- src/server/v2.0/handler/scan.go | 2 +- src/server/v2.0/handler/scan_all.go | 6 +- src/server/v2.0/handler/scan_all_test.go | 8 +- src/server/v2.0/handler/scanexport.go | 2 +- src/server/v2.0/handler/scanexport_test.go | 4 +- src/server/v2.0/handler/scanner_test.go | 52 ++++----- src/server/v2.0/handler/search.go | 2 +- src/server/v2.0/handler/statistic.go | 8 +- src/server/v2.0/handler/util.go | 6 +- src/server/v2.0/handler/util_test.go | 2 +- src/server/v2.0/handler/webhook.go | 4 +- src/server/v2.0/handler/webhook_job.go | 2 +- src/testing/jobservice/context.go | 22 ++-- src/testing/lib/orm/orm.go | 104 +++++++++--------- src/testing/mock/mock.go | 6 +- src/testing/server/v2.0/handler/handler.go | 8 +- src/testing/suite.go | 2 +- tools/swagger/templates/README.md | 8 +- tools/swagger/templates/server/builder.gotmpl | 2 +- 413 files changed, 1416 insertions(+), 1416 deletions(-) diff --git a/src/.golangci.yaml b/src/.golangci.yaml index 6d993241540..c9464bea1e0 100644 --- a/src/.golangci.yaml +++ b/src/.golangci.yaml @@ -30,7 +30,7 @@ linters: - third_party$ - builtin$ - examples$ - - _test\.go + - .*_test\.go - .*test\.go - testing - src/jobservice/mgt/mock_manager.go @@ -50,7 +50,7 @@ formatters: - third_party$ - builtin$ - examples$ - - _test\.go + - .*_test\.go - .*test\.go - testing - src/jobservice/mgt/mock_manager.go diff --git a/src/common/api/base.go b/src/common/api/base.go index d2b18c251f7..213fdefc7a4 100644 --- a/src/common/api/base.go +++ b/src/common/api/base.go @@ -78,7 +78,7 @@ func (b *BaseAPI) RenderError(code int, text string) { } // DecodeJSONReq decodes a json request -func (b *BaseAPI) DecodeJSONReq(v interface{}) error { +func (b *BaseAPI) DecodeJSONReq(v any) error { err := json.Unmarshal(b.Ctx.Input.CopyBody(1<<35), v) if err != nil { log.Errorf("Error while decoding the json request, error: %v, %v", @@ -89,7 +89,7 @@ func (b *BaseAPI) DecodeJSONReq(v interface{}) error { } // Validate validates v if it implements interface validation.ValidFormer -func (b *BaseAPI) Validate(v interface{}) (bool, error) { +func (b *BaseAPI) Validate(v any) (bool, error) { validator := validation.Validation{} isValid, err := validator.Valid(v) if err != nil { @@ -108,7 +108,7 @@ func (b *BaseAPI) Validate(v interface{}) (bool, error) { } // DecodeJSONReqAndValidate does both decoding and validation -func (b *BaseAPI) DecodeJSONReqAndValidate(v interface{}) (bool, error) { +func (b *BaseAPI) DecodeJSONReqAndValidate(v any) (bool, error) { if err := b.DecodeJSONReq(v); err != nil { return false, err } diff --git a/src/common/dao/base.go b/src/common/dao/base.go index 96c854ff161..6f35c00576f 100644 --- a/src/common/dao/base.go +++ b/src/common/dao/base.go @@ -144,6 +144,6 @@ func (l *mLogger) Verbose() bool { } // Printf ... -func (l *mLogger) Printf(format string, v ...interface{}) { +func (l *mLogger) Printf(format string, v ...any) { l.logger.Infof(format, v...) } diff --git a/src/common/dao/dao_test.go b/src/common/dao/dao_test.go index 6efa0f86f5c..f68597b9d33 100644 --- a/src/common/dao/dao_test.go +++ b/src/common/dao/dao_test.go @@ -29,7 +29,7 @@ import ( var testCtx context.Context -func execUpdate(o orm.TxOrmer, sql string, params ...interface{}) error { +func execUpdate(o orm.TxOrmer, sql string, params ...any) error { p, err := o.Raw(sql).Prepare() if err != nil { return err diff --git a/src/common/http/client.go b/src/common/http/client.go index ed240a168c7..aca806e6531 100644 --- a/src/common/http/client.go +++ b/src/common/http/client.go @@ -69,7 +69,7 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) { } // Get ... -func (c *Client) Get(url string, v ...interface{}) error { +func (c *Client) Get(url string, v ...any) error { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return err @@ -98,7 +98,7 @@ func (c *Client) Head(url string) error { } // Post ... -func (c *Client) Post(url string, v ...interface{}) error { +func (c *Client) Post(url string, v ...any) error { var reader io.Reader if len(v) > 0 { if r, ok := v[0].(io.Reader); ok { @@ -123,7 +123,7 @@ func (c *Client) Post(url string, v ...interface{}) error { } // Put ... -func (c *Client) Put(url string, v ...interface{}) error { +func (c *Client) Put(url string, v ...any) error { var reader io.Reader if len(v) > 0 { data, err := json.Marshal(v[0]) @@ -176,7 +176,7 @@ func (c *Client) do(req *http.Request) ([]byte, error) { // GetAndIteratePagination iterates the pagination header and returns all resources // The parameter "v" must be a pointer to a slice -func (c *Client) GetAndIteratePagination(endpoint string, v interface{}) error { +func (c *Client) GetAndIteratePagination(endpoint string, v any) error { url, err := url.Parse(endpoint) if err != nil { return err diff --git a/src/common/job/models/models.go b/src/common/job/models/models.go index 8d13bd62822..7f1f9955fb3 100644 --- a/src/common/job/models/models.go +++ b/src/common/job/models/models.go @@ -15,7 +15,7 @@ package models // Parameters for job execution. -type Parameters map[string]interface{} +type Parameters map[string]any // JobRequest is the request of launching a job. type JobRequest struct { @@ -96,5 +96,5 @@ type JobStatusChange struct { // Message is designed for sub/pub messages type Message struct { Event string - Data interface{} // generic format + Data any // generic format } diff --git a/src/common/rbac/project/namespace.go b/src/common/rbac/project/namespace.go index 4c696521145..efc0a40e9ac 100644 --- a/src/common/rbac/project/namespace.go +++ b/src/common/rbac/project/namespace.go @@ -43,7 +43,7 @@ func (ns *projectNamespace) Resource(subresources ...types.Resource) types.Resou return types.Resource(fmt.Sprintf("/project/%d", ns.projectID)).Subresource(subresources...) } -func (ns *projectNamespace) Identity() interface{} { +func (ns *projectNamespace) Identity() any { return ns.projectID } diff --git a/src/common/rbac/system/namespace.go b/src/common/rbac/system/namespace.go index 1e1afceb986..1bb8e05b4b9 100644 --- a/src/common/rbac/system/namespace.go +++ b/src/common/rbac/system/namespace.go @@ -38,7 +38,7 @@ func (ns *systemNamespace) Resource(subresources ...types.Resource) types.Resour return types.Resource("/system/").Subresource(subresources...) } -func (ns *systemNamespace) Identity() interface{} { +func (ns *systemNamespace) Identity() any { return nil } diff --git a/src/common/security/v2token/context.go b/src/common/security/v2token/context.go index a3615721854..b0744f89c06 100644 --- a/src/common/security/v2token/context.go +++ b/src/common/security/v2token/context.go @@ -63,7 +63,7 @@ func (t *tokenSecurityCtx) GetMyProjects() ([]*models.Project, error) { return []*models.Project{}, nil } -func (t *tokenSecurityCtx) GetProjectRoles(_ interface{}) []int { +func (t *tokenSecurityCtx) GetProjectRoles(_ any) []int { return []int{} } diff --git a/src/common/utils/test/config.go b/src/common/utils/test/config.go index 62e557f6b5c..aa6c1dc954a 100644 --- a/src/common/utils/test/config.go +++ b/src/common/utils/test/config.go @@ -18,7 +18,7 @@ import ( "github.com/goharbor/harbor/src/common" ) -var defaultConfig = map[string]interface{}{ +var defaultConfig = map[string]any{ common.ExtEndpoint: "https://host01.com", common.AUTHMode: common.DBAuth, common.DatabaseType: "postgresql", @@ -66,6 +66,6 @@ var defaultConfig = map[string]interface{}{ } // GetDefaultConfigMap returns the default config map for easier modification. -func GetDefaultConfigMap() map[string]interface{} { +func GetDefaultConfigMap() map[string]any { return defaultConfig } diff --git a/src/common/utils/test/registryctl.go b/src/common/utils/test/registryctl.go index dff8b52c2b6..686fc3213bf 100644 --- a/src/common/utils/test/registryctl.go +++ b/src/common/utils/test/registryctl.go @@ -30,7 +30,7 @@ type GCResult struct { } // NewRegistryCtl returns a mock registry server -func NewRegistryCtl(_ map[string]interface{}) (*httptest.Server, error) { +func NewRegistryCtl(_ map[string]any) (*httptest.Server, error) { m := []*RequestHandlerMapping{} gcr := GCResult{true, "hello-world", time.Now(), time.Now()} diff --git a/src/common/utils/test/test.go b/src/common/utils/test/test.go index bbf8623cffd..06b52d011db 100644 --- a/src/common/utils/test/test.go +++ b/src/common/utils/test/test.go @@ -94,9 +94,9 @@ func NewServer(mappings ...*RequestHandlerMapping) *httptest.Server { } // GetUnitTestConfig ... -func GetUnitTestConfig() map[string]interface{} { +func GetUnitTestConfig() map[string]any { ipAddress := os.Getenv("IP") - return map[string]interface{}{ + return map[string]any{ common.ExtEndpoint: fmt.Sprintf("https://%s", ipAddress), common.AUTHMode: "db_auth", common.DatabaseType: "postgresql", @@ -130,7 +130,7 @@ func GetUnitTestConfig() map[string]interface{} { } // TraceCfgMap ... -func TraceCfgMap(cfgs map[string]interface{}) { +func TraceCfgMap(cfgs map[string]any) { var keys []string for k := range cfgs { keys = append(keys, k) diff --git a/src/common/utils/uaa/client.go b/src/common/utils/uaa/client.go index dddd175a82c..c67d8176b9a 100644 --- a/src/common/utils/uaa/client.go +++ b/src/common/utils/uaa/client.go @@ -89,7 +89,7 @@ type SearchUserEntry struct { ExtID string `json:"externalId"` UserName string `json:"userName"` Emails []SearchUserEmailEntry `json:"emails"` - Groups []interface{} + Groups []any } // SearchUserRes is the struct to parse the result of search user API of UAA diff --git a/src/common/utils/utils.go b/src/common/utils/utils.go index 01942310738..03560200e34 100644 --- a/src/common/utils/utils.go +++ b/src/common/utils/utils.go @@ -140,7 +140,7 @@ func ParseTimeStamp(timestamp string) (*time.Time, error) { } // ConvertMapToStruct is used to fill the specified struct with map. -func ConvertMapToStruct(object interface{}, values interface{}) error { +func ConvertMapToStruct(object any, values any) error { if object == nil { return errors.New("nil struct is not supported") } @@ -158,7 +158,7 @@ func ConvertMapToStruct(object interface{}, values interface{}) error { } // ParseProjectIDOrName parses value to ID(int64) or name(string) -func ParseProjectIDOrName(value interface{}) (int64, string, error) { +func ParseProjectIDOrName(value any) (int64, string, error) { if value == nil { return 0, "", errors.New("harborIDOrName is nil") } @@ -177,7 +177,7 @@ func ParseProjectIDOrName(value interface{}) (int64, string, error) { } // SafeCastString -- cast an object to string safely -func SafeCastString(value interface{}) string { +func SafeCastString(value any) string { if result, ok := value.(string); ok { return result } @@ -185,7 +185,7 @@ func SafeCastString(value interface{}) string { } // SafeCastInt -- -func SafeCastInt(value interface{}) int { +func SafeCastInt(value any) int { if result, ok := value.(int); ok { return result } @@ -193,7 +193,7 @@ func SafeCastInt(value interface{}) int { } // SafeCastBool -- -func SafeCastBool(value interface{}) bool { +func SafeCastBool(value any) bool { if result, ok := value.(bool); ok { return result } @@ -201,7 +201,7 @@ func SafeCastBool(value interface{}) bool { } // SafeCastFloat64 -- -func SafeCastFloat64(value interface{}) float64 { +func SafeCastFloat64(value any) float64 { if result, ok := value.(float64); ok { return result } @@ -214,9 +214,9 @@ func TrimLower(str string) string { } // GetStrValueOfAnyType return string format of any value, for map, need to convert to json -func GetStrValueOfAnyType(value interface{}) string { +func GetStrValueOfAnyType(value any) string { var strVal string - if _, ok := value.(map[string]interface{}); ok { + if _, ok := value.(map[string]any); ok { b, err := json.Marshal(value) if err != nil { log.Errorf("can not marshal json object, error %v", err) @@ -248,7 +248,7 @@ func IsIllegalLength(s string, minVal int, maxVal int) bool { } // ParseJSONInt ... -func ParseJSONInt(value interface{}) (int, bool) { +func ParseJSONInt(value any) (int, bool) { switch v := value.(type) { case float64: return int(v), true diff --git a/src/common/utils/utils_test.go b/src/common/utils/utils_test.go index 4e1ab2ef359..ab7dbf2c1f9 100644 --- a/src/common/utils/utils_test.go +++ b/src/common/utils/utils_test.go @@ -216,7 +216,7 @@ type testingStruct struct { } func TestConvertMapToStruct(t *testing.T) { - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) dataMap["Name"] = "testing" dataMap["Count"] = 100 @@ -232,7 +232,7 @@ func TestConvertMapToStruct(t *testing.T) { func TestSafeCastString(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -254,7 +254,7 @@ func TestSafeCastString(t *testing.T) { func TestSafeCastBool(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -276,7 +276,7 @@ func TestSafeCastBool(t *testing.T) { func TestSafeCastInt(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -298,7 +298,7 @@ func TestSafeCastInt(t *testing.T) { func TestSafeCastFloat64(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -342,7 +342,7 @@ func TestTrimLower(t *testing.T) { func TestGetStrValueOfAnyType(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -357,7 +357,7 @@ func TestGetStrValueOfAnyType(t *testing.T) { {"string", args{"hello world"}, "hello world"}, {"bool", args{true}, "true"}, {"bool", args{false}, "false"}, - {"map", args{map[string]interface{}{"key1": "value1"}}, "{\"key1\":\"value1\"}"}, + {"map", args{map[string]any{"key1": "value1"}}, "{\"key1\":\"value1\"}"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/controller/artifact/annotation/v1alpha1_test.go b/src/controller/artifact/annotation/v1alpha1_test.go index 09b376faa36..41bd6bcf64a 100644 --- a/src/controller/artifact/annotation/v1alpha1_test.go +++ b/src/controller/artifact/annotation/v1alpha1_test.go @@ -231,7 +231,7 @@ func (p *v1alpha1TestSuite) TestParse() { manifestMediaType, content, err := manifest.Payload() p.Require().Nil(err) - metadata := map[string]interface{}{} + metadata := map[string]any{} configBlob := io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) p.Require().Nil(err) @@ -244,7 +244,7 @@ func (p *v1alpha1TestSuite) TestParse() { p.Len(art.ExtraAttrs, 12) p.Equal("CNN Model", art.ExtraAttrs["description"]) p.Equal("TensorFlow", art.ExtraAttrs["framework"]) - p.Equal([]interface{}{map[string]interface{}{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) + p.Equal([]any{map[string]any{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) p.Equal("sha256:d923b93eadde0af5c639a972710a4d919066aba5d0dfbf4b9385099f70272da0", art.Icon) // ormbManifestWithoutSkipList @@ -255,7 +255,7 @@ func (p *v1alpha1TestSuite) TestParse() { manifestMediaType, content, err = manifest.Payload() p.Require().Nil(err) - metadata = map[string]interface{}{} + metadata = map[string]any{} configBlob = io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) p.Require().Nil(err) @@ -268,7 +268,7 @@ func (p *v1alpha1TestSuite) TestParse() { p.Len(art.ExtraAttrs, 13) p.Equal("CNN Model", art.ExtraAttrs["description"]) p.Equal("TensorFlow", art.ExtraAttrs["framework"]) - p.Equal([]interface{}{map[string]interface{}{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) + p.Equal([]any{map[string]any{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) p.Equal("sha256:d923b93eadde0af5c639a972710a4d919066aba5d0dfbf4b9385099f70272da0", art.Icon) // ormbManifestWithoutIcon @@ -279,7 +279,7 @@ func (p *v1alpha1TestSuite) TestParse() { manifestMediaType, content, err = manifest.Payload() p.Require().Nil(err) - metadata = map[string]interface{}{} + metadata = map[string]any{} configBlob = io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) p.Require().Nil(err) @@ -290,7 +290,7 @@ func (p *v1alpha1TestSuite) TestParse() { p.Len(art.ExtraAttrs, 12) p.Equal("CNN Model", art.ExtraAttrs["description"]) p.Equal("TensorFlow", art.ExtraAttrs["framework"]) - p.Equal([]interface{}{map[string]interface{}{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) + p.Equal([]any{map[string]any{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) p.Equal("", art.Icon) } diff --git a/src/controller/artifact/controller.go b/src/controller/artifact/controller.go index 42581878983..8a66871549d 100644 --- a/src/controller/artifact/controller.go +++ b/src/controller/artifact/controller.go @@ -313,7 +313,7 @@ func (c *controller) getByTag(ctx context.Context, repository, tag string, optio return nil, err } tags, err := c.tagCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": repo.RepositoryID, "Name": tag, }, @@ -356,7 +356,7 @@ func (c *controller) deleteDeeply(ctx context.Context, id int64, isRoot, isAcces return nil } parents, err := c.artMgr.ListReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ChildID": id, }, }) @@ -385,7 +385,7 @@ func (c *controller) deleteDeeply(ctx context.Context, id int64, isRoot, isAcces if acc.IsHard() { // if this acc artifact has parent(is child), set isRoot to false parents, err := c.artMgr.ListReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ChildID": acc.GetData().ArtifactID, }, }) @@ -752,7 +752,7 @@ func (c *controller) populateIcon(art *Artifact) { func (c *controller) populateTags(ctx context.Context, art *Artifact, option *tag.Option) { tags, err := c.tagCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": art.ID, }, }, option) diff --git a/src/controller/artifact/helper_test.go b/src/controller/artifact/helper_test.go index 14f3747e549..1b9064ff859 100644 --- a/src/controller/artifact/helper_test.go +++ b/src/controller/artifact/helper_test.go @@ -56,7 +56,7 @@ func (suite *IteratorTestSuite) TeardownSuite() { func (suite *IteratorTestSuite) TestIterator() { suite.accMgr.On("List", mock.Anything, mock.Anything).Return([]accessorymodel.Accessory{}, nil) - q1 := &q.Query{PageNumber: 1, PageSize: 5, Keywords: map[string]interface{}{}} + q1 := &q.Query{PageNumber: 1, PageSize: 5, Keywords: map[string]any{}} suite.artMgr.On("List", mock.Anything, q1).Return([]*artifact.Artifact{ {ID: 1}, {ID: 2}, @@ -65,7 +65,7 @@ func (suite *IteratorTestSuite) TestIterator() { {ID: 5}, }, nil) - q2 := &q.Query{PageNumber: 2, PageSize: 5, Keywords: map[string]interface{}{}} + q2 := &q.Query{PageNumber: 2, PageSize: 5, Keywords: map[string]any{}} suite.artMgr.On("List", mock.Anything, q2).Return([]*artifact.Artifact{ {ID: 6}, {ID: 7}, diff --git a/src/controller/artifact/model.go b/src/controller/artifact/model.go index 7305b5f3fb2..88da235c8c8 100644 --- a/src/controller/artifact/model.go +++ b/src/controller/artifact/model.go @@ -40,7 +40,7 @@ func (artifact *Artifact) UnmarshalJSON(data []byte) error { type Alias Artifact ali := &struct { *Alias - AccessoryItems []interface{} `json:"accessories,omitempty"` + AccessoryItems []any `json:"accessories,omitempty"` }{ Alias: (*Alias)(artifact), } diff --git a/src/controller/artifact/processor/base/manifest.go b/src/controller/artifact/processor/base/manifest.go index ad6e7cda1f2..0058c2fe01f 100644 --- a/src/controller/artifact/processor/base/manifest.go +++ b/src/controller/artifact/processor/base/manifest.go @@ -44,7 +44,7 @@ type ManifestProcessor struct { // AbstractMetadata abstracts metadata of artifact func (m *ManifestProcessor) AbstractMetadata(ctx context.Context, artifact *artifact.Artifact, content []byte) error { // parse metadata from config layer - metadata := map[string]interface{}{} + metadata := map[string]any{} if err := m.UnmarshalConfig(ctx, artifact.RepositoryName, content, &metadata); err != nil { return err } @@ -55,7 +55,7 @@ func (m *ManifestProcessor) AbstractMetadata(ctx context.Context, artifact *arti } if artifact.ExtraAttrs == nil { - artifact.ExtraAttrs = map[string]interface{}{} + artifact.ExtraAttrs = map[string]any{} } for _, property := range m.properties { artifact.ExtraAttrs[property] = metadata[property] @@ -80,7 +80,7 @@ func (m *ManifestProcessor) ListAdditionTypes(_ context.Context, _ *artifact.Art } // UnmarshalConfig unmarshal the config blob of the artifact into the specified object "v" -func (m *ManifestProcessor) UnmarshalConfig(_ context.Context, repository string, manifest []byte, v interface{}) error { +func (m *ManifestProcessor) UnmarshalConfig(_ context.Context, repository string, manifest []byte, v any) error { // unmarshal manifest mani := &v1.Manifest{} if err := json.Unmarshal(manifest, mani); err != nil { diff --git a/src/controller/artifact/processor/chart/chart_test.go b/src/controller/artifact/processor/chart/chart_test.go index 637da7bf6f0..e1ae67ded4d 100644 --- a/src/controller/artifact/processor/chart/chart_test.go +++ b/src/controller/artifact/processor/chart/chart_test.go @@ -89,7 +89,7 @@ func (p *processorTestSuite) TestAbstractAddition() { Repository: "github.com/goharbor", }, }, - Values: map[string]interface{}{ + Values: map[string]any{ "cluster.enable": true, "cluster.slaveCount": 1, "image.pullPolicy": "Always", diff --git a/src/controller/artifact/processor/default.go b/src/controller/artifact/processor/default.go index 5cb2ad17591..394b3de2454 100644 --- a/src/controller/artifact/processor/default.go +++ b/src/controller/artifact/processor/default.go @@ -110,7 +110,7 @@ func (d *defaultProcessor) AbstractMetadata(ctx context.Context, artifact *artif } defer blob.Close() // parse metadata from config layer - metadata := map[string]interface{}{} + metadata := map[string]any{} if err = json.NewDecoder(blob).Decode(&metadata); err != nil { return err } diff --git a/src/controller/artifact/processor/default_test.go b/src/controller/artifact/processor/default_test.go index 48994153957..83bd10bae75 100644 --- a/src/controller/artifact/processor/default_test.go +++ b/src/controller/artifact/processor/default_test.go @@ -268,7 +268,7 @@ func (d *defaultProcessorTestSuite) TestAbstractMetadata() { manifestMediaType, content, err := manifest.Payload() d.Require().Nil(err) - metadata := map[string]interface{}{} + metadata := map[string]any{} configBlob := io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) d.Require().Nil(err) @@ -289,7 +289,7 @@ func (d *defaultProcessorTestSuite) TestAbstractMetadataOfOCIManifesttWithUnknow d.Require().Nil(err) configBlob := io.NopCloser(strings.NewReader(UnknownJsonConfig)) - metadata := map[string]interface{}{} + metadata := map[string]any{} err = json.NewDecoder(configBlob).Decode(&metadata) d.Require().Nil(err) diff --git a/src/controller/artifact/processor/image/manifest_v1.go b/src/controller/artifact/processor/image/manifest_v1.go index 8179ad81e3e..7b64ad7fcba 100644 --- a/src/controller/artifact/processor/image/manifest_v1.go +++ b/src/controller/artifact/processor/image/manifest_v1.go @@ -44,7 +44,7 @@ func (m *manifestV1Processor) AbstractMetadata(_ context.Context, artifact *arti return err } if artifact.ExtraAttrs == nil { - artifact.ExtraAttrs = map[string]interface{}{} + artifact.ExtraAttrs = map[string]any{} } artifact.ExtraAttrs["architecture"] = mani.Architecture return nil diff --git a/src/controller/artifact/processor/image/manifest_v2.go b/src/controller/artifact/processor/image/manifest_v2.go index b88c2c2b49b..98847d4c21e 100644 --- a/src/controller/artifact/processor/image/manifest_v2.go +++ b/src/controller/artifact/processor/image/manifest_v2.go @@ -59,7 +59,7 @@ func (m *manifestV2Processor) AbstractMetadata(ctx context.Context, artifact *ar return err } if artifact.ExtraAttrs == nil { - artifact.ExtraAttrs = map[string]interface{}{} + artifact.ExtraAttrs = map[string]any{} } artifact.ExtraAttrs["created"] = config.Created artifact.ExtraAttrs["architecture"] = config.Architecture diff --git a/src/controller/artifact/processor/wasm/wasm.go b/src/controller/artifact/processor/wasm/wasm.go index 1118ef470b8..19edea423a8 100644 --- a/src/controller/artifact/processor/wasm/wasm.go +++ b/src/controller/artifact/processor/wasm/wasm.go @@ -62,14 +62,14 @@ type Processor struct { } func (m *Processor) AbstractMetadata(ctx context.Context, art *artifact.Artifact, manifestBody []byte) error { - art.ExtraAttrs = map[string]interface{}{} + art.ExtraAttrs = map[string]any{} manifest := &v1.Manifest{} if err := json.Unmarshal(manifestBody, manifest); err != nil { return err } if art.ExtraAttrs == nil { - art.ExtraAttrs = map[string]interface{}{} + art.ExtraAttrs = map[string]any{} } if manifest.Annotations[AnnotationVariantKey] == AnnotationVariantValue || manifest.Annotations[AnnotationHandlerKey] == AnnotationHandlerValue { // for annotation way diff --git a/src/controller/blob/controller.go b/src/controller/blob/controller.go index 46df973e331..2ab07dbc660 100644 --- a/src/controller/blob/controller.go +++ b/src/controller/blob/controller.go @@ -225,10 +225,10 @@ func (c *controller) Get(ctx context.Context, digest string, options ...Option) opts := newOptions(options...) - keywords := make(map[string]interface{}) + keywords := make(map[string]any) if digest != "" { ol := q.OrList{ - Values: []interface{}{ + Values: []any{ digest, }, } diff --git a/src/controller/config/controller.go b/src/controller/config/controller.go index 5302804aa14..5380d7634e2 100644 --- a/src/controller/config/controller.go +++ b/src/controller/config/controller.go @@ -46,11 +46,11 @@ type Controller interface { // UserConfigs get the user scope configurations UserConfigs(ctx context.Context) (map[string]*models.Value, error) // UpdateUserConfigs update the user scope configurations - UpdateUserConfigs(ctx context.Context, conf map[string]interface{}) error + UpdateUserConfigs(ctx context.Context, conf map[string]any) error // AllConfigs get all configurations, used by internal, should include the system config items - AllConfigs(ctx context.Context) (map[string]interface{}, error) + AllConfigs(ctx context.Context) (map[string]any, error) // ConvertForGet - delete sensitive attrs and add editable field to every attr - ConvertForGet(ctx context.Context, cfg map[string]interface{}, internal bool) (map[string]*models.Value, error) + ConvertForGet(ctx context.Context, cfg map[string]any, internal bool) (map[string]*models.Value, error) // OverwriteConfig overwrite config in the database and set all configure read only when CONFIG_OVERWRITE_JSON is provided OverwriteConfig(ctx context.Context) error } @@ -70,13 +70,13 @@ func (c *controller) UserConfigs(ctx context.Context) (map[string]*models.Value, return c.ConvertForGet(ctx, configs, false) } -func (c *controller) AllConfigs(ctx context.Context) (map[string]interface{}, error) { +func (c *controller) AllConfigs(ctx context.Context) (map[string]any, error) { mgr := config.GetCfgManager(ctx) configs := mgr.GetAll(ctx) return configs, nil } -func (c *controller) UpdateUserConfigs(ctx context.Context, conf map[string]interface{}) error { +func (c *controller) UpdateUserConfigs(ctx context.Context, conf map[string]any) error { if readOnlyForAll { return errors.ForbiddenError(nil).WithMessage("current config is init by env variable: CONFIG_OVERWRITE_JSON, it cannot be updated") } @@ -97,7 +97,7 @@ func (c *controller) UpdateUserConfigs(ctx context.Context, conf map[string]inte return c.updateLogEndpoint(ctx, conf) } -func (c *controller) updateLogEndpoint(ctx context.Context, cfgs map[string]interface{}) error { +func (c *controller) updateLogEndpoint(ctx context.Context, cfgs map[string]any) error { // check if the audit log forward endpoint updated if _, ok := cfgs[common.AuditLogForwardEndpoint]; ok { auditEP := config.AuditLogForwardEndpoint(ctx) @@ -112,7 +112,7 @@ func (c *controller) updateLogEndpoint(ctx context.Context, cfgs map[string]inte return nil } -func (c *controller) validateCfg(ctx context.Context, cfgs map[string]interface{}) error { +func (c *controller) validateCfg(ctx context.Context, cfgs map[string]any) error { mgr := config.GetCfgManager(ctx) // check if auth can be modified @@ -146,7 +146,7 @@ func (c *controller) validateCfg(ctx context.Context, cfgs map[string]interface{ return nil } -func verifySkipAuditLogCfg(ctx context.Context, cfgs map[string]interface{}, mgr config.Manager) error { +func verifySkipAuditLogCfg(ctx context.Context, cfgs map[string]any, mgr config.Manager) error { updated := false endPoint := mgr.Get(ctx, common.AuditLogForwardEndpoint).GetString() skipAuditDB := mgr.Get(ctx, common.SkipAuditLogDatabase).GetBool() @@ -169,7 +169,7 @@ func verifySkipAuditLogCfg(ctx context.Context, cfgs map[string]interface{}, mgr } // verifyValueLengthCfg verifies the cfgs which need to check the value max length to align with frontend. -func verifyValueLengthCfg(_ context.Context, cfgs map[string]interface{}) error { +func verifyValueLengthCfg(_ context.Context, cfgs map[string]any) error { maxValue := maxValueLimitedByLength(common.UIMaxLengthLimitedOfNumber) validateCfgs := []string{ common.TokenExpiration, @@ -217,11 +217,11 @@ func maxValueLimitedByLength(length int) int64 { // ScanAllPolicy is represent the json request and object for scan all policy // Only for migrating from the legacy schedule. type ScanAllPolicy struct { - Type string `json:"type"` - Param map[string]interface{} `json:"parameter,omitempty"` + Type string `json:"type"` + Param map[string]any `json:"parameter,omitempty"` } -func (c *controller) ConvertForGet(ctx context.Context, cfg map[string]interface{}, internal bool) (map[string]*models.Value, error) { +func (c *controller) ConvertForGet(ctx context.Context, cfg map[string]any, internal bool) (map[string]*models.Value, error) { result := map[string]*models.Value{} mList := metadata.Instance().GetAll() @@ -270,7 +270,7 @@ func (c *controller) ConvertForGet(ctx context.Context, cfg map[string]interface } func (c *controller) OverwriteConfig(ctx context.Context) error { - cfgMap := map[string]interface{}{} + cfgMap := map[string]any{} if v, ok := os.LookupEnv(configOverwriteJSON); ok { err := json.Unmarshal([]byte(v), &cfgMap) if err != nil { diff --git a/src/controller/config/controller_test.go b/src/controller/config/controller_test.go index d3f4ed9e64e..2fd554fa970 100644 --- a/src/controller/config/controller_test.go +++ b/src/controller/config/controller_test.go @@ -33,7 +33,7 @@ func Test_verifySkipAuditLogCfg(t *testing.T) { Return(&metadata.ConfigureValue{Name: common.SkipAuditLogDatabase, Value: "true"}) type args struct { ctx context.Context - cfgs map[string]interface{} + cfgs map[string]any mgr config.Manager } tests := []struct { @@ -42,17 +42,17 @@ func Test_verifySkipAuditLogCfg(t *testing.T) { wantErr bool }{ {name: "both configured", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{common.AuditLogForwardEndpoint: "harbor-log:15041", + cfgs: map[string]any{common.AuditLogForwardEndpoint: "harbor-log:15041", common.SkipAuditLogDatabase: true}, mgr: cfgManager}, wantErr: false}, {name: "no forward endpoint config", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{common.SkipAuditLogDatabase: true}, + cfgs: map[string]any{common.SkipAuditLogDatabase: true}, mgr: cfgManager}, wantErr: true}, {name: "none configured", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{}, + cfgs: map[string]any{}, mgr: cfgManager}, wantErr: false}, {name: "enabled skip audit log database, but change log forward endpoint to empty", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{common.AuditLogForwardEndpoint: ""}, + cfgs: map[string]any{common.AuditLogForwardEndpoint: ""}, mgr: cfgManager}, wantErr: true}, } for _, tt := range tests { @@ -89,24 +89,24 @@ func Test_maxValueLimitedByLength(t *testing.T) { func Test_verifyValueLengthCfg(t *testing.T) { type args struct { ctx context.Context - cfgs map[string]interface{} + cfgs map[string]any } tests := []struct { name string args args wantErr bool }{ - {name: "valid config", args: args{context.TODO(), map[string]interface{}{ + {name: "valid config", args: args{context.TODO(), map[string]any{ common.TokenExpiration: float64(100), common.RobotTokenDuration: float64(100), common.SessionTimeout: float64(100), }}, wantErr: false}, - {name: "invalid config with negative value", args: args{context.TODO(), map[string]interface{}{ + {name: "invalid config with negative value", args: args{context.TODO(), map[string]any{ common.TokenExpiration: float64(-1), common.RobotTokenDuration: float64(100), common.SessionTimeout: float64(100), }}, wantErr: true}, - {name: "invalid config with value over length limit", args: args{context.TODO(), map[string]interface{}{ + {name: "invalid config with value over length limit", args: args{context.TODO(), map[string]any{ common.TokenExpiration: float64(100), common.RobotTokenDuration: float64(100000000000000000), common.SessionTimeout: float64(100), diff --git a/src/controller/config/test/controller_test.go b/src/controller/config/test/controller_test.go index 5753460da0e..350214d6cc2 100644 --- a/src/controller/config/test/controller_test.go +++ b/src/controller/config/test/controller_test.go @@ -28,12 +28,12 @@ import ( htesting "github.com/goharbor/harbor/src/testing" ) -var TestDBConfig = map[string]interface{}{ +var TestDBConfig = map[string]any{ common.LDAPBaseDN: "dc=example,dc=com", common.LDAPURL: "ldap.example.com", } -var TestConfigWithScanAll = map[string]interface{}{ +var TestConfigWithScanAll = map[string]any{ "postgresql_host": "localhost", "postgresql_database": "registry", "postgresql_password": "root123", @@ -67,7 +67,7 @@ func (c *controllerTestSuite) TestGetUserCfg() { } func (c *controllerTestSuite) TestConvertForGet() { - conf := map[string]interface{}{ + conf := map[string]any{ "ldap_url": "ldaps.myexample,com", "ldap_base_dn": "dc=myexample,dc=com", "auth_mode": "ldap_auth", @@ -83,7 +83,7 @@ func (c *controllerTestSuite) TestConvertForGet() { c.False(exist) // password type should be sent to internal api call - conf2 := map[string]interface{}{ + conf2 := map[string]any{ "ldap_url": "ldaps.myexample,com", "ldap_base_dn": "dc=myexample,dc=com", "auth_mode": "ldap_auth", @@ -109,7 +109,7 @@ func (c *controllerTestSuite) TestGetAll() { func (c *controllerTestSuite) TestUpdateUserCfg() { - userConf := map[string]interface{}{ + userConf := map[string]any{ common.LDAPURL: "ldaps.myexample,com", common.LDAPBaseDN: "dc=myexample,dc=com", } @@ -121,7 +121,7 @@ func (c *controllerTestSuite) TestUpdateUserCfg() { } c.Equal("dc=myexample,dc=com", cfgResp["ldap_base_dn"].Val) c.Equal("ldaps.myexample,com", cfgResp["ldap_url"].Val) - badCfg := map[string]interface{}{ + badCfg := map[string]any{ common.LDAPScope: 5, } err2 := c.controller.UpdateUserConfigs(ctx, badCfg) @@ -130,7 +130,7 @@ func (c *controllerTestSuite) TestUpdateUserCfg() { } /*func (c *controllerTestSuite) TestCheckUnmodifiable() { - conf := map[string]interface{}{ + conf := map[string]any{ "ldap_url": "ldaps.myexample,com", "ldap_base_dn": "dc=myexample,dc=com", "auth_mode": "ldap_auth", diff --git a/src/controller/event/handler/auditlog/auditlog.go b/src/controller/event/handler/auditlog/auditlog.go index 41ef86c6c2d..15c67d8f728 100644 --- a/src/controller/event/handler/auditlog/auditlog.go +++ b/src/controller/event/handler/auditlog/auditlog.go @@ -41,7 +41,7 @@ func (h *Handler) Name() string { } // Handle ... -func (h *Handler) Handle(ctx context.Context, value interface{}) error { +func (h *Handler) Handle(ctx context.Context, value any) error { var addAuditLog bool switch v := value.(type) { case *event.PushArtifactEvent, *event.DeleteArtifactEvent, diff --git a/src/controller/event/handler/internal/artifact.go b/src/controller/event/handler/internal/artifact.go index a9e380f2644..b8cab4a73a3 100644 --- a/src/controller/event/handler/internal/artifact.go +++ b/src/controller/event/handler/internal/artifact.go @@ -99,7 +99,7 @@ func (a *ArtifactEventHandler) Name() string { } // Handle ... -func (a *ArtifactEventHandler) Handle(ctx context.Context, value interface{}) error { +func (a *ArtifactEventHandler) Handle(ctx context.Context, value any) error { switch v := value.(type) { case *event.PullArtifactEvent: return a.onPull(ctx, v.ArtifactEvent) @@ -190,7 +190,7 @@ func (a *ArtifactEventHandler) syncFlushPullTime(ctx context.Context, artifactID if tagName != "" { tags, err := tag.Ctl.List(ctx, q.New( - map[string]interface{}{ + map[string]any{ "ArtifactID": artifactID, "Name": tagName, }), nil) diff --git a/src/controller/event/handler/internal/project.go b/src/controller/event/handler/internal/project.go index b6b7bf666b3..5b68e5750fc 100644 --- a/src/controller/event/handler/internal/project.go +++ b/src/controller/event/handler/internal/project.go @@ -53,7 +53,7 @@ func (a *ProjectEventHandler) onProjectDelete(ctx context.Context, event *event. } // Handle handle project event -func (a *ProjectEventHandler) Handle(ctx context.Context, value interface{}) error { +func (a *ProjectEventHandler) Handle(ctx context.Context, value any) error { switch v := value.(type) { case *event.DeleteProjectEvent: return a.onProjectDelete(ctx, v) diff --git a/src/controller/event/handler/p2p/preheat.go b/src/controller/event/handler/p2p/preheat.go index d2e1297ab47..bc1e870b320 100644 --- a/src/controller/event/handler/p2p/preheat.go +++ b/src/controller/event/handler/p2p/preheat.go @@ -36,7 +36,7 @@ func (p *Handler) Name() string { } // Handle ... -func (p *Handler) Handle(ctx context.Context, value interface{}) error { +func (p *Handler) Handle(ctx context.Context, value any) error { switch v := value.(type) { case *event.PushArtifactEvent: return p.handlePushArtifact(ctx, v) diff --git a/src/controller/event/handler/p2p/preheat_test.go b/src/controller/event/handler/p2p/preheat_test.go index 350cf478523..5d1c8282126 100644 --- a/src/controller/event/handler/p2p/preheat_test.go +++ b/src/controller/event/handler/p2p/preheat_test.go @@ -82,7 +82,7 @@ func (suite *PreheatTestSuite) TestName() { // TestHandle ... func (suite *PreheatTestSuite) TestHandle() { type args struct { - data interface{} + data any } tests := []struct { name string diff --git a/src/controller/event/handler/replication/replication.go b/src/controller/event/handler/replication/replication.go index cd09c705858..999fc1b955f 100644 --- a/src/controller/event/handler/replication/replication.go +++ b/src/controller/event/handler/replication/replication.go @@ -36,7 +36,7 @@ func (r *Handler) Name() string { } // Handle ... -func (r *Handler) Handle(ctx context.Context, value interface{}) error { +func (r *Handler) Handle(ctx context.Context, value any) error { pushArtEvent, ok := value.(*event.PushArtifactEvent) if ok { return r.handlePushArtifact(ctx, pushArtEvent) @@ -78,7 +78,7 @@ func (r *Handler) handlePushArtifact(ctx context.Context, event *event.PushArtif Metadata: &model.ResourceMetadata{ Repository: &model.Repository{ Name: event.Repository, - Metadata: map[string]interface{}{ + Metadata: map[string]any{ "public": strconv.FormatBool(public), }, }, @@ -138,7 +138,7 @@ func (r *Handler) handleCreateTag(ctx context.Context, event *event.CreateTagEve Metadata: &model.ResourceMetadata{ Repository: &model.Repository{ Name: event.Repository, - Metadata: map[string]interface{}{ + Metadata: map[string]any{ "public": strconv.FormatBool(public), }, }, diff --git a/src/controller/event/handler/util/util_test.go b/src/controller/event/handler/util/util_test.go index 21b89de52b2..27a9ae35ec1 100644 --- a/src/controller/event/handler/util/util_test.go +++ b/src/controller/event/handler/util/util_test.go @@ -17,7 +17,7 @@ func TestMain(m *testing.M) { } func TestBuildImageResourceURL(t *testing.T) { - cfg := map[string]interface{}{ + cfg := map[string]any{ common.ExtEndpoint: "https://demo.goharbor.io", } config.InitWithSettings(cfg) diff --git a/src/controller/event/handler/webhook/artifact/artifact.go b/src/controller/event/handler/webhook/artifact/artifact.go index 89bd831310b..3efff62fa92 100644 --- a/src/controller/event/handler/webhook/artifact/artifact.go +++ b/src/controller/event/handler/webhook/artifact/artifact.go @@ -39,7 +39,7 @@ func (a *Handler) Name() string { } // Handle preprocess artifact event data and then publish hook event -func (a *Handler) Handle(ctx context.Context, value interface{}) error { +func (a *Handler) Handle(ctx context.Context, value any) error { if !config.NotificationEnable(ctx) { log.Debug("notification feature is not enabled") return nil diff --git a/src/controller/event/handler/webhook/artifact/replication.go b/src/controller/event/handler/webhook/artifact/replication.go index 03a43e21d30..bc6f3fec2d4 100644 --- a/src/controller/event/handler/webhook/artifact/replication.go +++ b/src/controller/event/handler/webhook/artifact/replication.go @@ -45,7 +45,7 @@ func (r *ReplicationHandler) Name() string { } // Handle ... -func (r *ReplicationHandler) Handle(ctx context.Context, value interface{}) error { +func (r *ReplicationHandler) Handle(ctx context.Context, value any) error { if !config.NotificationEnable(ctx) { log.Debug("notification feature is not enabled") return nil diff --git a/src/controller/event/handler/webhook/artifact/replication_test.go b/src/controller/event/handler/webhook/artifact/replication_test.go index 8a8d1bca22a..a1dac0b85b1 100644 --- a/src/controller/event/handler/webhook/artifact/replication_test.go +++ b/src/controller/event/handler/webhook/artifact/replication_test.go @@ -73,7 +73,7 @@ func TestReplicationHandler_Handle(t *testing.T) { handler := &ReplicationHandler{} type args struct { - data interface{} + data any } tests := []struct { name string diff --git a/src/controller/event/handler/webhook/artifact/retention.go b/src/controller/event/handler/webhook/artifact/retention.go index b89708a6687..f75f6ac89eb 100644 --- a/src/controller/event/handler/webhook/artifact/retention.go +++ b/src/controller/event/handler/webhook/artifact/retention.go @@ -40,7 +40,7 @@ func (r *RetentionHandler) Name() string { } // Handle ... -func (r *RetentionHandler) Handle(ctx context.Context, value interface{}) error { +func (r *RetentionHandler) Handle(ctx context.Context, value any) error { if !config.NotificationEnable(ctx) { log.Debug("notification feature is not enabled") return nil diff --git a/src/controller/event/handler/webhook/artifact/retention_test.go b/src/controller/event/handler/webhook/artifact/retention_test.go index 84770ad0fbf..e5520e6f03c 100644 --- a/src/controller/event/handler/webhook/artifact/retention_test.go +++ b/src/controller/event/handler/webhook/artifact/retention_test.go @@ -61,7 +61,7 @@ func TestRetentionHandler_Handle(t *testing.T) { }, nil) type args struct { - data interface{} + data any } tests := []struct { name string diff --git a/src/controller/event/handler/webhook/quota/quota.go b/src/controller/event/handler/webhook/quota/quota.go index d4943e5bb74..efe51fa456b 100644 --- a/src/controller/event/handler/webhook/quota/quota.go +++ b/src/controller/event/handler/webhook/quota/quota.go @@ -38,7 +38,7 @@ func (qp *Handler) Name() string { } // Handle ... -func (qp *Handler) Handle(ctx context.Context, value interface{}) error { +func (qp *Handler) Handle(ctx context.Context, value any) error { quotaEvent, ok := value.(*event.QuotaEvent) if !ok { return errors.New("invalid quota event type") diff --git a/src/controller/event/handler/webhook/quota/quota_test.go b/src/controller/event/handler/webhook/quota/quota_test.go index e5d1783a657..8013dda5852 100644 --- a/src/controller/event/handler/webhook/quota/quota_test.go +++ b/src/controller/event/handler/webhook/quota/quota_test.go @@ -53,7 +53,7 @@ func TestQuotaPreprocessHandler(t *testing.T) { // SetupSuite prepares env for test suite. func (suite *QuotaPreprocessHandlerSuite) SetupSuite() { common_dao.PrepareTestForPostgresSQL() - cfg := map[string]interface{}{ + cfg := map[string]any{ common.NotificationEnable: true, } config.InitWithSettings(cfg) @@ -110,7 +110,7 @@ func (m *MockHandler) Name() string { } // Handle ... -func (m *MockHandler) Handle(ctx context.Context, value interface{}) error { +func (m *MockHandler) Handle(ctx context.Context, value any) error { return nil } diff --git a/src/controller/event/handler/webhook/scan/scan.go b/src/controller/event/handler/webhook/scan/scan.go index 9c7df3fd912..2057aa04d50 100644 --- a/src/controller/event/handler/webhook/scan/scan.go +++ b/src/controller/event/handler/webhook/scan/scan.go @@ -42,7 +42,7 @@ func (si *Handler) Name() string { } // Handle preprocess chart event data and then publish hook event -func (si *Handler) Handle(ctx context.Context, value interface{}) error { +func (si *Handler) Handle(ctx context.Context, value any) error { if value == nil { return errors.New("empty scan artifact event") } @@ -142,7 +142,7 @@ func constructScanImagePayload(ctx context.Context, event *event.ScanImageEvent, time.Sleep(500 * time.Millisecond) } - scanSummaries := map[string]interface{}{} + scanSummaries := map[string]any{} if event.ScanType == v1.ScanTypeVulnerability { scanSummaries, err = scan.DefaultController.GetSummary(ctx, art, event.ScanType, []string{v1.MimeTypeNativeReport, v1.MimeTypeGenericVulnerabilityReport}) if err != nil { @@ -150,7 +150,7 @@ func constructScanImagePayload(ctx context.Context, event *event.ScanImageEvent, } } - sbomOverview := map[string]interface{}{} + sbomOverview := map[string]any{} if event.ScanType == v1.ScanTypeSbom { sbomOverview, err = scan.DefaultController.GetSummary(ctx, art, event.ScanType, []string{v1.MimeTypeSBOMReport}) if err != nil { diff --git a/src/controller/event/handler/webhook/scan/scan_test.go b/src/controller/event/handler/webhook/scan/scan_test.go index 6a5498a5a3e..d6d4cddca2e 100644 --- a/src/controller/event/handler/webhook/scan/scan_test.go +++ b/src/controller/event/handler/webhook/scan/scan_test.go @@ -63,7 +63,7 @@ func TestScanImagePreprocessHandler(t *testing.T) { // SetupSuite prepares env for test suite. func (suite *ScanImagePreprocessHandlerSuite) SetupSuite() { common_dao.PrepareTestForPostgresSQL() - cfg := map[string]interface{}{ + cfg := map[string]any{ common.NotificationEnable: true, } config.InitWithSettings(cfg) @@ -92,7 +92,7 @@ func (suite *ScanImagePreprocessHandlerSuite) SetupSuite() { mc := &scantesting.Controller{} var options []report.Option - s := make(map[string]interface{}) + s := make(map[string]any) mc.On("GetSummary", a, []string{v1.MimeTypeNativeReport}, options).Return(s, nil) mock.OnAnything(mc, "GetSummary").Return(s, nil) mock.OnAnything(mc, "GetReport").Return(reports, nil) @@ -153,7 +153,7 @@ func (m *MockHTTPHandler) Name() string { } // Handle ... -func (m *MockHTTPHandler) Handle(ctx context.Context, value interface{}) error { +func (m *MockHTTPHandler) Handle(ctx context.Context, value any) error { return nil } diff --git a/src/controller/event/metadata/robot_test.go b/src/controller/event/metadata/robot_test.go index b7a2be3d770..02cafb64c5d 100644 --- a/src/controller/event/metadata/robot_test.go +++ b/src/controller/event/metadata/robot_test.go @@ -33,7 +33,7 @@ type robotEventTestSuite struct { } func (t *tagEventTestSuite) TestResolveOfCreateRobotEventMetadata() { - cfg := map[string]interface{}{ + cfg := map[string]any{ common.RobotPrefix: "robot$", } config.InitWithSettings(cfg) @@ -57,7 +57,7 @@ func (t *tagEventTestSuite) TestResolveOfCreateRobotEventMetadata() { } func (t *tagEventTestSuite) TestResolveOfDeleteRobotEventMetadata() { - cfg := map[string]interface{}{ + cfg := map[string]any{ common.RobotPrefix: "robot$", } config.InitWithSettings(cfg) diff --git a/src/controller/gc/controller.go b/src/controller/gc/controller.go index 5de9be5e5fb..0e715a0d291 100644 --- a/src/controller/gc/controller.go +++ b/src/controller/gc/controller.go @@ -75,7 +75,7 @@ type controller struct { // Start starts the manual GC func (c *controller) Start(ctx context.Context, policy Policy, trigger string) (int64, error) { - para := make(map[string]interface{}) + para := make(map[string]any) para["delete_untagged"] = policy.DeleteUntagged para["dry_run"] = policy.DryRun para["workers"] = policy.Workers @@ -129,7 +129,7 @@ func (c *controller) ListExecutions(ctx context.Context, query *q.Query) ([]*Exe // GetExecution ... func (c *controller) GetExecution(ctx context.Context, id int64) (*Execution, error) { execs, err := c.exeMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.GarbageCollectionVendorType, }, @@ -147,7 +147,7 @@ func (c *controller) GetExecution(ctx context.Context, id int64) (*Execution, er // GetTask ... func (c *controller) GetTask(ctx context.Context, id int64) (*Task, error) { tasks, err := c.taskMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.GarbageCollectionVendorType, }, @@ -203,7 +203,7 @@ func (c *controller) GetSchedule(ctx context.Context) (*scheduler.Schedule, erro // CreateSchedule ... func (c *controller) CreateSchedule(ctx context.Context, cronType, cron string, policy Policy) (int64, error) { - extras := make(map[string]interface{}) + extras := make(map[string]any) extras["delete_untagged"] = policy.DeleteUntagged extras["workers"] = policy.Workers return c.schedulerMgr.Schedule(ctx, job.GarbageCollectionVendorType, -1, cronType, cron, job.GarbageCollectionVendorType, policy, extras) diff --git a/src/controller/gc/controller_test.go b/src/controller/gc/controller_test.go index 857f4ecff74..a7f1611d2ca 100644 --- a/src/controller/gc/controller_test.go +++ b/src/controller/gc/controller_test.go @@ -38,7 +38,7 @@ func (g *gcCtrTestSuite) TestStart() { g.taskMgr.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(int64(1), nil) g.taskMgr.On("Stop", mock.Anything, mock.Anything).Return(nil) - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) p := Policy{ DeleteUntagged: true, ExtraAttrs: dataMap, @@ -146,7 +146,7 @@ func (g *gcCtrTestSuite) TestCreateSchedule() { g.scheduler.On("Schedule", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(int64(1), nil) - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) p := Policy{ DeleteUntagged: true, ExtraAttrs: dataMap, diff --git a/src/controller/gc/model.go b/src/controller/gc/model.go index f94dcd5aa95..9425958cb07 100644 --- a/src/controller/gc/model.go +++ b/src/controller/gc/model.go @@ -20,11 +20,11 @@ import ( // Policy ... type Policy struct { - Trigger *Trigger `json:"trigger"` - DeleteUntagged bool `json:"deleteuntagged"` - DryRun bool `json:"dryrun"` - Workers int `json:"workers"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` + Trigger *Trigger `json:"trigger"` + DeleteUntagged bool `json:"deleteuntagged"` + DryRun bool `json:"dryrun"` + Workers int `json:"workers"` + ExtraAttrs map[string]any `json:"extra_attrs"` } // TriggerType represents the type of trigger. @@ -47,7 +47,7 @@ type Execution struct { Status string StatusMessage string Trigger string - ExtraAttrs map[string]interface{} + ExtraAttrs map[string]any StartTime time.Time UpdateTime time.Time } diff --git a/src/controller/icon/controller.go b/src/controller/icon/controller.go index 3bab2641f13..f250ea781d4 100644 --- a/src/controller/icon/controller.go +++ b/src/controller/icon/controller.go @@ -138,7 +138,7 @@ func (c *controller) Get(ctx context.Context, digest string) (*Icon, error) { } else { // read icon from blob artifacts, err := c.artMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Icon": digest, }, }) diff --git a/src/controller/jobservice/model.go b/src/controller/jobservice/model.go index 3ef1b04c6d2..eb3b4a95739 100644 --- a/src/controller/jobservice/model.go +++ b/src/controller/jobservice/model.go @@ -22,7 +22,7 @@ type Execution struct { Status string StatusMessage string Trigger string - ExtraAttrs map[string]interface{} + ExtraAttrs map[string]any StartTime time.Time EndTime time.Time } diff --git a/src/controller/jobservice/schedule.go b/src/controller/jobservice/schedule.go index e0f9ea19c2f..e80b159e307 100644 --- a/src/controller/jobservice/schedule.go +++ b/src/controller/jobservice/schedule.go @@ -35,7 +35,7 @@ type SchedulerController interface { // Get the schedule Get(ctx context.Context, vendorType string) (*scheduler.Schedule, error) // Create with cron type & string - Create(ctx context.Context, vendorType, cronType, cron, callbackFuncName string, policy interface{}, extrasParam map[string]interface{}) (int64, error) + Create(ctx context.Context, vendorType, cronType, cron, callbackFuncName string, policy any, extrasParam map[string]any) (int64, error) // Delete the schedule Delete(ctx context.Context, vendorType string) error // List lists schedules @@ -76,7 +76,7 @@ func (s *schedulerController) Get(ctx context.Context, vendorType string) (*sche } func (s *schedulerController) Create(ctx context.Context, vendorType, cronType, cron, callbackFuncName string, - policy interface{}, extrasParam map[string]interface{}) (int64, error) { + policy any, extrasParam map[string]any) (int64, error) { return s.schedulerMgr.Schedule(ctx, vendorType, -1, cronType, cron, callbackFuncName, policy, extrasParam) } diff --git a/src/controller/jobservice/schedule_test.go b/src/controller/jobservice/schedule_test.go index 4572b5e6df9..3c7cf970064 100644 --- a/src/controller/jobservice/schedule_test.go +++ b/src/controller/jobservice/schedule_test.go @@ -49,7 +49,7 @@ func (s *ScheduleTestSuite) TestCreateSchedule() { s.scheduler.On("Schedule", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(int64(1), nil) - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) p := purge.JobPolicy{} id, err := s.ctl.Create(nil, job.PurgeAuditVendorType, "Daily", "* * * * * *", purge.SchedulerCallback, p, dataMap) s.Nil(err) @@ -76,7 +76,7 @@ func (s *ScheduleTestSuite) TestGetSchedule() { func (s *ScheduleTestSuite) TestListSchedule() { mock.OnAnything(s.scheduler, "ListSchedules").Return([]*scheduler.Schedule{ - {ID: 1, VendorType: "GARBAGE_COLLECTION", CRON: "0 0 0 * * *", ExtraAttrs: map[string]interface{}{"args": "sample args"}}}, nil).Once() + {ID: 1, VendorType: "GARBAGE_COLLECTION", CRON: "0 0 0 * * *", ExtraAttrs: map[string]any{"args": "sample args"}}}, nil).Once() schedules, err := s.scheduler.ListSchedules(nil, nil) s.Assert().Nil(err) s.Assert().Equal(1, len(schedules)) diff --git a/src/controller/ldap/controller_test.go b/src/controller/ldap/controller_test.go index bf82c3ed370..bb310980734 100644 --- a/src/controller/ldap/controller_test.go +++ b/src/controller/ldap/controller_test.go @@ -29,7 +29,7 @@ import ( "github.com/goharbor/harbor/src/testing/pkg/ldap" ) -var defaultConfigWithVerifyCert = map[string]interface{}{ +var defaultConfigWithVerifyCert = map[string]any{ common.ExtEndpoint: "https://host01.com", common.AUTHMode: common.LDAPAuth, common.DatabaseType: "postgresql", diff --git a/src/controller/member/controller.go b/src/controller/member/controller.go index 0ad32164e5a..bf632100938 100644 --- a/src/controller/member/controller.go +++ b/src/controller/member/controller.go @@ -34,17 +34,17 @@ import ( // Controller defines the operation related to project member type Controller interface { // Get gets the project member with ID - Get(ctx context.Context, projectNameOrID interface{}, memberID int) (*models.Member, error) + Get(ctx context.Context, projectNameOrID any, memberID int) (*models.Member, error) // Create add project member to project - Create(ctx context.Context, projectNameOrID interface{}, req Request) (int, error) + Create(ctx context.Context, projectNameOrID any, req Request) (int, error) // Delete member from project - Delete(ctx context.Context, projectNameOrID interface{}, memberID int) error + Delete(ctx context.Context, projectNameOrID any, memberID int) error // List lists all project members with condition - List(ctx context.Context, projectNameOrID interface{}, entityName string, query *q.Query) ([]*models.Member, error) + List(ctx context.Context, projectNameOrID any, entityName string, query *q.Query) ([]*models.Member, error) // UpdateRole update the project member role - UpdateRole(ctx context.Context, projectNameOrID interface{}, memberID int, role int) error + UpdateRole(ctx context.Context, projectNameOrID any, memberID int, role int) error // Count get the total amount of project members - Count(ctx context.Context, projectNameOrID interface{}, query *q.Query) (int, error) + Count(ctx context.Context, projectNameOrID any, query *q.Query) (int, error) // IsProjectAdmin judges if the user is a project admin of any project IsProjectAdmin(ctx context.Context, member commonmodels.User) (bool, error) } @@ -89,7 +89,7 @@ func NewController() Controller { return &controller{mgr: member.Mgr, projectMgr: pkg.ProjectMgr, userManager: user.New(), groupManager: usergroup.Mgr} } -func (c *controller) Count(ctx context.Context, projectNameOrID interface{}, query *q.Query) (int, error) { +func (c *controller) Count(ctx context.Context, projectNameOrID any, query *q.Query) (int, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return 0, err @@ -97,7 +97,7 @@ func (c *controller) Count(ctx context.Context, projectNameOrID interface{}, que return c.mgr.GetTotalOfProjectMembers(ctx, p.ProjectID, query) } -func (c *controller) UpdateRole(ctx context.Context, projectNameOrID interface{}, memberID int, role int) error { +func (c *controller) UpdateRole(ctx context.Context, projectNameOrID any, memberID int, role int) error { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return err @@ -108,7 +108,7 @@ func (c *controller) UpdateRole(ctx context.Context, projectNameOrID interface{} return c.mgr.UpdateRole(ctx, p.ProjectID, memberID, role) } -func (c *controller) Get(ctx context.Context, projectNameOrID interface{}, memberID int) (*models.Member, error) { +func (c *controller) Get(ctx context.Context, projectNameOrID any, memberID int) (*models.Member, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return nil, err @@ -119,7 +119,7 @@ func (c *controller) Get(ctx context.Context, projectNameOrID interface{}, membe return c.mgr.Get(ctx, p.ProjectID, memberID) } -func (c *controller) Create(ctx context.Context, projectNameOrID interface{}, req Request) (int, error) { +func (c *controller) Create(ctx context.Context, projectNameOrID any, req Request) (int, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return 0, err @@ -239,7 +239,7 @@ func isValidRole(role int) bool { } } -func (c *controller) List(ctx context.Context, projectNameOrID interface{}, entityName string, query *q.Query) ([]*models.Member, error) { +func (c *controller) List(ctx context.Context, projectNameOrID any, entityName string, query *q.Query) ([]*models.Member, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return nil, err @@ -254,7 +254,7 @@ func (c *controller) List(ctx context.Context, projectNameOrID interface{}, enti return c.mgr.List(ctx, pm, query) } -func (c *controller) Delete(ctx context.Context, projectNameOrID interface{}, memberID int) error { +func (c *controller) Delete(ctx context.Context, projectNameOrID any, memberID int) error { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return err diff --git a/src/controller/p2p/preheat/controller.go b/src/controller/p2p/preheat/controller.go index 65f80ebf161..9eb3b61eabd 100644 --- a/src/controller/p2p/preheat/controller.go +++ b/src/controller/p2p/preheat/controller.go @@ -180,7 +180,7 @@ func (c *controller) CreateInstance(ctx context.Context, instance *providerModel // Avoid duplicated endpoint var query = &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "endpoint": instance.Endpoint, }, } @@ -208,7 +208,7 @@ func (c *controller) DeleteInstance(ctx context.Context, id int64) error { } // delete instance should check the instance whether be used by policies policies, err := c.ListPolicies(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "provider_id": id, }, }) @@ -235,7 +235,7 @@ func (c *controller) UpdateInstance(ctx context.Context, instance *providerModel if !instance.Enabled { // update instance should check the instance whether be used by policies policies, err := c.ListPolicies(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "provider_id": instance.ID, }, }) @@ -311,7 +311,7 @@ func (c *controller) CreatePolicy(ctx context.Context, schema *policyModels.Sche schema.Trigger.Type == policyModels.TriggerTypeScheduled && len(schema.Trigger.Settings.Cron) > 0 { // schedule and update policy - extras := make(map[string]interface{}) + extras := make(map[string]any) if _, err = c.scheduler.Schedule(ctx, job.P2PPreheatVendorType, id, "", schema.Trigger.Settings.Cron, SchedulerCallback, TriggerParam{PolicyID: id}, extras); err != nil { return 0, err @@ -409,7 +409,7 @@ func (c *controller) UpdatePolicy(ctx context.Context, schema *policyModels.Sche // schedule new if needSch { - extras := make(map[string]interface{}) + extras := make(map[string]any) if _, err := c.scheduler.Schedule(ctx, job.P2PPreheatVendorType, schema.ID, "", cron, SchedulerCallback, TriggerParam{PolicyID: schema.ID}, extras); err != nil { return err @@ -465,7 +465,7 @@ func (c *controller) DeletePoliciesOfProject(ctx context.Context, project int64) // deleteExecs delete executions func (c *controller) deleteExecs(ctx context.Context, vendorID int64) error { executions, err := c.executionMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.P2PPreheatVendorType, "VendorID": vendorID, }, diff --git a/src/controller/p2p/preheat/controllor_test.go b/src/controller/p2p/preheat/controllor_test.go index c57802dd980..51deed2f106 100644 --- a/src/controller/p2p/preheat/controllor_test.go +++ b/src/controller/p2p/preheat/controllor_test.go @@ -82,7 +82,7 @@ func (s *preheatSuite) SetupSuite() { }, }, nil) s.fakeInstanceMgr.On("Save", mock.Anything, mock.Anything).Return(int64(1), nil) - s.fakeInstanceMgr.On("Count", mock.Anything, &q.Query{Keywords: map[string]interface{}{ + s.fakeInstanceMgr.On("Count", mock.Anything, &q.Query{Keywords: map[string]any{ "endpoint": "http://localhost", }}).Return(int64(1), nil) s.fakeInstanceMgr.On("Count", mock.Anything, mock.Anything).Return(int64(0), nil) @@ -117,7 +117,7 @@ func (s *preheatSuite) TearDownSuite() { func (s *preheatSuite) TestGetAvailableProviders() { providers, err := s.controller.GetAvailableProviders() s.Equal(2, len(providers)) - expectProviders := map[string]interface{}{} + expectProviders := map[string]any{} expectProviders["dragonfly"] = nil expectProviders["kraken"] = nil _, ok := expectProviders[providers[0].ID] @@ -177,7 +177,7 @@ func (s *preheatSuite) TestCreateInstance() { func (s *preheatSuite) TestDeleteInstance() { // instance be used should not be deleted s.fakeInstanceMgr.On("Get", s.ctx, int64(1)).Return(&providerModel.Instance{ID: 1}, nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1)}}).Return([]*policy.Schema{ + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1)}}).Return([]*policy.Schema{ { ProviderID: 1, }, @@ -186,7 +186,7 @@ func (s *preheatSuite) TestDeleteInstance() { s.Error(err, "instance should not be deleted") s.fakeInstanceMgr.On("Get", s.ctx, int64(2)).Return(&providerModel.Instance{ID: 2}, nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(2)}}).Return([]*policy.Schema{}, nil) + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(2)}}).Return([]*policy.Schema{}, nil) s.fakeInstanceMgr.On("Delete", s.ctx, int64(2)).Return(nil) err = s.controller.DeleteInstance(s.ctx, int64(2)) s.NoError(err, "instance can be deleted") @@ -202,7 +202,7 @@ func (s *preheatSuite) TestUpdateInstance() { // disable instance should error due to with policy used s.fakeInstanceMgr.On("Get", s.ctx, int64(1001)).Return(&providerModel.Instance{ID: 1001}, nil) s.fakeInstanceMgr.On("Update", s.ctx, &providerModel.Instance{ID: 1001}).Return(nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1001)}}).Return([]*policy.Schema{ + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1001)}}).Return([]*policy.Schema{ {ProviderID: 1001}, }, nil) err = s.controller.UpdateInstance(s.ctx, &providerModel.Instance{ID: 1001}) @@ -211,14 +211,14 @@ func (s *preheatSuite) TestUpdateInstance() { // disable instance can be deleted if no policy used s.fakeInstanceMgr.On("Get", s.ctx, int64(1002)).Return(&providerModel.Instance{ID: 1002}, nil) s.fakeInstanceMgr.On("Update", s.ctx, &providerModel.Instance{ID: 1002}).Return(nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1002)}}).Return([]*policy.Schema{}, nil) + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1002)}}).Return([]*policy.Schema{}, nil) err = s.controller.UpdateInstance(s.ctx, &providerModel.Instance{ID: 1002}) s.NoError(err, "instance can be disabled") // not support change vendor type s.fakeInstanceMgr.On("Get", s.ctx, int64(1003)).Return(&providerModel.Instance{ID: 1003, Vendor: "dragonfly"}, nil) s.fakeInstanceMgr.On("Update", s.ctx, &providerModel.Instance{ID: 1003, Vendor: "kraken"}).Return(nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1003)}}).Return([]*policy.Schema{}, nil) + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1003)}}).Return([]*policy.Schema{}, nil) err = s.controller.UpdateInstance(s.ctx, &providerModel.Instance{ID: 1003, Vendor: "kraken"}) s.Error(err, "provider vendor cannot be changed") } @@ -347,7 +347,7 @@ func (s *preheatSuite) TestDeletePoliciesOfProject() { for _, p := range fakePolicies { s.fakePolicyMgr.On("Get", s.ctx, p.ID).Return(p, nil) s.fakePolicyMgr.On("Delete", s.ctx, p.ID).Return(nil) - s.fakeExecutionMgr.On("List", s.ctx, &q.Query{Keywords: map[string]interface{}{"VendorID": p.ID, "VendorType": "P2P_PREHEAT"}}).Return([]*taskModel.Execution{}, nil) + s.fakeExecutionMgr.On("List", s.ctx, &q.Query{Keywords: map[string]any{"VendorID": p.ID, "VendorType": "P2P_PREHEAT"}}).Return([]*taskModel.Execution{}, nil) } err := s.controller.DeletePoliciesOfProject(s.ctx, 10) diff --git a/src/controller/p2p/preheat/enforcer.go b/src/controller/p2p/preheat/enforcer.go index c36739cf705..12bf3300c71 100644 --- a/src/controller/p2p/preheat/enforcer.go +++ b/src/controller/p2p/preheat/enforcer.go @@ -351,7 +351,7 @@ func (de *defaultEnforcer) getCandidates(ctx context.Context, ps *pol.Schema, p // Here we have a hidden filter, the artifact type filter. // Only get the image type at this moment. arts, err := de.artCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": ps.ProjectID, "Type": q.NewOrList(supportedTypes), }, @@ -371,7 +371,7 @@ func (de *defaultEnforcer) getCandidates(ctx context.Context, ps *pol.Schema, p // launchExecutions create execution record and launch tasks to preheat the filtered artifacts. func (de *defaultEnforcer) launchExecutions(ctx context.Context, candidates []*selector.Candidate, pl *pol.Schema, inst *provider.Instance) (int64, error) { // Create execution first anyway - attrs := map[string]interface{}{ + attrs := map[string]any{ extraAttrTotal: len(candidates), extraAttrTrigger: pl.Trigger.Type, extraAttrTriggerSetting: pl.Trigger.Settings.Cron, @@ -427,7 +427,7 @@ func (de *defaultEnforcer) launchExecutions(ctx context.Context, candidates []*s } // startTask starts the preheat task(job) for the given candidate -func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, candidate *selector.Candidate, instance string, extraAttrs map[string]interface{}) (int64, error) { +func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, candidate *selector.Candidate, instance string, extraAttrs map[string]any) (int64, error) { u, err := de.fullURLGetter(candidate) if err != nil { return -1, err @@ -441,7 +441,7 @@ func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, can pi := &pr.PreheatImage{ Type: candidate.Kind, URL: u, - Headers: map[string]interface{}{ + Headers: map[string]any{ accessCredHeaderKey: cred, }, ImageName: fmt.Sprintf("%s/%s", candidate.Namespace, candidate.Repository), @@ -467,7 +467,7 @@ func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, can }, } - tid, err := de.taskMgr.Create(ctx, executionID, j, map[string]interface{}{ + tid, err := de.taskMgr.Create(ctx, executionID, j, map[string]any{ extraAttrArtifact: fmt.Sprintf("%s:%s", pi.ImageName, pi.Tag), extraAttrDigest: candidate.Digest, extraAttrKind: pi.Type, @@ -596,12 +596,12 @@ func checkProviderHealthy(inst *provider.Instance) error { // Check the project security settings and override the related settings in the policy if necessary. // NOTES: if the security settings (relevant with signature and vulnerability) are set at the project configuration, // the corresponding filters of P2P preheat policy will be set using the relevant settings of project configurations. -func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]interface{} { +func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]any { if p == nil || pro == nil { return nil } - override := make([][]interface{}, 0) + override := make([][]any, 0) filters := make([]*pol.Filter, 0) for _, fl := range p.Filters { if fl.Type != pol.FilterTypeSignature && fl.Type != pol.FilterTypeVulnerability { @@ -617,7 +617,7 @@ func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]interfa }) // Record this is a override case - r1 := []interface{}{pro.Name, p.Name, pol.FilterTypeSignature, fmt.Sprintf("%v", true)} + r1 := []any{pro.Name, p.Name, pol.FilterTypeSignature, fmt.Sprintf("%v", true)} override = append(override, r1) } // Append vulnerability filter if vulnerability severity config is set at project configurations @@ -632,7 +632,7 @@ func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]interfa }) // Record this is a override case - r2 := []interface{}{pro.Name, p.Name, pol.FilterTypeVulnerability, fmt.Sprintf("%v:%d", se, code)} + r2 := []any{pro.Name, p.Name, pol.FilterTypeVulnerability, fmt.Sprintf("%v:%d", se, code)} override = append(override, r2) } } diff --git a/src/controller/project/controller.go b/src/controller/project/controller.go index f068cb71a37..55ad72337e8 100644 --- a/src/controller/project/controller.go +++ b/src/controller/project/controller.go @@ -53,9 +53,9 @@ type Controller interface { // Delete delete the project by project id Delete(ctx context.Context, id int64) error // Exists returns true when the specific project exists - Exists(ctx context.Context, projectIDOrName interface{}) (bool, error) + Exists(ctx context.Context, projectIDOrName any) (bool, error) // Get get the project by project id or name - Get(ctx context.Context, projectIDOrName interface{}, options ...Option) (*models.Project, error) + Get(ctx context.Context, projectIDOrName any, options ...Option) (*models.Project, error) // GetByName get the project by project name GetByName(ctx context.Context, projectName string, options ...Option) (*models.Project, error) // List list projects @@ -144,7 +144,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { return nil } -func (c *controller) Exists(ctx context.Context, projectIDOrName interface{}) (bool, error) { +func (c *controller) Exists(ctx context.Context, projectIDOrName any) (bool, error) { _, err := c.projectMgr.Get(ctx, projectIDOrName) if err == nil { return true, nil @@ -155,7 +155,7 @@ func (c *controller) Exists(ctx context.Context, projectIDOrName interface{}) (b return false, err } -func (c *controller) Get(ctx context.Context, projectIDOrName interface{}, options ...Option) (*models.Project, error) { +func (c *controller) Get(ctx context.Context, projectIDOrName any, options ...Option) (*models.Project, error) { p, err := c.projectMgr.Get(ctx, projectIDOrName) if err != nil { return nil, err diff --git a/src/controller/proxy/inflight.go b/src/controller/proxy/inflight.go index c28857c184f..3ed91e54ee5 100644 --- a/src/controller/proxy/inflight.go +++ b/src/controller/proxy/inflight.go @@ -18,11 +18,11 @@ import "sync" type inflightRequest struct { mu sync.Mutex - reqMap map[string]interface{} + reqMap map[string]any } var inflightChecker = &inflightRequest{ - reqMap: make(map[string]interface{}), + reqMap: make(map[string]any), } // addRequest if the artifact already exist in the inflightRequest, return false diff --git a/src/controller/purge/controller.go b/src/controller/purge/controller.go index b09fca0f750..d2504a14811 100644 --- a/src/controller/purge/controller.go +++ b/src/controller/purge/controller.go @@ -68,7 +68,7 @@ func (c *controller) Stop(ctx context.Context, id int64) error { } func (c *controller) Start(ctx context.Context, policy JobPolicy, trigger string) (int64, error) { - para := make(map[string]interface{}) + para := make(map[string]any) para[common.PurgeAuditDryRun] = policy.DryRun para[common.PurgeAuditRetentionHour] = policy.RetentionHour diff --git a/src/controller/purge/model.go b/src/controller/purge/model.go index 9a2b21ba1d5..b6e2090662a 100644 --- a/src/controller/purge/model.go +++ b/src/controller/purge/model.go @@ -22,11 +22,11 @@ import ( // JobPolicy defines the purge job policy type JobPolicy struct { - Trigger *Trigger `json:"trigger"` - DryRun bool `json:"dryrun"` - RetentionHour int `json:"retention_hour"` - IncludeEventTypes string `json:"include_event_types"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` + Trigger *Trigger `json:"trigger"` + DryRun bool `json:"dryrun"` + RetentionHour int `json:"retention_hour"` + IncludeEventTypes string `json:"include_event_types"` + ExtraAttrs map[string]any `json:"extra_attrs"` } // TriggerType represents the type of trigger. @@ -44,7 +44,7 @@ type TriggerSettings struct { } // String convert map to json string -func String(extras map[string]interface{}) string { +func String(extras map[string]any) string { result, err := json.Marshal(extras) if err != nil { log.Errorf("failed to convert to json string, value %+v", extras) diff --git a/src/controller/purge/model_test.go b/src/controller/purge/model_test.go index 2b48a4b683e..65d7bae0f3f 100644 --- a/src/controller/purge/model_test.go +++ b/src/controller/purge/model_test.go @@ -18,15 +18,15 @@ import "testing" func TestString(t *testing.T) { type args struct { - extras map[string]interface{} + extras map[string]any } tests := []struct { name string args args want string }{ - {"normal", args{map[string]interface{}{"dry_run": true, "audit_log_retention_hour": 168}}, "{\"audit_log_retention_hour\":168,\"dry_run\":true}"}, - {"empty", args{map[string]interface{}{}}, "{}"}, + {"normal", args{map[string]any{"dry_run": true, "audit_log_retention_hour": 168}}, "{\"audit_log_retention_hour\":168,\"dry_run\":true}"}, + {"empty", args{map[string]any{}}, "{}"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/controller/quota/controller.go b/src/controller/quota/controller.go index e3ffc92f416..e023c74d60c 100644 --- a/src/controller/quota/controller.go +++ b/src/controller/quota/controller.go @@ -280,7 +280,7 @@ func (c *controller) updateUsageByRedis(ctx context.Context, reference, referenc // calc the quota usage in real time if no key found if err == redis.Nil { // use singleflight to prevent cache penetration and cause pressure on the database. - realQuota, err, _ := c.g.Do(key, func() (interface{}, error) { + realQuota, err, _ := c.g.Do(key, func() (any, error) { return c.calcQuota(ctx, reference, referenceID) }) if err != nil { diff --git a/src/controller/quota/controller_test.go b/src/controller/quota/controller_test.go index 037d39bb6b0..3565228dd4b 100644 --- a/src/controller/quota/controller_test.go +++ b/src/controller/quota/controller_test.go @@ -56,7 +56,7 @@ func (suite *ControllerTestSuite) SetupTest() { suite.quota = "a.Quota{Hard: hardLimits.String(), Used: types.Zero(hardLimits).String()} } -func (suite *ControllerTestSuite) PrepareForUpdate(q *quota.Quota, newUsage interface{}) { +func (suite *ControllerTestSuite) PrepareForUpdate(q *quota.Quota, newUsage any) { mock.OnAnything(suite.quotaMgr, "GetByRef").Return(q, nil) mock.OnAnything(suite.driver, "CalculateUsage").Return(newUsage, nil) diff --git a/src/controller/quota/driver/project/util.go b/src/controller/quota/driver/project/util.go index 9efaa68f033..c678f814a84 100644 --- a/src/controller/quota/driver/project/util.go +++ b/src/controller/quota/driver/project/util.go @@ -51,7 +51,7 @@ func getProjectsBatchFn(ctx context.Context, keys dataloader.Keys) []*dataloader return handleError(err) } - var ownerIDs []interface{} + var ownerIDs []any var projectsMap = make(map[int64]*proModels.Project, len(projectIDs)) for _, project := range projects { ownerIDs = append(ownerIDs, project.OwnerID) diff --git a/src/controller/quota/util.go b/src/controller/quota/util.go index 22c16f79e05..f9bd45eb221 100644 --- a/src/controller/quota/util.go +++ b/src/controller/quota/util.go @@ -30,7 +30,7 @@ const ( ) // ReferenceID returns reference id for the interface -func ReferenceID(i interface{}) string { +func ReferenceID(i any) string { switch s := i.(type) { case string: return s diff --git a/src/controller/registry/controller.go b/src/controller/registry/controller.go index 9b40e27e535..1c5fecdc398 100644 --- a/src/controller/registry/controller.go +++ b/src/controller/registry/controller.go @@ -128,7 +128,7 @@ func (c *controller) Update(ctx context.Context, registry *model.Registry, props func (c *controller) Delete(ctx context.Context, id int64) error { // referenced by replication policy as source registry count, err := c.repMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "src_registry_id": id, }, }) @@ -140,7 +140,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { } // referenced by replication policy as destination registry count, err = c.repMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "dest_registry_id": id, }, }) @@ -152,7 +152,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { } // referenced by proxy cache project count, err = c.proMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "registry_id": id, }, }) diff --git a/src/controller/replication/execution.go b/src/controller/replication/execution.go index 3c92250946f..efc64216bc4 100644 --- a/src/controller/replication/execution.go +++ b/src/controller/replication/execution.go @@ -105,7 +105,7 @@ func (c *controller) Start(ctx context.Context, policy *replicationmodel.Policy, WithMessagef("the policy %d is disabled", policy.ID) } // create an execution record - extra := make(map[string]interface{}) + extra := make(map[string]any) if op := operator.FromContext(ctx); op != "" { extra["operator"] = op } @@ -203,7 +203,7 @@ func (c *controller) buildExecutionQuery(query *q.Query) *q.Query { func (c *controller) GetExecution(ctx context.Context, id int64) (*Execution, error) { execs, err := c.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.ReplicationVendorType, }, @@ -240,7 +240,7 @@ func (c *controller) ListTasks(ctx context.Context, query *q.Query) ([]*Task, er func (c *controller) GetTask(ctx context.Context, id int64) (*Task, error) { tasks, err := c.taskMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.ReplicationVendorType, }, diff --git a/src/controller/replication/execution_test.go b/src/controller/replication/execution_test.go index de4791f09ad..06b23fda322 100644 --- a/src/controller/replication/execution_test.go +++ b/src/controller/replication/execution_test.go @@ -194,7 +194,7 @@ func (r *replicationTestSuite) TestListTasks() { ID: 1, ExecutionID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "resource_type": "artifact", "source_resource": "library/hello-world", "destination_resource": "library/hello-world", @@ -222,7 +222,7 @@ func (r *replicationTestSuite) TestGetTask() { ID: 1, ExecutionID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "resource_type": "artifact", "source_resource": "library/hello-world", "destination_resource": "library/hello-world", diff --git a/src/controller/replication/flow/copy.go b/src/controller/replication/flow/copy.go index 7c6b823bb14..b3d7f006bf8 100644 --- a/src/controller/replication/flow/copy.go +++ b/src/controller/replication/flow/copy.go @@ -136,7 +136,7 @@ func (c *copyFlow) createTasks(ctx context.Context, srcResources, dstResources [ Metadata: &job.Metadata{ JobKind: job.KindGeneric, }, - Parameters: map[string]interface{}{ + Parameters: map[string]any{ "src_resource": string(src), "dst_resource": string(dest), "speed": speed, @@ -144,7 +144,7 @@ func (c *copyFlow) createTasks(ctx context.Context, srcResources, dstResources [ }, } - if _, err = c.taskMgr.Create(ctx, c.executionID, job, map[string]interface{}{ + if _, err = c.taskMgr.Create(ctx, c.executionID, job, map[string]any{ "operation": "copy", "resource_type": string(srcResource.Type), "source_resource": getResourceName(srcResource), diff --git a/src/controller/replication/flow/deletion.go b/src/controller/replication/flow/deletion.go index 21cd7129cbf..615fb542ae8 100644 --- a/src/controller/replication/flow/deletion.go +++ b/src/controller/replication/flow/deletion.go @@ -78,7 +78,7 @@ func (d *deletionFlow) createTasks(ctx context.Context, srcResources, dstResourc Metadata: &job.Metadata{ JobKind: job.KindGeneric, }, - Parameters: map[string]interface{}{ + Parameters: map[string]any{ "src_resource": string(src), "dst_resource": string(dest), }, @@ -89,7 +89,7 @@ func (d *deletionFlow) createTasks(ctx context.Context, srcResources, dstResourc operation = "tag deletion" } - if _, err = d.taskMgr.Create(ctx, d.executionID, job, map[string]interface{}{ + if _, err = d.taskMgr.Create(ctx, d.executionID, job, map[string]any{ "operation": operation, "resource_type": string(resource.Type), "source_resource": getResourceName(resource), diff --git a/src/controller/replication/model/model.go b/src/controller/replication/model/model.go index 63202d17973..09f94326b3c 100644 --- a/src/controller/replication/model/model.go +++ b/src/controller/replication/model/model.go @@ -214,11 +214,11 @@ func (p *Policy) To() (*replicationmodel.Policy, error) { } type filter struct { - Type string `json:"type"` - Value interface{} `json:"value"` - Decoration string `json:"decoration"` - Kind string `json:"kind"` - Pattern string `json:"pattern"` + Type string `json:"type"` + Value any `json:"value"` + Decoration string `json:"decoration"` + Kind string `json:"kind"` + Pattern string `json:"pattern"` } type trigger struct { @@ -290,7 +290,7 @@ func parseFilters(str string) ([]*model.Filter, error) { } if filter.Type == model.FilterTypeLabel { labels := []string{} - for _, label := range filter.Value.([]interface{}) { + for _, label := range filter.Value.([]any) { labels = append(labels, label.(string)) } filter.Value = labels diff --git a/src/controller/replication/policy.go b/src/controller/replication/policy.go index 9496589124e..71665737224 100644 --- a/src/controller/replication/policy.go +++ b/src/controller/replication/policy.go @@ -33,7 +33,7 @@ const callbackFuncName = "REPLICATION_CALLBACK" func init() { callbackFunc := func(ctx context.Context, param string) error { - params := make(map[string]interface{}) + params := make(map[string]any) if err := json.Unmarshal([]byte(param), ¶ms); err != nil { return err } @@ -133,13 +133,13 @@ func (c *controller) CreatePolicy(ctx context.Context, policy *model.Policy) (in } // create schedule if needed if policy.IsScheduledTrigger() { - cbParams := map[string]interface{}{ + cbParams := map[string]any{ "policy_id": id, // the operator of schedule job is harbor-jobservice "operator": secret.JobserviceUser, } if _, err = c.scheduler.Schedule(ctx, job.ReplicationVendorType, id, "", policy.Trigger.Settings.Cron, - callbackFuncName, cbParams, map[string]interface{}{}); err != nil { + callbackFuncName, cbParams, map[string]any{}); err != nil { return 0, err } } @@ -165,13 +165,13 @@ func (c *controller) UpdatePolicy(ctx context.Context, policy *model.Policy, pro } // create schedule if needed if policy.IsScheduledTrigger() { - cbParams := map[string]interface{}{ + cbParams := map[string]any{ "policy_id": policy.ID, // the operator of schedule job is harbor-jobservice "operator": secret.JobserviceUser, } if _, err := c.scheduler.Schedule(ctx, job.ReplicationVendorType, policy.ID, "", policy.Trigger.Settings.Cron, - callbackFuncName, cbParams, map[string]interface{}{}); err != nil { + callbackFuncName, cbParams, map[string]any{}); err != nil { return err } } diff --git a/src/controller/replication/transfer/transfer.go b/src/controller/replication/transfer/transfer.go index f279821623c..1ee756d5786 100644 --- a/src/controller/replication/transfer/transfer.go +++ b/src/controller/replication/transfer/transfer.go @@ -40,21 +40,21 @@ type Transfer interface { // Logger defines an interface for logging type Logger interface { // For debuging - Debug(v ...interface{}) + Debug(v ...any) // For debuging with format - Debugf(format string, v ...interface{}) + Debugf(format string, v ...any) // For logging info - Info(v ...interface{}) + Info(v ...any) // For logging info with format - Infof(format string, v ...interface{}) + Infof(format string, v ...any) // For warning - Warning(v ...interface{}) + Warning(v ...any) // For warning with format - Warningf(format string, v ...interface{}) + Warningf(format string, v ...any) // For logging error - Error(v ...interface{}) + Error(v ...any) // For logging error with format - Errorf(format string, v ...interface{}) + Errorf(format string, v ...any) } // StopFunc is a function used to check whether the transfer diff --git a/src/controller/repository/controller.go b/src/controller/repository/controller.go index 1ca0cf44170..91e292200fb 100644 --- a/src/controller/repository/controller.go +++ b/src/controller/repository/controller.go @@ -143,7 +143,7 @@ func (c *controller) GetByName(ctx context.Context, name string) (*model.RepoRec func (c *controller) Delete(ctx context.Context, id int64) error { candidates, err := c.artCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": id, }, }, nil) @@ -155,7 +155,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { candidates = nil for _, artifact := range artifacts { parents, err := c.artMgr.ListReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ChildID": artifact.ID, }, }) diff --git a/src/controller/retention/controller.go b/src/controller/retention/controller.go index dae3bbeeafc..8b3e55eab95 100644 --- a/src/controller/retention/controller.go +++ b/src/controller/retention/controller.go @@ -116,7 +116,7 @@ func (r *defaultController) CreateRetention(ctx context.Context, p *policy.Metad if p.Trigger.Kind == policy.TriggerKindSchedule { cron, ok := p.Trigger.Settings[policy.TriggerSettingsCron] if ok && len(cron.(string)) > 0 { - extras := make(map[string]interface{}) + extras := make(map[string]any) if _, err = r.scheduler.Schedule(ctx, schedulerVendorType, id, "", cron.(string), SchedulerCallback, TriggerParam{ PolicyID: id, Trigger: retention.ExecutionTriggerSchedule, @@ -182,7 +182,7 @@ func (r *defaultController) UpdateRetention(ctx context.Context, p *policy.Metad } } if needSch { - extras := make(map[string]interface{}) + extras := make(map[string]any) _, err := r.scheduler.Schedule(ctx, schedulerVendorType, p.ID, "", p.Trigger.Settings[policy.TriggerSettingsCron].(string), SchedulerCallback, TriggerParam{ PolicyID: p.ID, Trigger: retention.ExecutionTriggerSchedule, @@ -220,7 +220,7 @@ func (r *defaultController) DeleteRetention(ctx context.Context, id int64) error // deleteExecs delete executions func (r *defaultController) deleteExecs(ctx context.Context, vendorID int64) error { executions, err := r.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.RetentionVendorType, "VendorID": vendorID, }, @@ -246,7 +246,7 @@ func (r *defaultController) TriggerRetentionExec(ctx context.Context, policyID i return 0, err } - extra := map[string]interface{}{ + extra := map[string]any{ "dry_run": dryRun, "operator": operator.FromContext(ctx), } @@ -357,7 +357,7 @@ func convertExecution(exec *task.Execution) *retention.Execution { // GetTotalOfRetentionExecs Count Retention Executions func (r *defaultController) GetTotalOfRetentionExecs(ctx context.Context, policyID int64) (int64, error) { return r.execMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.RetentionVendorType, "VendorID": policyID, }, @@ -398,7 +398,7 @@ func convertTask(t *task.Task) *retention.Task { // GetTotalOfRetentionExecTasks Count Retention Execution Histories func (r *defaultController) GetTotalOfRetentionExecTasks(ctx context.Context, executionID int64) (int64, error) { return r.taskMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.RetentionVendorType, "ExecutionID": executionID, }, diff --git a/src/controller/retention/controller_test.go b/src/controller/retention/controller_test.go index 6261d4534d7..ccb30fb3db0 100644 --- a/src/controller/retention/controller_test.go +++ b/src/controller/retention/controller_test.go @@ -73,21 +73,21 @@ func (s *ControllerTestSuite) TestPolicy() { execMgr.On("Get", mock.Anything, mock.Anything).Return(&task.Execution{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }, nil) execMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Execution{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }}, nil) taskMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Task{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "total": 1, "retained": 1, }, @@ -160,7 +160,7 @@ func (s *ControllerTestSuite) TestPolicy() { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "0 22 11 * * *", }, }, @@ -208,7 +208,7 @@ func (s *ControllerTestSuite) TestExecution() { execMgr.On("Get", mock.Anything, mock.Anything).Return(&task.Execution{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }, nil) @@ -216,14 +216,14 @@ func (s *ControllerTestSuite) TestExecution() { execMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Execution{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }}, nil) taskMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Task{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "total": 1, "retained": 1, }, @@ -272,7 +272,7 @@ func (s *ControllerTestSuite) TestExecution() { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "0 22 11 * * *", }, }, @@ -316,7 +316,7 @@ func (f *fakeRetentionScheduler) CountSchedules(ctx context.Context, query *q.Qu panic("implement me") } -func (f *fakeRetentionScheduler) Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, cron string, callbackFuncName string, params interface{}, extras map[string]interface{}) (int64, error) { +func (f *fakeRetentionScheduler) Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, cron string, callbackFuncName string, params any, extras map[string]any) (int64, error) { return 111, nil } diff --git a/src/controller/robot/controller_test.go b/src/controller/robot/controller_test.go index 0405f7f0dc4..f3b7c86eb1e 100644 --- a/src/controller/robot/controller_test.go +++ b/src/controller/robot/controller_test.go @@ -94,7 +94,7 @@ func (suite *ControllerTestSuite) TestCreate() { defer os.Remove(secretKeyPath) suite.T().Setenv("KEY_PATH", secretKeyPath) - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotTokenDuration: "30", } config.InitWithSettings(conf) @@ -170,7 +170,7 @@ func (suite *ControllerTestSuite) TestUpdate() { c := controller{robotMgr: robotMgr, rbacMgr: rbacMgr, proMgr: projectMgr} ctx := context.TODO() - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotPrefix: "robot$", } config.InitWithSettings(conf) @@ -247,7 +247,7 @@ func (suite *ControllerTestSuite) TestList() { }, nil) projectMgr.On("Get", mock.Anything, mock.Anything).Return(&proModels.Project{ProjectID: 1, Name: "library"}, nil) rs, err := c.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "test3", }, }, &Option{ diff --git a/src/controller/robot/model.go b/src/controller/robot/model.go index 32cf15c1136..7b5fae44963 100644 --- a/src/controller/robot/model.go +++ b/src/controller/robot/model.go @@ -40,7 +40,7 @@ const ( type Robot struct { model.Robot ProjectName string - ProjectNameOrID interface{} + ProjectNameOrID any Level string Editable bool `json:"editable"` Permissions []*Permission `json:"permissions"` diff --git a/src/controller/scan/base_controller.go b/src/controller/scan/base_controller.go index 448e25e278d..229a2759ace 100644 --- a/src/controller/scan/base_controller.go +++ b/src/controller/scan/base_controller.go @@ -315,18 +315,18 @@ func (bc *basicController) Scan(ctx context.Context, artifact *ar.Artifact, opti } if opts.ExecutionID == 0 { - extraAttrs := map[string]interface{}{ - artfiactKey: map[string]interface{}{ + extraAttrs := map[string]any{ + artfiactKey: map[string]any{ "id": artifact.ID, "project_id": artifact.ProjectID, "repository_name": artifact.RepositoryName, "digest": artifact.Digest, }, - registrationKey: map[string]interface{}{ + registrationKey: map[string]any{ "id": r.ID, "name": r.Name, }, - enabledCapabilities: map[string]interface{}{ + enabledCapabilities: map[string]any{ "type": opts.GetScanType(), }, } @@ -383,7 +383,7 @@ func (bc *basicController) Stop(ctx context.Context, artifact *ar.Artifact, capT } func (bc *basicController) ScanAll(ctx context.Context, trigger string, async bool) (int64, error) { - extra := make(map[string]interface{}) + extra := make(map[string]any) if op := operator.FromContext(ctx); op != "" { extra["operator"] = op } @@ -511,7 +511,7 @@ func (bc *basicController) startScanAll(ctx context.Context, executionID int64) extraAttrs := exec.ExtraAttrs if extraAttrs == nil { - extraAttrs = map[string]interface{}{"summary": summary} + extraAttrs = map[string]any{"summary": summary} } else { extraAttrs["summary"] = summary } @@ -644,7 +644,7 @@ func (bc *basicController) GetReport(ctx context.Context, artifact *ar.Artifact, } // GetSummary ... -func (bc *basicController) GetSummary(ctx context.Context, artifact *ar.Artifact, scanType string, mimeTypes []string) (map[string]interface{}, error) { +func (bc *basicController) GetSummary(ctx context.Context, artifact *ar.Artifact, scanType string, mimeTypes []string) (map[string]any, error) { handler := sca.GetScanHandler(scanType) return handler.GetSummary(ctx, artifact, mimeTypes) } @@ -663,7 +663,7 @@ func (bc *basicController) GetScanLog(ctx context.Context, artifact *ar.Artifact if err != nil { return nil, err } - artifactMap := map[int64]interface{}{} + artifactMap := map[int64]any{} for _, a := range artifacts { artifactMap[a.ID] = struct{}{} } @@ -751,7 +751,7 @@ func (bc *basicController) GetScanLog(ctx context.Context, artifact *ar.Artifact return b.Bytes(), nil } -func scanTaskForArtifacts(task *task.Task, artifactMap map[int64]interface{}) bool { +func scanTaskForArtifacts(task *task.Task, artifactMap map[int64]any) bool { if task == nil { return false } @@ -961,7 +961,7 @@ func (bc *basicController) launchScanJob(ctx context.Context, param *launchScanJ reportUUIDs[i] = report.UUID } - params := make(map[string]interface{}) + params := make(map[string]any) params[sca.JobParamRegistration] = rJSON params[sca.JobParameterAuthType] = param.Registration.GetRegistryAuthorizationType() params[sca.JobParameterRequest] = sJSON @@ -979,7 +979,7 @@ func (bc *basicController) launchScanJob(ctx context.Context, param *launchScanJ // keep the report uuids in array so that when ?| operator support by the FilterRaw method of beego's orm // we can list the tasks of the scan reports by one SQL - extraAttrs := map[string]interface{}{ + extraAttrs := map[string]any{ artifactIDKey: param.Artifact.ID, artifactTagKey: param.Tag, robotIDKey: robot.ID, @@ -1110,7 +1110,7 @@ func (bc *basicController) isAccessory(ctx context.Context, art *ar.Artifact) (b return false, nil } -func getArtifactID(extraAttrs map[string]interface{}) int64 { +func getArtifactID(extraAttrs map[string]any) int64 { var artifactID float64 if extraAttrs != nil { if v, ok := extraAttrs[artifactIDKey]; ok { @@ -1121,7 +1121,7 @@ func getArtifactID(extraAttrs map[string]interface{}) int64 { return int64(artifactID) } -func getArtifactTag(extraAttrs map[string]interface{}) string { +func getArtifactTag(extraAttrs map[string]any) string { var tag string if extraAttrs != nil { if v, ok := extraAttrs[artifactTagKey]; ok { @@ -1133,13 +1133,13 @@ func getArtifactTag(extraAttrs map[string]interface{}) string { } // GetReportUUIDs returns the report UUIDs from the extra attributes -func GetReportUUIDs(extraAttrs map[string]interface{}) []string { +func GetReportUUIDs(extraAttrs map[string]any) []string { var reportUUIDs []string if extraAttrs != nil { value, ok := extraAttrs[reportUUIDsKey] if ok { - arr, _ := value.([]interface{}) + arr, _ := value.([]any) for _, el := range arr { if s, ok := el.(string); ok { reportUUIDs = append(reportUUIDs, s) @@ -1151,7 +1151,7 @@ func GetReportUUIDs(extraAttrs map[string]interface{}) []string { return reportUUIDs } -func getRobotID(extraAttrs map[string]interface{}) int64 { +func getRobotID(extraAttrs map[string]any) int64 { var trackID float64 if extraAttrs != nil { if v, ok := extraAttrs[robotIDKey]; ok { diff --git a/src/controller/scan/base_controller_test.go b/src/controller/scan/base_controller_test.go index 4133babf67b..93235fbc717 100644 --- a/src/controller/scan/base_controller_test.go +++ b/src/controller/scan/base_controller_test.go @@ -224,7 +224,7 @@ func (suite *ControllerTestSuite) SetupSuite() { rname := fmt.Sprintf("%s-%s-%s", config.ScannerRobotPrefix(context.TODO()), suite.registration.Name, "the-uuid-123") - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotTokenDuration: "30", } config.InitWithSettings(conf) @@ -299,7 +299,7 @@ func (suite *ControllerTestSuite) SetupSuite() { robotJSON, err := rb.ToJSON() require.NoError(suite.T(), err) - params := make(map[string]interface{}) + params := make(map[string]any) params[sca.JobParamRegistration] = regJSON params[sca.JobParameterRequest] = rJSON params[sca.JobParameterMimes] = []string{v1.MimeTypeNativeReport} @@ -672,10 +672,10 @@ func (suite *ControllerTestSuite) TestStopScanAll() { suite.NoError(err) } -func (suite *ControllerTestSuite) makeExtraAttrs(artifactID int64, reportUUIDs ...string) map[string]interface{} { - b, _ := json.Marshal(map[string]interface{}{reportUUIDsKey: reportUUIDs}) +func (suite *ControllerTestSuite) makeExtraAttrs(artifactID int64, reportUUIDs ...string) map[string]any { + b, _ := json.Marshal(map[string]any{reportUUIDsKey: reportUUIDs}) - extraAttrs := map[string]interface{}{} + extraAttrs := map[string]any{} json.Unmarshal(b, &extraAttrs) extraAttrs[artifactIDKey] = float64(artifactID) diff --git a/src/controller/scan/callback.go b/src/controller/scan/callback.go index 096aa0c70a7..211b2363829 100644 --- a/src/controller/scan/callback.go +++ b/src/controller/scan/callback.go @@ -64,7 +64,7 @@ func init() { func scanAllCallback(ctx context.Context, param string) error { if param != "" { - params := make(map[string]interface{}) + params := make(map[string]any) if err := json.Unmarshal([]byte(param), ¶ms); err != nil { return err } @@ -126,7 +126,7 @@ func scanTaskStatusChange(ctx context.Context, taskID int64, status string) (err } // extract ScanType if exist in ExtraAttrs - if c, ok := exec.ExtraAttrs["enabled_capabilities"].(map[string]interface{}); ok { + if c, ok := exec.ExtraAttrs["enabled_capabilities"].(map[string]any); ok { if Type, ok := c["type"].(string); ok { e.ScanType = Type } diff --git a/src/controller/scan/callback_test.go b/src/controller/scan/callback_test.go index 3744468e622..8124c9ba805 100644 --- a/src/controller/scan/callback_test.go +++ b/src/controller/scan/callback_test.go @@ -168,10 +168,10 @@ func (suite *CallbackTestSuite) TestScanAllCallback() { } } -func (suite *CallbackTestSuite) makeExtraAttrs(artifactID, robotID int64) map[string]interface{} { - b, _ := json.Marshal(map[string]interface{}{artifactIDKey: artifactID, robotIDKey: robotID}) +func (suite *CallbackTestSuite) makeExtraAttrs(artifactID, robotID int64) map[string]any { + b, _ := json.Marshal(map[string]any{artifactIDKey: artifactID, robotIDKey: robotID}) - extraAttrs := map[string]interface{}{} + extraAttrs := map[string]any{} json.Unmarshal(b, &extraAttrs) return extraAttrs diff --git a/src/controller/scan/controller.go b/src/controller/scan/controller.go index 3452f145430..cc82e86a8d0 100644 --- a/src/controller/scan/controller.go +++ b/src/controller/scan/controller.go @@ -81,9 +81,9 @@ type Controller interface { // mimeTypes []string : the mime types of the reports // // Returns: - // map[string]interface{} : report summaries indexed by mime types + // map[string]any : report summaries indexed by mime types // error : non nil error if any errors occurred - GetSummary(ctx context.Context, artifact *artifact.Artifact, scanType string, mimeTypes []string) (map[string]interface{}, error) + GetSummary(ctx context.Context, artifact *artifact.Artifact, scanType string, mimeTypes []string) (map[string]any, error) // Get the scan log for the specified artifact with the given digest // diff --git a/src/controller/scandataexport/execution.go b/src/controller/scandataexport/execution.go index 895ed7bed4a..ef48a35b4f1 100644 --- a/src/controller/scandataexport/execution.go +++ b/src/controller/scandataexport/execution.go @@ -57,7 +57,7 @@ type controller struct { } func (c *controller) ListExecutions(ctx context.Context, userName string) ([]*export.Execution, error) { - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["VendorType"] = job.ScanDataExportVendorType keywords[fmt.Sprintf("ExtraAttrs.%s", export.UserNameAttribute)] = userName @@ -78,7 +78,7 @@ func (c *controller) GetTask(ctx context.Context, executionID int64) (*task.Task logger := log.GetLogger(ctx) query := q2.New(q2.KeyWords{}) - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["VendorType"] = job.ScanDataExportVendorType keywords["ExecutionID"] = executionID query.Keywords = keywords @@ -125,7 +125,7 @@ func (c *controller) DeleteExecution(ctx context.Context, executionID int64) err func (c *controller) Start(ctx context.Context, request export.Request) (executionID int64, err error) { logger := log.GetLogger(ctx) vendorID := int64(ctx.Value(export.CsvJobVendorIDKey).(int)) - extraAttrs := make(map[string]interface{}) + extraAttrs := make(map[string]any) extraAttrs[export.ProjectIDsAttribute] = request.Projects extraAttrs[export.JobNameAttribute] = request.JobName extraAttrs[export.UserNameAttribute] = request.UserName @@ -137,7 +137,7 @@ func (c *controller) Start(ctx context.Context, request export.Request) (executi } // create a job object and fill with metadata and parameters - params := make(map[string]interface{}) + params := make(map[string]any) params[export.JobID] = fmt.Sprintf("%d", id) params[export.JobRequest] = request params[export.JobModeKey] = export.JobModeExport @@ -184,7 +184,7 @@ func (c *controller) convertToExportExecStatus(ctx context.Context, exec *task.E EndTime: exec.EndTime, } if pids, ok := exec.ExtraAttrs[export.ProjectIDsAttribute]; ok { - for _, pid := range pids.([]interface{}) { + for _, pid := range pids.([]any) { execStatus.ProjectIDs = append(execStatus.ProjectIDs, int64(pid.(float64))) } } diff --git a/src/controller/scandataexport/execution_test.go b/src/controller/scandataexport/execution_test.go index 8c616b08d64..0314d461d7c 100644 --- a/src/controller/scandataexport/execution_test.go +++ b/src/controller/scandataexport/execution_test.go @@ -94,7 +94,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestGetExecution() { sysArtifactMgr: suite.sysArtifactMgr, } // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" attrs[export.DigestKey] = "sha256:d04b98f48e8f8bcc15c6ae5ac050801cd6dcfd428fb5f9e65c4e16e7807340fa" @@ -154,7 +154,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestGetExecutionSysArtifactExistF sysArtifactMgr: suite.sysArtifactMgr, } // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" { @@ -194,7 +194,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestGetExecutionList() { sysArtifactMgr: suite.sysArtifactMgr, } // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" { @@ -243,7 +243,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestStart() { // execution manager and task manager return successfully { // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.ProjectIDsAttribute] = []int64{1} attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" @@ -307,7 +307,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestStartWithTaskManagerError() { { ctx := context.Background() ctx = context.WithValue(ctx, export.CsvJobVendorIDKey, int(-1)) - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.ProjectIDsAttribute] = []int64{1} attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" @@ -327,7 +327,7 @@ func (suite *ScanDataExportExecutionTestSuite) TearDownSuite() { func (suite *ScanDataExportExecutionTestSuite) validateExecutionManagerInvocation(ctx context.Context) { // validate that execution manager has been called with the specified - extraAttsMatcher := testifymock.MatchedBy(func(m map[string]interface{}) bool { + extraAttsMatcher := testifymock.MatchedBy(func(m map[string]any) bool { jobName, jobNamePresent := m[export.JobNameAttribute] userName, userNamePresent := m[export.UserNameAttribute] return jobNamePresent && userNamePresent && jobName == "test-job" && userName == "test-user" diff --git a/src/controller/scanner/base_controller.go b/src/controller/scanner/base_controller.go index 25ae5820d58..623dd4b2865 100644 --- a/src/controller/scanner/base_controller.go +++ b/src/controller/scanner/base_controller.go @@ -362,7 +362,7 @@ func (bc *basicController) getScannerAdapterMetadataWithCache(ctx context.Contex key := fmt.Sprintf("reg:%d:metadata", registration.ID) var result MetadataResult - err := cache.FetchOrSave(ctx, bc.Cache(), key, &result, func() (interface{}, error) { + err := cache.FetchOrSave(ctx, bc.Cache(), key, &result, func() (any, error) { meta, err := bc.getScannerAdapterMetadata(registration) if err != nil { return &MetadataResult{Error: err.Error()}, nil diff --git a/src/controller/securityhub/controller.go b/src/controller/securityhub/controller.go index fe28f3b2214..fb69412b9d5 100644 --- a/src/controller/securityhub/controller.go +++ b/src/controller/securityhub/controller.go @@ -147,7 +147,7 @@ func (c *controller) attachTags(ctx context.Context, vuls []*secHubModel.Vulnera } // get tags in the artifact list - var artifactIDs []interface{} + var artifactIDs []any for k := range artifactTagMap { artifactIDs = append(artifactIDs, k) } diff --git a/src/controller/systemartifact/execution.go b/src/controller/systemartifact/execution.go index 7a575e076c0..06550cb966d 100644 --- a/src/controller/systemartifact/execution.go +++ b/src/controller/systemartifact/execution.go @@ -148,7 +148,7 @@ func scheduleSystemArtifactCleanJob(ctx context.Context) error { } func getSystemArtifactCleanupSchedule(ctx context.Context) (*scheduler.Schedule, error) { - query := q.New(map[string]interface{}{"vendor_type": job.SystemArtifactCleanupVendorType}) + query := q.New(map[string]any{"vendor_type": job.SystemArtifactCleanupVendorType}) schedules, err := sched.ListSchedules(ctx, query) if err != nil { log.Errorf("Unable to check if export data cleanup job is already scheduled : %v", err) diff --git a/src/controller/systemartifact/execution_test.go b/src/controller/systemartifact/execution_test.go index 7656fae376d..aebceba2270 100644 --- a/src/controller/systemartifact/execution_test.go +++ b/src/controller/systemartifact/execution_test.go @@ -137,7 +137,7 @@ func (suite *SystemArtifactCleanupTestSuite) TestScheduleCleanupJobNoPreviousSch makeCtx: func() context.Context { return orm.NewContext(nil, &ormtesting.FakeOrmer{}) }, } - var extraAttrs map[string]interface{} + var extraAttrs map[string]any suite.sched.On("Schedule", mock.Anything, job.SystemArtifactCleanupVendorType, int64(0), cronTypeDaily, cronSpec, SystemArtifactCleanupCallback, nil, extraAttrs).Return(int64(1), nil) suite.sched.On("ListSchedules", mock.Anything, mock.Anything).Return(make([]*scheduler2.Schedule, 0), nil) @@ -163,7 +163,7 @@ func (suite *SystemArtifactCleanupTestSuite) TestScheduleCleanupJobPreviousSched makeCtx: func() context.Context { return orm.NewContext(nil, &ormtesting.FakeOrmer{}) }, } - var extraAttrs map[string]interface{} + var extraAttrs map[string]any suite.sched.On("Schedule", mock.Anything, job.SystemArtifactCleanupVendorType, int64(0), cronTypeDaily, cronSpec, SystemArtifactCleanupCallback, nil, extraAttrs).Return(int64(1), nil) @@ -200,7 +200,7 @@ func (suite *SystemArtifactCleanupTestSuite) TestScheduleCleanupJobPreviousSched ScheduleCleanupTask(ctx) - extraAttributesMatcher := testifymock.MatchedBy(func(attrs map[string]interface{}) bool { + extraAttributesMatcher := testifymock.MatchedBy(func(attrs map[string]any) bool { return len(attrs) == 0 }) suite.sched.AssertNotCalled(suite.T(), "Schedule", mock.Anything, diff --git a/src/controller/systeminfo/controller.go b/src/controller/systeminfo/controller.go index 3f3b82c82e1..e3d40b303bd 100644 --- a/src/controller/systeminfo/controller.go +++ b/src/controller/systeminfo/controller.go @@ -139,7 +139,7 @@ func (c *controller) GetInfo(ctx context.Context, opt Options) (*Data, error) { return res, nil } -func OIDCProviderName(cfg map[string]interface{}) string { +func OIDCProviderName(cfg map[string]any) string { authMode := utils.SafeCastString(cfg[common.AUTHMode]) if authMode != common.OIDCAuth { return "" diff --git a/src/controller/systeminfo/controller_test.go b/src/controller/systeminfo/controller_test.go index 3ca08721a6e..6c3eb454615 100644 --- a/src/controller/systeminfo/controller_test.go +++ b/src/controller/systeminfo/controller_test.go @@ -23,7 +23,7 @@ func (s *sysInfoCtlTestSuite) SetupTest() { version.ReleaseVersion = "test" version.GitCommit = "fakeid" - conf := map[string]interface{}{ + conf := map[string]any{ common.AUTHMode: "db_auth", common.SelfRegistration: true, common.ExtEndpoint: "https://test.goharbor.io", @@ -107,16 +107,16 @@ func TestControllerSuite(t *testing.T) { func TestOIDCProviderName(t *testing.T) { type args struct { - cfg map[string]interface{} + cfg map[string]any } tests := []struct { name string args args want string }{ - {"normal testing", args{map[string]interface{}{common.AUTHMode: common.OIDCAuth, common.OIDCName: "test"}}, "test"}, - {"not oidc", args{map[string]interface{}{common.AUTHMode: common.DBAuth, common.OIDCName: "test"}}, ""}, - {"empty provider", args{map[string]interface{}{common.AUTHMode: common.OIDCAuth, common.OIDCName: ""}}, ""}, + {"normal testing", args{map[string]any{common.AUTHMode: common.OIDCAuth, common.OIDCName: "test"}}, "test"}, + {"not oidc", args{map[string]any{common.AUTHMode: common.DBAuth, common.OIDCName: "test"}}, ""}, + {"empty provider", args{map[string]any{common.AUTHMode: common.OIDCAuth, common.OIDCName: ""}}, ""}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/controller/tag/controller.go b/src/controller/tag/controller.go index 5e20419df4b..f00bde58475 100644 --- a/src/controller/tag/controller.go +++ b/src/controller/tag/controller.go @@ -76,7 +76,7 @@ type controller struct { // Ensure ... func (c *controller) Ensure(ctx context.Context, repositoryID, artifactID int64, name string) (int64, error) { query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "repository_id": repositoryID, "name": name, }, diff --git a/src/controller/task/sweep.go b/src/controller/task/sweep.go index b4bf023d80d..67c04294216 100644 --- a/src/controller/task/sweep.go +++ b/src/controller/task/sweep.go @@ -67,7 +67,7 @@ type sweepController struct { } func (sc *sweepController) Start(ctx context.Context, params *SweepParams, trigger string) error { - jobParams := make(map[string]interface{}) + jobParams := make(map[string]any) jobParams[task.ExecRetainCounts] = params.ExecRetainCounts execID, err := sc.execMgr.Create(ctx, job.ExecSweepVendorType, systemVendorID, trigger, jobParams) @@ -129,7 +129,7 @@ func ScheduleSweepJob(ctx context.Context) error { // getScheduledSweepJob gets sweep job which already scheduled. func getScheduledSweepJob(ctx context.Context) (*scheduler.Schedule, error) { - query := q.New(map[string]interface{}{"vendor_type": job.ExecSweepVendorType}) + query := q.New(map[string]any{"vendor_type": job.ExecSweepVendorType}) schedules, err := scheduler.Sched.ListSchedules(ctx, query) if err != nil { return nil, err diff --git a/src/controller/user/controller.go b/src/controller/user/controller.go index 928d9fa89f7..b7d71a12aa9 100644 --- a/src/controller/user/controller.go +++ b/src/controller/user/controller.go @@ -196,7 +196,7 @@ func (c *controller) Delete(ctx context.Context, id int) error { if err != nil { return errors.Wrap(err, "unable to get user information") } - params := map[string]interface{}{ + params := map[string]any{ gdpr.UserNameParam: userDb.Username, } execID, err := c.exeMgr.Create(ctx, job.AuditLogsGDPRCompliantVendorType, -1, task.ExecutionTriggerEvent, params) diff --git a/src/controller/usergroup/test/controller_test.go b/src/controller/usergroup/test/controller_test.go index 6aa443f1767..ee81cc5e07c 100644 --- a/src/controller/usergroup/test/controller_test.go +++ b/src/controller/usergroup/test/controller_test.go @@ -38,7 +38,7 @@ func (c *controllerTestSuite) SetupTest() { c.Suite.ClearTables = []string{"user_group"} } -var defaultConfigWithVerifyCert = map[string]interface{}{ +var defaultConfigWithVerifyCert = map[string]any{ common.ExtEndpoint: "https://host01.com", common.AUTHMode: common.LDAPAuth, common.DatabaseType: "postgresql", diff --git a/src/controller/webhook/controller.go b/src/controller/webhook/controller.go index 3e8f50f7fdd..8914352574c 100644 --- a/src/controller/webhook/controller.go +++ b/src/controller/webhook/controller.go @@ -31,7 +31,7 @@ var ( Ctl = NewController() // webhookJobVendors represents webhook(http) or slack. - webhookJobVendors = q.NewOrList([]interface{}{job.WebhookJobVendorType, job.SlackJobVendorType}) + webhookJobVendors = q.NewOrList([]any{job.WebhookJobVendorType, job.SlackJobVendorType}) ) type Controller interface { diff --git a/src/core/api/api_test.go b/src/core/api/api_test.go index b1d4bc1450b..dae21472334 100644 --- a/src/core/api/api_test.go +++ b/src/core/api/api_test.go @@ -73,8 +73,8 @@ type testingRequest struct { method string url string header http.Header - queryStruct interface{} - bodyJSON interface{} + queryStruct any + bodyJSON any credential *usrInfo } @@ -139,7 +139,7 @@ func handle(r *testingRequest) (*httptest.ResponseRecorder, error) { return resp, nil } -func handleAndParse(r *testingRequest, v interface{}) error { +func handleAndParse(r *testingRequest, v any) error { resp, err := handle(r) if err != nil { return err diff --git a/src/core/api/base.go b/src/core/api/base.go index 937cfb6fa7c..d804b5e5d70 100644 --- a/src/core/api/base.go +++ b/src/core/api/base.go @@ -74,7 +74,7 @@ func (b *BaseController) RequireAuthenticated() bool { } // HasProjectPermission returns true when the request has action permission on project subresource -func (b *BaseController) HasProjectPermission(projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) (bool, error) { +func (b *BaseController) HasProjectPermission(projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) (bool, error) { _, _, err := utils.ParseProjectIDOrName(projectIDOrName) if err != nil { return false, err @@ -95,7 +95,7 @@ func (b *BaseController) HasProjectPermission(projectIDOrName interface{}, actio // RequireProjectAccess returns true when the request has action access on project subresource // otherwise send UnAuthorized or Forbidden response and returns false -func (b *BaseController) RequireProjectAccess(projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) bool { +func (b *BaseController) RequireProjectAccess(projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) bool { hasPermission, err := b.HasProjectPermission(projectIDOrName, action, subresource...) if err != nil { if errors.IsNotFoundErr(err) { @@ -116,7 +116,7 @@ func (b *BaseController) RequireProjectAccess(projectIDOrName interface{}, actio // This should be called when a project is not found, if the caller is a system admin it returns 404. // If it's regular user, it will render permission error -func (b *BaseController) handleProjectNotFound(projectIDOrName interface{}) { +func (b *BaseController) handleProjectNotFound(projectIDOrName any) { if b.SecurityCtx.IsSysAdmin() { b.SendNotFoundError(fmt.Errorf("project %v not found", projectIDOrName)) } else { @@ -134,7 +134,7 @@ func (b *BaseController) SendPermissionError() { } // WriteJSONData writes the JSON data to the client. -func (b *BaseController) WriteJSONData(object interface{}) { +func (b *BaseController) WriteJSONData(object any) { b.Data["json"] = object if err := b.ServeJSON(); err != nil { log.Errorf("failed to serve json, %v", err) @@ -144,7 +144,7 @@ func (b *BaseController) WriteJSONData(object interface{}) { } // WriteYamlData writes the yaml data to the client. -func (b *BaseController) WriteYamlData(object interface{}) { +func (b *BaseController) WriteYamlData(object any) { yData, err := yaml.Marshal(object) if err != nil { b.SendInternalServerError(err) diff --git a/src/core/auth/authproxy/auth_test.go b/src/core/auth/authproxy/auth_test.go index 76045a559f6..6279b894249 100644 --- a/src/core/auth/authproxy/auth_test.go +++ b/src/core/auth/authproxy/auth_test.go @@ -54,7 +54,7 @@ func TestMain(m *testing.M) { userMgr: user.New(), } cfgMap := cut.GetUnitTestConfig() - conf := map[string]interface{}{ + conf := map[string]any{ common.HTTPAuthProxyEndpoint: a.Endpoint, common.HTTPAuthProxyTokenReviewEndpoint: a.TokenReviewEndpoint, common.HTTPAuthProxyVerifyCert: false, diff --git a/src/core/auth/ldap/ldap_test.go b/src/core/auth/ldap/ldap_test.go index f1fa37f3e9c..00594c9a0f1 100644 --- a/src/core/auth/ldap/ldap_test.go +++ b/src/core/auth/ldap/ldap_test.go @@ -38,7 +38,7 @@ import ( ugModel "github.com/goharbor/harbor/src/pkg/usergroup/model" ) -var ldapTestConfig = map[string]interface{}{ +var ldapTestConfig = map[string]any{ common.ExtEndpoint: "host01.com", common.AUTHMode: "ldap_auth", common.DatabaseType: "postgresql", diff --git a/src/core/controllers/oidc.go b/src/core/controllers/oidc.go index 63e491eb043..f1fa57596bf 100644 --- a/src/core/controllers/oidc.go +++ b/src/core/controllers/oidc.go @@ -430,7 +430,7 @@ func getSessionType(refreshToken string) (string, error) { if err != nil { return "", errors.Errorf("failed to decode refresh token: %v", err) } - var claims map[string]interface{} + var claims map[string]any if err := json.Unmarshal(payload, &claims); err != nil { return "", errors.Errorf("failed to unmarshal refresh token: %v", err) } diff --git a/src/core/service/token/token_test.go b/src/core/service/token/token_test.go index f0881904e4a..2ea6a8f7106 100644 --- a/src/core/service/token/token_test.go +++ b/src/core/service/token/token_test.go @@ -148,7 +148,7 @@ func TestMakeToken(t *testing.T) { if err != nil { t.Errorf("Error while getting public key from cert: %s", crt) } - tok, err := jwt.ParseWithClaims(tokenString, &harborClaims{}, func(t *jwt.Token) (interface{}, error) { + tok, err := jwt.ParseWithClaims(tokenString, &harborClaims{}, func(t *jwt.Token) (any, error) { if _, ok := t.Method.(*jwt.SigningMethodRSA); !ok { return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"]) } @@ -251,7 +251,7 @@ func (f *fakeSecurityContext) Can(ctx context.Context, action rbac.Action, resou func (f *fakeSecurityContext) GetMyProjects() ([]*proModels.Project, error) { return nil, nil } -func (f *fakeSecurityContext) GetProjectRoles(interface{}) []int { +func (f *fakeSecurityContext) GetProjectRoles(any) []int { return nil } diff --git a/src/core/session/codec.go b/src/core/session/codec.go index 4fc10c04409..d964055da88 100644 --- a/src/core/session/codec.go +++ b/src/core/session/codec.go @@ -35,26 +35,26 @@ var ( type gobCodec struct{} -func (*gobCodec) Encode(v interface{}) ([]byte, error) { - if vm, ok := v.(map[interface{}]interface{}); ok { +func (*gobCodec) Encode(v any) ([]byte, error) { + if vm, ok := v.(map[any]any); ok { return session.EncodeGob(vm) } return nil, errors.Errorf("object type invalid, %#v", v) } -func (*gobCodec) Decode(data []byte, v interface{}) error { +func (*gobCodec) Decode(data []byte, v any) error { vm, err := session.DecodeGob(data) if err != nil { return err } switch in := v.(type) { - case map[interface{}]interface{}: + case map[any]any: for k, v := range vm { in[k] = v } - case *map[interface{}]interface{}: + case *map[any]any: m := *in for k, v := range vm { m[k] = v diff --git a/src/core/session/codec_test.go b/src/core/session/codec_test.go index 3f15ba7460e..6cb5cb9cbac 100644 --- a/src/core/session/codec_test.go +++ b/src/core/session/codec_test.go @@ -26,12 +26,12 @@ type User struct { func TestCodec(t *testing.T) { u := &User{User: "admin", Pass: "123456"} - m := make(map[interface{}]interface{}) + m := make(map[any]any) m["user"] = u c, err := codec.Encode(m) assert.NoError(t, err, "encode should not error") - v := make(map[interface{}]interface{}) + v := make(map[any]any) err = codec.Decode(c, &v) assert.NoError(t, err, "decode should not error") diff --git a/src/core/session/session.go b/src/core/session/session.go index 448ed1a971b..2d431f5e0ae 100644 --- a/src/core/session/session.go +++ b/src/core/session/session.go @@ -41,12 +41,12 @@ type Store struct { c cache.Cache sid string lock sync.RWMutex - values map[interface{}]interface{} + values map[any]any maxlifetime int64 } // Set value in redis session -func (rs *Store) Set(_ context.Context, key, value interface{}) error { +func (rs *Store) Set(_ context.Context, key, value any) error { rs.lock.Lock() defer rs.lock.Unlock() rs.values[key] = value @@ -54,7 +54,7 @@ func (rs *Store) Set(_ context.Context, key, value interface{}) error { } // Get value in redis session -func (rs *Store) Get(_ context.Context, key interface{}) interface{} { +func (rs *Store) Get(_ context.Context, key any) any { rs.lock.RLock() defer rs.lock.RUnlock() if v, ok := rs.values[key]; ok { @@ -64,7 +64,7 @@ func (rs *Store) Get(_ context.Context, key interface{}) interface{} { } // Delete value in redis session -func (rs *Store) Delete(_ context.Context, key interface{}) error { +func (rs *Store) Delete(_ context.Context, key any) error { rs.lock.Lock() defer rs.lock.Unlock() delete(rs.values, key) @@ -75,7 +75,7 @@ func (rs *Store) Delete(_ context.Context, key interface{}) error { func (rs *Store) Flush(_ context.Context) error { rs.lock.Lock() defer rs.lock.Unlock() - rs.values = make(map[interface{}]interface{}) + rs.values = make(map[any]any) return nil } @@ -144,7 +144,7 @@ func (rp *Provider) SessionInit(ctx context.Context, maxlifetime int64, url stri // SessionRead read redis session by sid func (rp *Provider) SessionRead(ctx context.Context, sid string) (session.Store, error) { - kv := make(map[interface{}]interface{}) + kv := make(map[any]any) if ctx == nil { ctx = context.TODO() } @@ -182,7 +182,7 @@ func (rp *Provider) SessionRegenerate(ctx context.Context, oldsid, sid string) ( rdb.Rename(ctx, oldsid, sid) rdb.Expire(ctx, sid, maxlifetime) } else { - kv := make(map[interface{}]interface{}) + kv := make(map[any]any) err := rp.c.Fetch(ctx, sid, &kv) if err != nil && !errors.Is(err, cache.ErrNotFound) { return nil, err diff --git a/src/jobservice/README.md b/src/jobservice/README.md index 082a2d2f184..591ff121492 100644 --- a/src/jobservice/README.md +++ b/src/jobservice/README.md @@ -100,7 +100,7 @@ type Interface interface { // The related arguments will be injected by the workerpool. // // ctx Context : Job execution context. - // params map[string]interface{} : parameters with key-pair style for the job execution. + // params map[string]any : parameters with key-pair style for the job execution. // // Returns: // error if failed to run. NOTES: If job is stopped or cancelled, a specified error should be returned diff --git a/src/jobservice/api/handler.go b/src/jobservice/api/handler.go index 49df3d2fc06..425effcead0 100644 --- a/src/jobservice/api/handler.go +++ b/src/jobservice/api/handler.go @@ -271,7 +271,7 @@ func (dh *DefaultHandler) HandleGetJobsReq(w http.ResponseWriter, req *http.Requ dh.handleJSONData(w, req, http.StatusOK, jobs) } -func (dh *DefaultHandler) handleJSONData(w http.ResponseWriter, req *http.Request, code int, object interface{}) { +func (dh *DefaultHandler) handleJSONData(w http.ResponseWriter, req *http.Request, code int, object any) { data, err := json.Marshal(object) if err != nil { dh.handleError(w, req, http.StatusInternalServerError, errs.HandleJSONDataError(err)) diff --git a/src/jobservice/common/list/list.go b/src/jobservice/common/list/list.go index 9f18d6648f0..2ab55b75a4b 100644 --- a/src/jobservice/common/list/list.go +++ b/src/jobservice/common/list/list.go @@ -36,7 +36,7 @@ func New() *SyncList { } // Iterate the list -func (l *SyncList) Iterate(f func(ele interface{}) bool) { +func (l *SyncList) Iterate(f func(ele any) bool) { l.lock.RLock() defer l.lock.RUnlock() @@ -54,7 +54,7 @@ func (l *SyncList) Iterate(f func(ele interface{}) bool) { } // Push the element to the back of the list -func (l *SyncList) Push(ele interface{}) { +func (l *SyncList) Push(ele any) { if ele != nil { l.lock.Lock() defer l.lock.Unlock() diff --git a/src/jobservice/common/list/list_test.go b/src/jobservice/common/list/list_test.go index 5ecd783524e..ee13f52165a 100644 --- a/src/jobservice/common/list/list_test.go +++ b/src/jobservice/common/list/list_test.go @@ -43,7 +43,7 @@ func (suite *ListSuite) SetupSuite() { } func (suite *ListSuite) TestIterate() { - suite.l.Iterate(func(ele interface{}) bool { + suite.l.Iterate(func(ele any) bool { if s, ok := ele.(string); ok { if strings.HasPrefix(s, "b") { return true diff --git a/src/jobservice/common/query/q.go b/src/jobservice/common/query/q.go index 3e123365ca1..33c2068455e 100644 --- a/src/jobservice/common/query/q.go +++ b/src/jobservice/common/query/q.go @@ -38,17 +38,17 @@ const ( ) // ExtraParameters to keep non pagination query parameters -type ExtraParameters map[string]interface{} +type ExtraParameters map[string]any // Set extra parameters -func (ep ExtraParameters) Set(key string, v interface{}) { +func (ep ExtraParameters) Set(key string, v any) { if len(key) > 0 { ep[key] = v } } // Get the extra parameter by key -func (ep ExtraParameters) Get(key string) (interface{}, bool) { +func (ep ExtraParameters) Get(key string) (any, bool) { v, ok := ep[key] return v, ok diff --git a/src/jobservice/common/rds/utils.go b/src/jobservice/common/rds/utils.go index d0901aa559d..f5a473264e1 100644 --- a/src/jobservice/common/rds/utils.go +++ b/src/jobservice/common/rds/utils.go @@ -29,7 +29,7 @@ import ( var ErrNoElements = errors.New("no elements got from the backend") // HmSet sets the properties of hash map -func HmSet(conn redis.Conn, key string, fieldAndValues ...interface{}) error { +func HmSet(conn redis.Conn, key string, fieldAndValues ...any) error { if conn == nil { return errors.New("nil redis connection") } @@ -42,7 +42,7 @@ func HmSet(conn redis.Conn, key string, fieldAndValues ...interface{}) error { return errors.New("no properties specified to do HMSET") } - args := make([]interface{}, 0, len(fieldAndValues)+2) + args := make([]any, 0, len(fieldAndValues)+2) args = append(args, key) args = append(args, fieldAndValues...) @@ -55,7 +55,7 @@ func HmSet(conn redis.Conn, key string, fieldAndValues ...interface{}) error { // HmGet gets values of multiple fields // Values have same order with the provided fields -func HmGet(conn redis.Conn, key string, fields ...interface{}) ([]interface{}, error) { +func HmGet(conn redis.Conn, key string, fields ...any) ([]any, error) { if conn == nil { return nil, errors.New("nil redis connection") } @@ -68,7 +68,7 @@ func HmGet(conn redis.Conn, key string, fields ...interface{}) ([]interface{}, e return nil, errors.New("no fields specified to do HMGET") } - args := make([]interface{}, 0, len(fields)+1) + args := make([]any, 0, len(fields)+1) args = append(args, key) args = append(args, fields...) @@ -111,7 +111,7 @@ func GetZsetByScore(conn redis.Conn, key string, scores []int64) ([]JobScore, er // AcquireLock acquires a redis lock with specified expired time func AcquireLock(conn redis.Conn, lockerKey string, lockerID string, expireTime int64) error { - args := []interface{}{lockerKey, lockerID, "NX", "EX", expireTime} + args := []any{lockerKey, lockerID, "NX", "EX", expireTime} res, err := conn.Do("SET", args...) if err != nil { return err diff --git a/src/jobservice/common/utils/utils_test.go b/src/jobservice/common/utils/utils_test.go index fde4dfad382..f7286376767 100644 --- a/src/jobservice/common/utils/utils_test.go +++ b/src/jobservice/common/utils/utils_test.go @@ -92,7 +92,7 @@ func (suite *UtilsTestSuite) TestJobSerializeAndDeSerialize() { Name: "test", ID: "123", EnqueuedAt: 123, - Args: map[string]interface{}{ + Args: map[string]any{ "test": "test", }, Unique: true, diff --git a/src/jobservice/config/config.go b/src/jobservice/config/config.go index 2fc974a679a..d825f3dd7c5 100644 --- a/src/jobservice/config/config.go +++ b/src/jobservice/config/config.go @@ -123,7 +123,7 @@ type MetricConfig struct { } // CustomizedSettings keeps the customized settings of logger -type CustomizedSettings map[string]interface{} +type CustomizedSettings map[string]any // LogSweeperConfig keeps settings of log sweeper type LogSweeperConfig struct { diff --git a/src/jobservice/core/controller_test.go b/src/jobservice/core/controller_test.go index 81f90141715..257abed03ea 100644 --- a/src/jobservice/core/controller_test.go +++ b/src/jobservice/core/controller_test.go @@ -235,7 +235,7 @@ func (suite *ControllerTestSuite) GetPoolID() string { return suite.worker.GetPoolID() } -func (suite *ControllerTestSuite) RegisterJobs(jobs map[string]interface{}) error { +func (suite *ControllerTestSuite) RegisterJobs(jobs map[string]any) error { return suite.worker.RegisterJobs(jobs) } @@ -255,11 +255,11 @@ func (suite *ControllerTestSuite) Stats() (*worker.Stats, error) { return suite.worker.Stats() } -func (suite *ControllerTestSuite) IsKnownJob(name string) (interface{}, bool) { +func (suite *ControllerTestSuite) IsKnownJob(name string) (any, bool) { return suite.worker.IsKnownJob(name) } -func (suite *ControllerTestSuite) ValidateJobParameters(jobType interface{}, params job.Parameters) error { +func (suite *ControllerTestSuite) ValidateJobParameters(jobType any, params job.Parameters) error { return suite.worker.ValidateJobParameters(jobType, params) } @@ -305,7 +305,7 @@ func (f *fakeWorker) GetPoolID() string { return f.Called().String() } -func (f *fakeWorker) RegisterJobs(jobs map[string]interface{}) error { +func (f *fakeWorker) RegisterJobs(jobs map[string]any) error { return f.Called(jobs).Error(0) } @@ -345,7 +345,7 @@ func (f *fakeWorker) Stats() (*worker.Stats, error) { return args.Get(0).(*worker.Stats), nil } -func (f *fakeWorker) IsKnownJob(name string) (interface{}, bool) { +func (f *fakeWorker) IsKnownJob(name string) (any, bool) { args := f.Called(name) if !args.Bool(1) { return nil, args.Bool(1) @@ -354,7 +354,7 @@ func (f *fakeWorker) IsKnownJob(name string) (interface{}, bool) { return args.Get(0), args.Bool(1) } -func (f *fakeWorker) ValidateJobParameters(jobType interface{}, params job.Parameters) error { +func (f *fakeWorker) ValidateJobParameters(jobType any, params job.Parameters) error { return f.Called(jobType, params).Error(0) } diff --git a/src/jobservice/errs/errors.go b/src/jobservice/errs/errors.go index 3ea1d609988..4e77e9bc9bf 100644 --- a/src/jobservice/errs/errors.go +++ b/src/jobservice/errs/errors.go @@ -191,7 +191,7 @@ type badRequestError struct { } // BadRequestError returns the error of handing bad request case -func BadRequestError(object interface{}) error { +func BadRequestError(object any) error { return badRequestError{ baseError{ Code: BadRequestErrorCode, diff --git a/src/jobservice/job/context.go b/src/jobservice/job/context.go index 1f699e1e0e5..2c399ce0bdc 100644 --- a/src/jobservice/job/context.go +++ b/src/jobservice/job/context.go @@ -40,7 +40,7 @@ type Context interface { // Returns: // The data of the specified context property if have // bool to indicate if the property existing - Get(prop string) (interface{}, bool) + Get(prop string) (any, bool) // SystemContext returns the system context // diff --git a/src/jobservice/job/impl/context.go b/src/jobservice/job/impl/context.go index ed4a0beb6e4..8bbe80fd0ee 100644 --- a/src/jobservice/job/impl/context.go +++ b/src/jobservice/job/impl/context.go @@ -44,7 +44,7 @@ type Context struct { // Logger for job logger logger.Interface // other required information - properties map[string]interface{} + properties map[string]any // admin server client cfgMgr libCfg.Manager // job life cycle tracker @@ -58,7 +58,7 @@ func NewContext(sysCtx context.Context, cfgMgr libCfg.Manager) *Context { return &Context{ sysContext: libCfg.NewContext(sysCtx, cfgMgr), cfgMgr: cfgMgr, - properties: make(map[string]interface{}), + properties: make(map[string]any), } } @@ -110,7 +110,7 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { jContext := &Context{ sysContext: orm.NewContext(c.sysContext, o.NewOrm()), cfgMgr: c.cfgMgr, - properties: make(map[string]interface{}), + properties: make(map[string]any), tracker: tracker, } @@ -145,7 +145,7 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { } // Get implements the same method in env.JobContext interface -func (c *Context) Get(prop string) (interface{}, bool) { +func (c *Context) Get(prop string) (any, bool) { v, ok := c.properties[prop] return v, ok } @@ -192,13 +192,13 @@ func createLoggers(jobID string) (logger.Interface, error) { // For running job, the depth should be 5 if lc.Name == logger.NameFile || lc.Name == logger.NameStdOutput || lc.Name == logger.NameDB { if lc.Settings == nil { - lc.Settings = map[string]interface{}{} + lc.Settings = map[string]any{} } lc.Settings["depth"] = 5 } if lc.Name == logger.NameFile || lc.Name == logger.NameDB { // Need extra param - fSettings := map[string]interface{}{} + fSettings := map[string]any{} for k, v := range lc.Settings { // Copy settings fSettings[k] = v diff --git a/src/jobservice/job/impl/context_test.go b/src/jobservice/job/impl/context_test.go index 97d1f6b5276..017604a9219 100644 --- a/src/jobservice/job/impl/context_test.go +++ b/src/jobservice/job/impl/context_test.go @@ -62,12 +62,12 @@ func (suite *ContextImplTestSuite) SetupSuite() { { Name: "FILE", Level: "INFO", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 1, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/job/impl/default_context.go b/src/jobservice/job/impl/default_context.go index 9b8da36c7b0..47c1eb625d2 100644 --- a/src/jobservice/job/impl/default_context.go +++ b/src/jobservice/job/impl/default_context.go @@ -32,7 +32,7 @@ type DefaultContext struct { // Logger for job logger logger.Interface // Other required information - properties map[string]interface{} + properties map[string]any // Track the job attached with the context tracker job.Tracker } @@ -41,7 +41,7 @@ type DefaultContext struct { func NewDefaultContext(sysCtx context.Context) job.Context { return &DefaultContext{ sysContext: sysCtx, - properties: make(map[string]interface{}), + properties: make(map[string]any), } } @@ -56,7 +56,7 @@ func (dc *DefaultContext) Build(t job.Tracker) (job.Context, error) { // TODO support DB transaction sysContext: orm.NewContext(dc.sysContext, o.NewOrm()), tracker: t, - properties: make(map[string]interface{}), + properties: make(map[string]any), } // Copy properties @@ -78,7 +78,7 @@ func (dc *DefaultContext) Build(t job.Tracker) (job.Context, error) { } // Get implements the same method in env.Context interface -func (dc *DefaultContext) Get(prop string) (interface{}, bool) { +func (dc *DefaultContext) Get(prop string) (any, bool) { v, ok := dc.properties[prop] return v, ok } diff --git a/src/jobservice/job/impl/gc/garbage_collection.go b/src/jobservice/job/impl/gc/garbage_collection.go index eabe9e80eb4..9b6cfd3cc5f 100644 --- a/src/jobservice/job/impl/gc/garbage_collection.go +++ b/src/jobservice/job/impl/gc/garbage_collection.go @@ -536,7 +536,7 @@ func (gc *GarbageCollector) deletedArt(ctx job.Context) (map[string][]model.Arti // handle the optional ones, and the artifact controller will move them into trash. if gc.deleteUntagged { untaggedArts, err := gc.artCtl.List(ctx.SystemContext(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Tags": "nil", }, }, &artifact.Option{WithAccessory: true}) @@ -639,7 +639,7 @@ func (gc *GarbageCollector) markOrSweepUntaggedBlobs(ctx job.Context) ([]*blobMo Min: lastBlobID, } query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "update_time": &timeRG, "projectID": p.ProjectID, "id": &blobRG, diff --git a/src/jobservice/job/impl/gc/garbage_collection_test.go b/src/jobservice/job/impl/gc/garbage_collection_test.go index 5aacd737e7d..b9446b7a705 100644 --- a/src/jobservice/job/impl/gc/garbage_collection_test.go +++ b/src/jobservice/job/impl/gc/garbage_collection_test.go @@ -157,7 +157,7 @@ func (suite *gcTestSuite) TestInit() { gc := &GarbageCollector{ registryCtlClient: suite.registryCtlClient, } - params := map[string]interface{}{ + params := map[string]any{ "delete_untagged": true, "redis_url_reg": "redis url", "time_window": 1, @@ -169,21 +169,21 @@ func (suite *gcTestSuite) TestInit() { suite.True(gc.deleteUntagged) suite.Equal(3, gc.workers) - params = map[string]interface{}{ + params = map[string]any{ "delete_untagged": "unsupported", "redis_url_reg": "redis url", } suite.Nil(gc.init(ctx, params)) suite.True(gc.deleteUntagged) - params = map[string]interface{}{ + params = map[string]any{ "delete_untagged": false, "redis_url_reg": "redis url", } suite.Nil(gc.init(ctx, params)) suite.False(gc.deleteUntagged) - params = map[string]interface{}{ + params = map[string]any{ "redis_url_reg": "redis url", } suite.Nil(gc.init(ctx, params)) @@ -281,7 +281,7 @@ func (suite *gcTestSuite) TestRun() { blobMgr: suite.blobMgr, registryCtlClient: suite.registryCtlClient, } - params := map[string]interface{}{ + params := map[string]any{ "delete_untagged": false, "redis_url_reg": tests.GetRedisURL(), "time_window": 1, diff --git a/src/jobservice/job/impl/notification/slack_job.go b/src/jobservice/job/impl/notification/slack_job.go index d8fd4b91517..ba4b970b942 100644 --- a/src/jobservice/job/impl/notification/slack_job.go +++ b/src/jobservice/job/impl/notification/slack_job.go @@ -106,7 +106,7 @@ func (sj *SlackJob) Run(ctx job.Context, params job.Parameters) error { } // init slack job -func (sj *SlackJob) init(ctx job.Context, params map[string]interface{}) error { +func (sj *SlackJob) init(ctx job.Context, params map[string]any) error { sj.logger = ctx.GetLogger() // default use secure transport @@ -121,7 +121,7 @@ func (sj *SlackJob) init(ctx job.Context, params map[string]interface{}) error { } // execute slack job -func (sj *SlackJob) execute(params map[string]interface{}) error { +func (sj *SlackJob) execute(params map[string]any) error { payload := params["payload"].(string) address := params["address"].(string) diff --git a/src/jobservice/job/impl/notification/slack_job_test.go b/src/jobservice/job/impl/notification/slack_job_test.go index 883a2b064e4..cfb7c192fc7 100644 --- a/src/jobservice/job/impl/notification/slack_job_test.go +++ b/src/jobservice/job/impl/notification/slack_job_test.go @@ -64,7 +64,7 @@ func TestSlackJobRun(t *testing.T) { assert.Equal(t, string(body), `{"key": "value"}`) })) defer ts.Close() - params := map[string]interface{}{ + params := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": ts.URL, @@ -77,7 +77,7 @@ func TestSlackJobRun(t *testing.T) { w.WriteHeader(http.StatusUnauthorized) })) defer tsWrong.Close() - paramsWrong := map[string]interface{}{ + paramsWrong := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": tsWrong.URL, diff --git a/src/jobservice/job/impl/notification/webhook_job.go b/src/jobservice/job/impl/notification/webhook_job.go index fec8d0eb96f..32dc0c2cc48 100644 --- a/src/jobservice/job/impl/notification/webhook_job.go +++ b/src/jobservice/job/impl/notification/webhook_job.go @@ -82,7 +82,7 @@ func (wj *WebhookJob) Run(ctx job.Context, params job.Parameters) error { } // init webhook job -func (wj *WebhookJob) init(ctx job.Context, params map[string]interface{}) error { +func (wj *WebhookJob) init(ctx job.Context, params map[string]any) error { wj.logger = ctx.GetLogger() wj.ctx = ctx @@ -98,7 +98,7 @@ func (wj *WebhookJob) init(ctx job.Context, params map[string]interface{}) error } // execute webhook job -func (wj *WebhookJob) execute(_ job.Context, params map[string]interface{}) error { +func (wj *WebhookJob) execute(_ job.Context, params map[string]any) error { payload := params["payload"].(string) address := params["address"].(string) diff --git a/src/jobservice/job/impl/notification/webhook_job_test.go b/src/jobservice/job/impl/notification/webhook_job_test.go index 27296124cf0..bc20b3c43ea 100644 --- a/src/jobservice/job/impl/notification/webhook_job_test.go +++ b/src/jobservice/job/impl/notification/webhook_job_test.go @@ -59,7 +59,7 @@ func TestRun(t *testing.T) { assert.Equal(t, string(body), `{"key": "value"}`) })) defer ts.Close() - params := map[string]interface{}{ + params := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": ts.URL, @@ -73,7 +73,7 @@ func TestRun(t *testing.T) { w.WriteHeader(http.StatusUnauthorized) })) defer tsWrong.Close() - paramsWrong := map[string]interface{}{ + paramsWrong := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": tsWrong.URL, diff --git a/src/jobservice/job/impl/replication/replication.go b/src/jobservice/job/impl/replication/replication.go index 453fa5e032b..2ef364df959 100644 --- a/src/jobservice/job/impl/replication/replication.go +++ b/src/jobservice/job/impl/replication/replication.go @@ -112,7 +112,7 @@ func (r *Replication) Run(ctx job.Context, params job.Parameters) error { return trans.Transfer(src, dst, opts) } -func parseParams(params map[string]interface{}) (*model.Resource, *model.Resource, *transfer.Options, error) { +func parseParams(params map[string]any) (*model.Resource, *model.Resource, *transfer.Options, error) { src := &model.Resource{} if err := parseParam(params, "src_resource", src); err != nil { return nil, nil, nil, err @@ -158,7 +158,7 @@ func parseParams(params map[string]interface{}) (*model.Resource, *model.Resourc return src, dst, opts, nil } -func parseParam(params map[string]interface{}, name string, v interface{}) error { +func parseParam(params map[string]any, name string, v any) error { value, exist := params[name] if !exist { return fmt.Errorf("param %s not found", name) diff --git a/src/jobservice/job/impl/replication/replication_test.go b/src/jobservice/job/impl/replication/replication_test.go index 90e472e53d6..f43f041d0d7 100644 --- a/src/jobservice/job/impl/replication/replication_test.go +++ b/src/jobservice/job/impl/replication/replication_test.go @@ -26,7 +26,7 @@ import ( ) func TestParseParam(t *testing.T) { - params := map[string]interface{}{} + params := map[string]any{} // not exist param err := parseParam(params, "not_exist_param", nil) assert.NotNil(t, err) @@ -80,7 +80,7 @@ func (f *fakedTransfer) Transfer(src *model.Resource, dst *model.Resource, opts func TestRun(t *testing.T) { err := transfer.RegisterFactory("art", fakedTransferFactory) require.Nil(t, err) - params := map[string]interface{}{ + params := map[string]any{ "src_resource": `{"type":"art"}`, "dst_resource": `{}`, } diff --git a/src/jobservice/job/impl/scandataexport/scan_data_export.go b/src/jobservice/job/impl/scandataexport/scan_data_export.go index 59f84d6c9cd..14b1e7c901d 100644 --- a/src/jobservice/job/impl/scandataexport/scan_data_export.go +++ b/src/jobservice/job/impl/scandataexport/scan_data_export.go @@ -79,7 +79,7 @@ func (sde *ScanDataExport) Validate(_ job.Parameters) error { // The related arguments will be injected by the workerpool. // // ctx Context : Job execution context. -// params map[string]interface{} : parameters with key-pair style for the job execution. +// params map[string]any : parameters with key-pair style for the job execution. // // Returns: // @@ -127,7 +127,7 @@ func (sde *ScanDataExport) Run(ctx job.Context, params job.Parameters) error { logger.Infof("Export Job Id = %s. CSV file size: %d", params[export.JobID], stat.Size()) // earlier return and update status message if the file size is 0, unnecessary to push a empty system artifact. if stat.Size() == 0 { - extra := map[string]interface{}{ + extra := map[string]any{ export.StatusMessageAttribute: "No vulnerabilities found or matched", } updateErr := sde.updateExecAttributes(ctx, params, extra) @@ -148,7 +148,7 @@ func (sde *ScanDataExport) Run(ctx job.Context, params job.Parameters) error { } logger.Infof("Export Job Id = %s. Created system artifact: %v for report file %s to persistent storage: %v", params[export.JobID], artID, fileName, err) - err = sde.updateExecAttributes(ctx, params, map[string]interface{}{export.DigestKey: hash.String()}) + err = sde.updateExecAttributes(ctx, params, map[string]any{export.DigestKey: hash.String()}) if err != nil { logger.Errorf("Export Job Id = %s. Error when updating execution record : %v", params[export.JobID], err) return err @@ -158,7 +158,7 @@ func (sde *ScanDataExport) Run(ctx job.Context, params job.Parameters) error { return nil } -func (sde *ScanDataExport) updateExecAttributes(ctx job.Context, params job.Parameters, attrs map[string]interface{}) error { +func (sde *ScanDataExport) updateExecAttributes(ctx job.Context, params job.Parameters, attrs map[string]any) error { logger := ctx.GetLogger() execID, err := strconv.ParseInt(params[export.JobID].(string), 10, 64) if err != nil { @@ -295,7 +295,7 @@ func (sde *ScanDataExport) writeCsvFile(ctx job.Context, params job.Parameters, } func (sde *ScanDataExport) extractCriteria(params job.Parameters) (*export.Request, error) { - filterMap, ok := params[export.JobRequest].(map[string]interface{}) + filterMap, ok := params[export.JobRequest].(map[string]any) if !ok { return nil, errors.Errorf("malformed criteria '%v'", params[export.JobRequest]) } diff --git a/src/jobservice/job/impl/scandataexport/scan_data_export_test.go b/src/jobservice/job/impl/scandataexport/scan_data_export_test.go index 60e31dd3c59..df45dd47062 100644 --- a/src/jobservice/job/impl/scandataexport/scan_data_export_test.go +++ b/src/jobservice/job/impl/scandataexport/scan_data_export_test.go @@ -80,7 +80,7 @@ func (suite *ScanDataExportJobTestSuite) TestRun() { mock.OnAnything(suite.filterProcessor, "ProcessTagFilter").Return([]*artifact.Artifact{{Artifact: artpkg.Artifact{ID: 1}}}, nil).Once() mock.OnAnything(suite.filterProcessor, "ProcessLabelFilter").Return([]*artifact.Artifact{{Artifact: artpkg.Artifact{ID: 1}}}, nil).Once() - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil) @@ -88,7 +88,7 @@ func (suite *ScanDataExportJobTestSuite) TestRun() { params := job.Parameters{} params[export.JobModeKey] = export.JobModeExport params["JobId"] = JobId - params["Request"] = map[string]interface{}{ + params["Request"] = map[string]any{ "projects": []int64{1}, } ctx := &mockjobservice.MockJobContext{} @@ -100,11 +100,11 @@ func (suite *ScanDataExportJobTestSuite) TestRun() { }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok && attrsMap[export.JobNameAttribute] == "test-job" && attrsMap[export.UserNameAttribute] == "test-user" }) @@ -119,7 +119,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithEmptyData() { mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil) @@ -132,7 +132,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithEmptyData() { err := suite.job.Run(ctx, params) suite.NoError(err) - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { return attrsMap["status_message"] == "No vulnerabilities found or matched" && attrsMap[export.JobNameAttribute] == "test-job" && attrsMap[export.UserNameAttribute] == "test-user" }) suite.execMgr.AssertCalled(suite.T(), "UpdateExtraAttrs", mock.Anything, ExecID, extraAttrsMatcher) @@ -147,7 +147,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunAttributeUpdateError() { mock.OnAnything(suite.filterProcessor, "ProcessLabelFilter").Return([]*artifact.Artifact{{Artifact: artpkg.Artifact{ID: 1}}}, nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(nil, errors.New("test-error")) @@ -155,7 +155,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunAttributeUpdateError() { params := job.Parameters{} params[export.JobModeKey] = export.JobModeExport params["JobId"] = JobId - params["Request"] = map[string]interface{}{ + params["Request"] = map[string]any{ "projects": []int{1}, } ctx := &mockjobservice.MockJobContext{} @@ -167,11 +167,11 @@ func (suite *ScanDataExportJobTestSuite) TestRunAttributeUpdateError() { }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok && attrsMap[export.JobNameAttribute] == "test-job" && attrsMap[export.UserNameAttribute] == "test-user" }) @@ -189,7 +189,7 @@ func (suite *ScanDataExportJobTestSuite) TestExtractCriteria() { _, err = suite.job.extractCriteria(job.Parameters{"Request": ""}) suite.Error(err) // valid request should not return error and trim space - c, err := suite.job.extractCriteria(job.Parameters{"Request": map[string]interface{}{ + c, err := suite.job.extractCriteria(job.Parameters{"Request": map[string]any{ "CVEIds": "CVE-123, CVE-456 ", "Repositories": " test-repo1 ", "Tags": "test-tag1, test-tag2", @@ -207,7 +207,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -225,7 +225,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -243,11 +243,11 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok }) @@ -271,7 +271,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -287,7 +287,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { Projects: []int64{1}, Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -304,11 +304,11 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { return sa.Repository == "scandata_export_1000000" && sa.Vendor == strings.ToLower(export.Vendor) && sa.Digest == MockDigest }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok }) @@ -334,7 +334,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -349,7 +349,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -384,7 +384,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -399,7 +399,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -436,7 +436,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -451,7 +451,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -486,7 +486,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -501,7 +501,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} diff --git a/src/jobservice/job/interface.go b/src/jobservice/job/interface.go index 6ea1bdad474..37e1edb2bec 100644 --- a/src/jobservice/job/interface.go +++ b/src/jobservice/job/interface.go @@ -45,7 +45,7 @@ type Interface interface { // The related arguments will be injected by the workerpool. // // ctx Context : Job execution context. - // params map[string]interface{} : parameters with key-pair style for the job execution. + // params map[string]any : parameters with key-pair style for the job execution. // // Returns: // error if failed to run. NOTES: If job is stopped or cancelled, a specified error should be returned diff --git a/src/jobservice/job/models.go b/src/jobservice/job/models.go index 2cd2eb0bc4c..ac633986af3 100644 --- a/src/jobservice/job/models.go +++ b/src/jobservice/job/models.go @@ -24,7 +24,7 @@ import ( ) // Parameters for job execution. -type Parameters map[string]interface{} +type Parameters map[string]any // Request is the request of launching a job. type Request struct { diff --git a/src/jobservice/job/status_test.go b/src/jobservice/job/status_test.go index 22254488397..94f4063a490 100644 --- a/src/jobservice/job/status_test.go +++ b/src/jobservice/job/status_test.go @@ -291,14 +291,14 @@ func TestStatus_Validate(t *testing.T) { { name: "Error status checksum failure", s: Status("error"), - wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + wantErr: func(t assert.TestingT, err error, i ...any) bool { return false }, }, { name: "SuccessStatus check success", s: SuccessStatus, - wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + wantErr: func(t assert.TestingT, err error, i ...any) bool { return true }, }, diff --git a/src/jobservice/job/tracker.go b/src/jobservice/job/tracker.go index c2eeddd4151..7de01e19356 100644 --- a/src/jobservice/job/tracker.go +++ b/src/jobservice/job/tracker.go @@ -61,11 +61,11 @@ type Tracker interface { // Update the properties of the job stats // - // fieldAndValues ...interface{} : One or more properties being updated + // fieldAndValues ...any : One or more properties being updated // // Returns: // error if update failed - Update(fieldAndValues ...interface{}) error + Update(fieldAndValues ...any) error // NumericID returns the numeric ID of periodic job. // Please pay attention, this only for periodic job. @@ -164,7 +164,7 @@ func (bt *basicTracker) Job() *Stats { } // Update the properties of the job stats -func (bt *basicTracker) Update(fieldAndValues ...interface{}) error { +func (bt *basicTracker) Update(fieldAndValues ...any) error { if len(fieldAndValues) == 0 { return errors.New("no properties specified to update") } @@ -175,7 +175,7 @@ func (bt *basicTracker) Update(fieldAndValues ...interface{}) error { }() key := rds.KeyJobStats(bt.namespace, bt.jobID) - args := []interface{}{"update_time", time.Now().Unix()} // update timestamp + args := []any{"update_time", time.Now().Unix()} // update timestamp args = append(args, fieldAndValues...) return rds.HmSet(conn, key, args...) @@ -215,7 +215,7 @@ func (bt *basicTracker) PeriodicExecutionDone() error { _ = conn.Close() }() - args := []interface{}{key, "XX", -1, bt.jobID} + args := []any{key, "XX", -1, bt.jobID} _, err := conn.Do("ZADD", args...) return err @@ -302,7 +302,7 @@ func (bt *basicTracker) Save() (err error) { stats := bt.jobStats key := rds.KeyJobStats(bt.namespace, stats.Info.JobID) - args := make([]interface{}, 0) + args := make([]any, 0) args = append(args, key) args = append(args, "id", stats.Info.JobID, @@ -362,7 +362,7 @@ func (bt *basicTracker) Save() (err error) { // Link with its upstream job if upstream job ID exists for future querying if !utils.IsEmptyStr(stats.Info.UpstreamJobID) { k := rds.KeyUpstreamJobAndExecutions(bt.namespace, stats.Info.UpstreamJobID) - zargs := []interface{}{k, "NX", stats.Info.RunAt, stats.Info.JobID} + zargs := []any{k, "NX", stats.Info.RunAt, stats.Info.JobID} err = conn.Send("ZADD", zargs...) } diff --git a/src/jobservice/lcm/controller.go b/src/jobservice/lcm/controller.go index 0045772e041..9661d44777d 100644 --- a/src/jobservice/lcm/controller.go +++ b/src/jobservice/lcm/controller.go @@ -154,7 +154,7 @@ func (bc *basicController) retryLoop() { }() // Check the list - bc.retryList.Iterate(func(ele interface{}) bool { + bc.retryList.Iterate(func(ele any) bool { if change, ok := ele.(job.SimpleStatusChange); ok { err := retry(conn, bc.namespace, change) if err != nil { diff --git a/src/jobservice/logger/backend/db_logger.go b/src/jobservice/logger/backend/db_logger.go index 3778e6ba4da..162c565c131 100644 --- a/src/jobservice/logger/backend/db_logger.go +++ b/src/jobservice/logger/backend/db_logger.go @@ -71,51 +71,51 @@ func (dbl *DBLogger) Close() error { } // Debug ... -func (dbl *DBLogger) Debug(v ...interface{}) { +func (dbl *DBLogger) Debug(v ...any) { dbl.backendLogger.Debug(v...) } // Debugf with format -func (dbl *DBLogger) Debugf(format string, v ...interface{}) { +func (dbl *DBLogger) Debugf(format string, v ...any) { dbl.backendLogger.Debugf(format, v...) } // Info ... -func (dbl *DBLogger) Info(v ...interface{}) { +func (dbl *DBLogger) Info(v ...any) { dbl.backendLogger.Info(v...) } // Infof with format -func (dbl *DBLogger) Infof(format string, v ...interface{}) { +func (dbl *DBLogger) Infof(format string, v ...any) { dbl.backendLogger.Infof(format, v...) } // Warning ... -func (dbl *DBLogger) Warning(v ...interface{}) { +func (dbl *DBLogger) Warning(v ...any) { dbl.backendLogger.Warning(v...) } // Warningf with format -func (dbl *DBLogger) Warningf(format string, v ...interface{}) { +func (dbl *DBLogger) Warningf(format string, v ...any) { dbl.backendLogger.Warningf(format, v...) } // Error ... -func (dbl *DBLogger) Error(v ...interface{}) { +func (dbl *DBLogger) Error(v ...any) { dbl.backendLogger.Error(v...) } // Errorf with format -func (dbl *DBLogger) Errorf(format string, v ...interface{}) { +func (dbl *DBLogger) Errorf(format string, v ...any) { dbl.backendLogger.Errorf(format, v...) } // Fatal error -func (dbl *DBLogger) Fatal(v ...interface{}) { +func (dbl *DBLogger) Fatal(v ...any) { dbl.backendLogger.Fatal(v...) } // Fatalf error -func (dbl *DBLogger) Fatalf(format string, v ...interface{}) { +func (dbl *DBLogger) Fatalf(format string, v ...any) { dbl.backendLogger.Fatalf(format, v...) } diff --git a/src/jobservice/logger/backend/file_logger.go b/src/jobservice/logger/backend/file_logger.go index bdfcebb5508..af9cd9601ce 100644 --- a/src/jobservice/logger/backend/file_logger.go +++ b/src/jobservice/logger/backend/file_logger.go @@ -54,51 +54,51 @@ func (fl *FileLogger) Close() error { } // Debug ... -func (fl *FileLogger) Debug(v ...interface{}) { +func (fl *FileLogger) Debug(v ...any) { fl.backendLogger.Debug(v...) } // Debugf with format -func (fl *FileLogger) Debugf(format string, v ...interface{}) { +func (fl *FileLogger) Debugf(format string, v ...any) { fl.backendLogger.Debugf(format, v...) } // Info ... -func (fl *FileLogger) Info(v ...interface{}) { +func (fl *FileLogger) Info(v ...any) { fl.backendLogger.Info(v...) } // Infof with format -func (fl *FileLogger) Infof(format string, v ...interface{}) { +func (fl *FileLogger) Infof(format string, v ...any) { fl.backendLogger.Infof(format, v...) } // Warning ... -func (fl *FileLogger) Warning(v ...interface{}) { +func (fl *FileLogger) Warning(v ...any) { fl.backendLogger.Warning(v...) } // Warningf with format -func (fl *FileLogger) Warningf(format string, v ...interface{}) { +func (fl *FileLogger) Warningf(format string, v ...any) { fl.backendLogger.Warningf(format, v...) } // Error ... -func (fl *FileLogger) Error(v ...interface{}) { +func (fl *FileLogger) Error(v ...any) { fl.backendLogger.Error(v...) } // Errorf with format -func (fl *FileLogger) Errorf(format string, v ...interface{}) { +func (fl *FileLogger) Errorf(format string, v ...any) { fl.backendLogger.Errorf(format, v...) } // Fatal error -func (fl *FileLogger) Fatal(v ...interface{}) { +func (fl *FileLogger) Fatal(v ...any) { fl.backendLogger.Fatal(v...) } // Fatalf error -func (fl *FileLogger) Fatalf(format string, v ...interface{}) { +func (fl *FileLogger) Fatalf(format string, v ...any) { fl.backendLogger.Fatalf(format, v...) } diff --git a/src/jobservice/logger/backend/std_logger.go b/src/jobservice/logger/backend/std_logger.go index bbcc1eca49d..6a631b83155 100644 --- a/src/jobservice/logger/backend/std_logger.go +++ b/src/jobservice/logger/backend/std_logger.go @@ -48,51 +48,51 @@ func NewStdOutputLogger(level string, output string, depth int) *StdOutputLogger } // Debug ... -func (sl *StdOutputLogger) Debug(v ...interface{}) { +func (sl *StdOutputLogger) Debug(v ...any) { sl.backendLogger.Debug(v...) } // Debugf with format -func (sl *StdOutputLogger) Debugf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Debugf(format string, v ...any) { sl.backendLogger.Debugf(format, v...) } // Info ... -func (sl *StdOutputLogger) Info(v ...interface{}) { +func (sl *StdOutputLogger) Info(v ...any) { sl.backendLogger.Info(v...) } // Infof with format -func (sl *StdOutputLogger) Infof(format string, v ...interface{}) { +func (sl *StdOutputLogger) Infof(format string, v ...any) { sl.backendLogger.Infof(format, v...) } // Warning ... -func (sl *StdOutputLogger) Warning(v ...interface{}) { +func (sl *StdOutputLogger) Warning(v ...any) { sl.backendLogger.Warning(v...) } // Warningf with format -func (sl *StdOutputLogger) Warningf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Warningf(format string, v ...any) { sl.backendLogger.Warningf(format, v...) } // Error ... -func (sl *StdOutputLogger) Error(v ...interface{}) { +func (sl *StdOutputLogger) Error(v ...any) { sl.backendLogger.Error(v...) } // Errorf with format -func (sl *StdOutputLogger) Errorf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Errorf(format string, v ...any) { sl.backendLogger.Errorf(format, v...) } // Fatal error -func (sl *StdOutputLogger) Fatal(v ...interface{}) { +func (sl *StdOutputLogger) Fatal(v ...any) { sl.backendLogger.Fatal(v...) } // Fatalf error -func (sl *StdOutputLogger) Fatalf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Fatalf(format string, v ...any) { sl.backendLogger.Fatalf(format, v...) } diff --git a/src/jobservice/logger/base.go b/src/jobservice/logger/base.go index 040a435a97f..62be729af5e 100644 --- a/src/jobservice/logger/base.go +++ b/src/jobservice/logger/base.go @@ -71,7 +71,7 @@ func GetLogger(loggerOptions ...Option) (Interface, error) { // Singleton if d.Singleton { - var li interface{} + var li any li, ok = singletons.Load(name) if ok { l = li.(Interface) @@ -200,7 +200,7 @@ func Init(ctx context.Context) error { // For logger of job service itself, the depth should be 6 if lc.Name == NameFile || lc.Name == NameStdOutput { if lc.Settings == nil { - lc.Settings = map[string]interface{}{} + lc.Settings = map[string]any{} } lc.Settings["depth"] = 6 } diff --git a/src/jobservice/logger/base_test.go b/src/jobservice/logger/base_test.go index fd9ddf2895c..52813a51d08 100644 --- a/src/jobservice/logger/base_test.go +++ b/src/jobservice/logger/base_test.go @@ -27,7 +27,7 @@ func TestGetLoggerSingleStd(t *testing.T) { l.Debugf("Verify logger testing: %s", "case_1") - lSettings := map[string]interface{}{} + lSettings := map[string]any{} lSettings["output"] = backend.StdErr l, err = GetLogger(BackendOption("STD_OUTPUT", "ERROR", lSettings)) if err != nil { @@ -52,7 +52,7 @@ func TestGetLoggerSingleFile(t *testing.T) { t.Fatalf("expect non nil error when creating file logger with empty settings but got nil error: %s", "case_4") } - lSettings := map[string]interface{}{} + lSettings := map[string]any{} lSettings["base_dir"] = os.TempDir() lSettings["filename"] = fmt.Sprintf("%s.log", fakeJobID) defer func() { @@ -71,7 +71,7 @@ func TestGetLoggerSingleFile(t *testing.T) { // Test getting multi loggers func TestGetLoggersMulti(t *testing.T) { - lSettings := map[string]interface{}{} + lSettings := map[string]any{} lSettings["base_dir"] = os.TempDir() lSettings["filename"] = fmt.Sprintf("%s.log", fakeJobID2) defer func() { @@ -110,7 +110,7 @@ func TestGetSweeper(t *testing.T) { t.Fatalf("expect non nil error but got nil error when getting sweeper with name 'STD_OUTPUT': %s", "case_8") } - sSettings := map[string]interface{}{} + sSettings := map[string]any{} sSettings["work_dir"] = os.TempDir() s, err := GetSweeper(ctx, SweeperOption("FILE", 5, sSettings)) if err != nil { @@ -136,7 +136,7 @@ func TestGetGetter(t *testing.T) { t.Fatalf("nil interface with nil error should be returned if no log data getter configured: %s", "case_11") } - lSettings := map[string]interface{}{} + lSettings := map[string]any{} _, err = GetLogDataGetter(GetterOption("FILE", lSettings)) if err == nil { t.Fatalf("expect non nil error but got nil one: %s", "case_12") @@ -184,19 +184,19 @@ func TestLoggerInit(t *testing.T) { { Name: "STD_OUTPUT", Level: "DEBUG", - Settings: map[string]interface{}{ + Settings: map[string]any{ "output": backend.StdErr, }, }, { Name: "FILE", Level: "ERROR", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 5, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/logger/entry.go b/src/jobservice/logger/entry.go index c1f24ff315e..28b18c49a0f 100644 --- a/src/jobservice/logger/entry.go +++ b/src/jobservice/logger/entry.go @@ -33,70 +33,70 @@ func NewEntry(loggers []Interface) *Entry { } // Debug ... -func (e *Entry) Debug(v ...interface{}) { +func (e *Entry) Debug(v ...any) { for _, l := range e.loggers { l.Debug(v...) } } // Debugf with format -func (e *Entry) Debugf(format string, v ...interface{}) { +func (e *Entry) Debugf(format string, v ...any) { for _, l := range e.loggers { l.Debugf(format, v...) } } // Info ... -func (e *Entry) Info(v ...interface{}) { +func (e *Entry) Info(v ...any) { for _, l := range e.loggers { l.Info(v...) } } // Infof with format -func (e *Entry) Infof(format string, v ...interface{}) { +func (e *Entry) Infof(format string, v ...any) { for _, l := range e.loggers { l.Infof(format, v...) } } // Warning ... -func (e *Entry) Warning(v ...interface{}) { +func (e *Entry) Warning(v ...any) { for _, l := range e.loggers { l.Warning(v...) } } // Warningf with format -func (e *Entry) Warningf(format string, v ...interface{}) { +func (e *Entry) Warningf(format string, v ...any) { for _, l := range e.loggers { l.Warningf(format, v...) } } // Error ... -func (e *Entry) Error(v ...interface{}) { +func (e *Entry) Error(v ...any) { for _, l := range e.loggers { l.Error(v...) } } // Errorf with format -func (e *Entry) Errorf(format string, v ...interface{}) { +func (e *Entry) Errorf(format string, v ...any) { for _, l := range e.loggers { l.Errorf(format, v...) } } // Fatal error -func (e *Entry) Fatal(v ...interface{}) { +func (e *Entry) Fatal(v ...any) { for _, l := range e.loggers { l.Fatal(v...) } } // Fatalf error -func (e *Entry) Fatalf(format string, v ...interface{}) { +func (e *Entry) Fatalf(format string, v ...any) { for _, l := range e.loggers { l.Fatalf(format, v...) } diff --git a/src/jobservice/logger/interface.go b/src/jobservice/logger/interface.go index 489db269c31..efc86767187 100644 --- a/src/jobservice/logger/interface.go +++ b/src/jobservice/logger/interface.go @@ -17,32 +17,32 @@ package logger // Interface for logger. type Interface interface { // For debuging - Debug(v ...interface{}) + Debug(v ...any) // For debuging with format - Debugf(format string, v ...interface{}) + Debugf(format string, v ...any) // For logging info - Info(v ...interface{}) + Info(v ...any) // For logging info with format - Infof(format string, v ...interface{}) + Infof(format string, v ...any) // For warning - Warning(v ...interface{}) + Warning(v ...any) // For warning with format - Warningf(format string, v ...interface{}) + Warningf(format string, v ...any) // For logging error - Error(v ...interface{}) + Error(v ...any) // For logging error with format - Errorf(format string, v ...interface{}) + Errorf(format string, v ...any) // For fatal error - Fatal(v ...interface{}) + Fatal(v ...any) // For fatal error with error - Fatalf(format string, v ...interface{}) + Fatalf(format string, v ...any) } diff --git a/src/jobservice/logger/log_data_handler_test.go b/src/jobservice/logger/log_data_handler_test.go index 93665aa0623..0c794815cc6 100644 --- a/src/jobservice/logger/log_data_handler_test.go +++ b/src/jobservice/logger/log_data_handler_test.go @@ -33,12 +33,12 @@ func TestRetrieve(t *testing.T) { { Name: "FILE", Level: "INFO", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 1, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/logger/options.go b/src/jobservice/logger/options.go index e11c1ac29c7..6c2f180e8a4 100644 --- a/src/jobservice/logger/options.go +++ b/src/jobservice/logger/options.go @@ -27,7 +27,7 @@ type Option struct { } // BackendOption creates option for the specified backend. -func BackendOption(name string, level string, settings map[string]interface{}) Option { +func BackendOption(name string, level string, settings map[string]any) Option { return Option{func(op *options) { vals := make([]OptionItem, 0) vals = append(vals, OptionItem{"level", level}) @@ -45,7 +45,7 @@ func BackendOption(name string, level string, settings map[string]interface{}) O } // SweeperOption creates option for the sweeper. -func SweeperOption(name string, duration int, settings map[string]interface{}) Option { +func SweeperOption(name string, duration int, settings map[string]any) Option { return Option{func(op *options) { vals := make([]OptionItem, 0) vals = append(vals, OptionItem{"duration", duration}) @@ -63,7 +63,7 @@ func SweeperOption(name string, duration int, settings map[string]interface{}) O } // GetterOption creates option for the getter. -func GetterOption(name string, settings map[string]interface{}) Option { +func GetterOption(name string, settings map[string]any) Option { return Option{func(op *options) { vals := make([]OptionItem, 0) // Append settings if existing @@ -81,7 +81,7 @@ func GetterOption(name string, settings map[string]interface{}) Option { // OptionItem is a simple wrapper of property and value type OptionItem struct { field string - val interface{} + val any } // Field returns name of the option @@ -108,6 +108,6 @@ func (o *OptionItem) String() string { } // Raw returns the raw value -func (o *OptionItem) Raw() interface{} { +func (o *OptionItem) Raw() any { return o.val } diff --git a/src/jobservice/logger/service.go b/src/jobservice/logger/service.go index e194ad90bd7..17dbf6959eb 100644 --- a/src/jobservice/logger/service.go +++ b/src/jobservice/logger/service.go @@ -29,7 +29,7 @@ func jobServiceLogger() (Interface, bool) { } // Debug ... -func Debug(v ...interface{}) { +func Debug(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Debug(v...) } else { @@ -38,7 +38,7 @@ func Debug(v ...interface{}) { } // Debugf for debuging with format -func Debugf(format string, v ...interface{}) { +func Debugf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Debugf(format, v...) } else { @@ -47,7 +47,7 @@ func Debugf(format string, v ...interface{}) { } // Info ... -func Info(v ...interface{}) { +func Info(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Info(v...) } else { @@ -56,7 +56,7 @@ func Info(v ...interface{}) { } // Infof for logging info with format -func Infof(format string, v ...interface{}) { +func Infof(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Infof(format, v...) } else { @@ -65,7 +65,7 @@ func Infof(format string, v ...interface{}) { } // Warning ... -func Warning(v ...interface{}) { +func Warning(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Warning(v...) } else { @@ -74,7 +74,7 @@ func Warning(v ...interface{}) { } // Warningf for warning with format -func Warningf(format string, v ...interface{}) { +func Warningf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Warningf(format, v...) } else { @@ -83,7 +83,7 @@ func Warningf(format string, v ...interface{}) { } // Error for logging error -func Error(v ...interface{}) { +func Error(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Error(v...) } else { @@ -92,7 +92,7 @@ func Error(v ...interface{}) { } // Errorf for logging error with format -func Errorf(format string, v ...interface{}) { +func Errorf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Errorf(format, v...) } else { @@ -101,7 +101,7 @@ func Errorf(format string, v ...interface{}) { } // Fatal ... -func Fatal(v ...interface{}) { +func Fatal(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Fatal(v...) } else { @@ -110,7 +110,7 @@ func Fatal(v ...interface{}) { } // Fatalf for fatal error with error -func Fatalf(format string, v ...interface{}) { +func Fatalf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Fatalf(format, v...) } else { diff --git a/src/jobservice/mgt/manager.go b/src/jobservice/mgt/manager.go index 1ab54a25d12..a3bfdde25a7 100644 --- a/src/jobservice/mgt/manager.go +++ b/src/jobservice/mgt/manager.go @@ -129,7 +129,7 @@ func (bm *basicManager) GetJobs(q *query.Parameter) ([]*job.Stats, int64, error) } pattern := rds.KeyJobStats(bm.namespace, "*") - args := []interface{}{cursor, "MATCH", pattern, "COUNT", count} + args := []any{cursor, "MATCH", pattern, "COUNT", count} conn := bm.pool.Get() defer func() { @@ -148,7 +148,7 @@ func (bm *basicManager) GetJobs(q *query.Parameter) ([]*job.Stats, int64, error) if err != nil { return nil, 0, err } - list := values[1].([]interface{}) + list := values[1].([]any) results := make([]*job.Stats, 0) for _, v := range list { @@ -227,7 +227,7 @@ func (bm *basicManager) GetPeriodicExecution(pID string, q *query.Parameter) (re } minVal, maxVal := (pageNumber-1)*pageSize, pageNumber*pageSize-1 - args := []interface{}{key, minVal, maxVal} + args := []any{key, minVal, maxVal} list, err := redis.Values(conn.Do("ZREVRANGE", args...)) if err != nil { return nil, 0, err @@ -334,7 +334,7 @@ func queryExecutions(conn redis.Conn, dataKey string, q *query.Parameter) ([]str } offset := (pageNumber - 1) * pageSize - args := []interface{}{dataKey, "+inf", 0, "LIMIT", offset, pageSize} + args := []any{dataKey, "+inf", 0, "LIMIT", offset, pageSize} eIDs, err := redis.Values(conn.Do("ZREVRANGEBYSCORE", args...)) if err != nil { diff --git a/src/jobservice/mgt/manager_test.go b/src/jobservice/mgt/manager_test.go index 0f67f1adc52..10e705c8e23 100644 --- a/src/jobservice/mgt/manager_test.go +++ b/src/jobservice/mgt/manager_test.go @@ -138,7 +138,7 @@ func (suite *BasicManagerTestSuite) TestGetPeriodicExecutions() { // TestGetScheduledJobs tests get scheduled jobs func (suite *BasicManagerTestSuite) TestGetScheduledJobs() { enqueuer := work.NewEnqueuer(suite.namespace, suite.pool) - scheduledJob, err := enqueuer.EnqueueIn(job.SampleJob, 1000, make(map[string]interface{})) + scheduledJob, err := enqueuer.EnqueueIn(job.SampleJob, 1000, make(map[string]any)) require.NoError(suite.T(), err) stats := &job.Stats{ Info: &job.StatsInfo{ diff --git a/src/jobservice/migration/manager_test.go b/src/jobservice/migration/manager_test.go index 62021786b2b..3517ea2b734 100644 --- a/src/jobservice/migration/manager_test.go +++ b/src/jobservice/migration/manager_test.go @@ -69,7 +69,7 @@ func (suite *ManagerTestSuite) SetupTest() { id := utils.MakeIdentifier() suite.jobID = id // Mock stats of periodic job - args := []interface{}{ + args := []any{ rds.KeyJobStats(suite.namespace, id), "status_hook", "http://core:8080/hook", @@ -101,10 +101,10 @@ func (suite *ManagerTestSuite) SetupTest() { require.Equal(suite.T(), "ok", strings.ToLower(reply), "ok expected") // Mock periodic job policy object - params := make(map[string]interface{}) + params := make(map[string]any) params["redis_url_reg"] = "redis://redis:6379/1" - policy := make(map[string]interface{}) + policy := make(map[string]any) policy["job_name"] = jobNameGarbageCollection policy["job_params"] = params policy["cron_spec"] = "0 0 17 * * *" @@ -118,7 +118,7 @@ func (suite *ManagerTestSuite) SetupTest() { score := time.Now().Unix() suite.numbericID = score - zaddArgs := []interface{}{ + zaddArgs := []any{ rds.KeyPeriodicPolicy(suite.namespace), score, rawJSON, @@ -130,7 +130,7 @@ func (suite *ManagerTestSuite) SetupTest() { require.Equal(suite.T(), 2, count) // Mock key score mapping - keyScoreArgs := []interface{}{ + keyScoreArgs := []any{ fmt.Sprintf("%s%s", rds.KeyNamespacePrefix(suite.namespace), "period:key_score"), score, id, @@ -181,7 +181,7 @@ func (suite *ManagerTestSuite) TestManager() { assert.NoError(suite.T(), err, "check existence of key score mapping error") assert.Equal(suite.T(), 0, count) - hmGetArgs := []interface{}{ + hmGetArgs := []any{ rds.KeyJobStats(suite.namespace, suite.jobID), "id", "status", diff --git a/src/jobservice/migration/migrator_v180.go b/src/jobservice/migration/migrator_v180.go index 2d935001707..1a1f4f56150 100644 --- a/src/jobservice/migration/migrator_v180.go +++ b/src/jobservice/migration/migrator_v180.go @@ -84,7 +84,7 @@ func (pm *PolicyMigrator) Migrate() error { return errors.Wrap(err, "get job stats list error") } - args := []interface{}{ + args := []any{ "id_placeholder", "id", "kind", @@ -126,7 +126,7 @@ func (pm *PolicyMigrator) Migrate() error { logger.Errorf("send command MULTI failed with error: %s", err) continue } - setArgs := []interface{}{ + setArgs := []any{ fullID, "status", job.ScheduledStatus.String(), // make sure the status of periodic job is "Scheduled" @@ -146,7 +146,7 @@ func (pm *PolicyMigrator) Migrate() error { } // Remove useless fields - rmArgs := []interface{}{ + rmArgs := []any{ fullID, "status_hook", "multiple_executions", @@ -210,7 +210,7 @@ func (pm *PolicyMigrator) Migrate() error { // getAllJobStatsIDs get all the IDs of the existing jobs func getAllJobStatsIDs(conn redis.Conn, ns string) ([]string, error) { pattern := rds.KeyJobStats(ns, "*") - args := []interface{}{ + args := []any{ 0, "MATCH", pattern, @@ -218,7 +218,7 @@ func getAllJobStatsIDs(conn redis.Conn, ns string) ([]string, error) { 100, } - allFullIDs := make([]interface{}, 0) + allFullIDs := make([]any, 0) for { // Use SCAN to iterate the IDs @@ -232,7 +232,7 @@ func getAllJobStatsIDs(conn redis.Conn, ns string) ([]string, error) { return nil, errors.Errorf("Invalid result returned for the SCAN command: %#v", values) } - if fullIDs, ok := values[1].([]interface{}); ok { + if fullIDs, ok := values[1].([]any); ok { allFullIDs = append(allFullIDs, fullIDs...) } @@ -301,7 +301,7 @@ func getPeriodicPolicy(numericID int64, conn redis.Conn, ns string) (*period.Pol // Clear the duplicated policy entries for the job "IMAGE_GC" and "IMAGE_SCAN_ALL" func clearDuplicatedPolicies(conn redis.Conn, ns string) error { - hash := make(map[string]interface{}) + hash := make(map[string]any) bytes, err := redis.Values(conn.Do("ZREVRANGE", rds.KeyPeriodicPolicy(ns), 0, -1, "WITHSCORES")) if err != nil { @@ -362,7 +362,7 @@ func delScoreZset(conn redis.Conn, ns string) { } } -func toString(v interface{}) string { +func toString(v any) string { if v == nil { return "" } @@ -374,7 +374,7 @@ func toString(v interface{}) string { return "" } -func toInt(v interface{}) int64 { +func toInt(v any) int64 { if v == nil { return -1 } diff --git a/src/jobservice/period/basic_scheduler.go b/src/jobservice/period/basic_scheduler.go index c3190c35444..d3be53756c8 100644 --- a/src/jobservice/period/basic_scheduler.go +++ b/src/jobservice/period/basic_scheduler.go @@ -241,7 +241,7 @@ func (bs *basicScheduler) clearDirtyJobs() { // Get relevant executions for the periodic job func getPeriodicExecutions(conn redis.Conn, key string) ([]string, error) { - args := []interface{}{key, 0, "+inf"} + args := []any{key, 0, "+inf"} list, err := redis.Values(conn.Do("ZRANGEBYSCORE", args...)) if err != nil { diff --git a/src/jobservice/period/basic_scheduler_test.go b/src/jobservice/period/basic_scheduler_test.go index c983d4d6ffa..af47473d209 100644 --- a/src/jobservice/period/basic_scheduler_test.go +++ b/src/jobservice/period/basic_scheduler_test.go @@ -4,7 +4,7 @@ // 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 +// 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, @@ -154,7 +154,7 @@ func (suite *BasicSchedulerTestSuite) setupDirtyJobs() { ID: "jid", // Already expired EnqueuedAt: time.Now().Unix() - 86400, - Args: map[string]interface{}{"image": "sample:latest"}, + Args: map[string]any{"image": "sample:latest"}, } rawJSON, err := utils.SerializeJob(j) diff --git a/src/jobservice/period/policy_store.go b/src/jobservice/period/policy_store.go index 37ced53579b..f4790e2fcc5 100644 --- a/src/jobservice/period/policy_store.go +++ b/src/jobservice/period/policy_store.go @@ -31,12 +31,12 @@ import ( type Policy struct { // Policy can be treated as job template of periodic job. // The info of policy will be copied into the scheduled job executions for the periodic job. - ID string `json:"id"` - JobName string `json:"job_name"` - CronSpec string `json:"cron_spec"` - JobParameters map[string]interface{} `json:"job_params,omitempty"` - WebHookURL string `json:"web_hook_url,omitempty"` - NumericID int64 `json:"numeric_id,omitempty"` + ID string `json:"id"` + JobName string `json:"job_name"` + CronSpec string `json:"cron_spec"` + JobParameters map[string]any `json:"job_params,omitempty"` + WebHookURL string `json:"web_hook_url,omitempty"` + NumericID int64 `json:"numeric_id,omitempty"` } // Serialize the policy to raw data. diff --git a/src/jobservice/runner/redis.go b/src/jobservice/runner/redis.go index 5237e634843..3520610639f 100644 --- a/src/jobservice/runner/redis.go +++ b/src/jobservice/runner/redis.go @@ -42,13 +42,13 @@ const ( // RedisJob is a job wrapper to wrap the job.Interface to the style which can be recognized by the redis worker. type RedisJob struct { - job interface{} // the real job implementation + job any // the real job implementation context *env.Context // context ctl lcm.Controller // life cycle controller } // NewRedisJob is constructor of RedisJob -func NewRedisJob(job interface{}, ctx *env.Context, ctl lcm.Controller) *RedisJob { +func NewRedisJob(job any, ctx *env.Context, ctl lcm.Controller) *RedisJob { return &RedisJob{ job: job, context: ctx, diff --git a/src/jobservice/runner/redis_test.go b/src/jobservice/runner/redis_test.go index 21e79538a1b..f1bf419c204 100644 --- a/src/jobservice/runner/redis_test.go +++ b/src/jobservice/runner/redis_test.go @@ -120,19 +120,19 @@ func (suite *RedisRunnerTestSuite) TestJobWrapper() { { Name: "STD_OUTPUT", Level: "DEBUG", - Settings: map[string]interface{}{ + Settings: map[string]any{ "output": backend.StdErr, }, }, { Name: "FILE", Level: "ERROR", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 5, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/runner/wrapper.go b/src/jobservice/runner/wrapper.go index a076fbffee2..ebdf1dd5634 100644 --- a/src/jobservice/runner/wrapper.go +++ b/src/jobservice/runner/wrapper.go @@ -21,7 +21,7 @@ import ( ) // Wrap returns a new job.Interface based on the wrapped job handler reference. -func Wrap(j interface{}) job.Interface { +func Wrap(j any) job.Interface { theType := reflect.TypeOf(j) if theType.Kind() == reflect.Ptr { diff --git a/src/jobservice/runtime/bootstrap.go b/src/jobservice/runtime/bootstrap.go index 4e356523f43..1ff97a4ef75 100644 --- a/src/jobservice/runtime/bootstrap.go +++ b/src/jobservice/runtime/bootstrap.go @@ -312,7 +312,7 @@ func (bs *Bootstrap) loadAndRunRedisWorkerPool( // Register jobs here if err := redisWorker.RegisterJobs( - map[string]interface{}{ + map[string]any{ // Only for debugging and testing purpose job.SampleJob: (*sample.Job)(nil), // Functional jobs diff --git a/src/jobservice/sync/schedule.go b/src/jobservice/sync/schedule.go index 67ef3ede94f..8a87ff5ff4d 100644 --- a/src/jobservice/sync/schedule.go +++ b/src/jobservice/sync/schedule.go @@ -362,7 +362,7 @@ func (w *Worker) validate() error { func (w *Worker) getTask(ctx context.Context, schedule *scheduler.Schedule) (*task.Task, error) { // Get associated execution first. executions, err := w.coreExecutionManager.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "vendor_type": scheduler.JobNameScheduler, "vendor_id": schedule.ID, }, @@ -379,7 +379,7 @@ func (w *Worker) getTask(ctx context.Context, schedule *scheduler.Schedule) (*ta theOne := executions[0] // Now get the execution. tasks, err := w.coreTaskManager.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "execution_id": theOne.ID, }, }) diff --git a/src/jobservice/sync/schedule_test.go b/src/jobservice/sync/schedule_test.go index fae1d6611bc..23610aeb8cf 100644 --- a/src/jobservice/sync/schedule_test.go +++ b/src/jobservice/sync/schedule_test.go @@ -81,7 +81,7 @@ func (suite *WorkerTestSuite) SetupSuite() { // The missing schedule in database. tte := &tt.ExecutionManager{} tte.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "vendor_type": scheduler.JobNameScheduler, "vendor_id": (int64)(550), }, @@ -93,7 +93,7 @@ func (suite *WorkerTestSuite) SetupSuite() { ttm := &tt.Manager{} ttm.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "execution_id": (int64)(1550), }, }).Return([]*task.Task{ diff --git a/src/jobservice/worker/cworker/c_worker.go b/src/jobservice/worker/cworker/c_worker.go index 130cd099ea9..b87071a6c73 100644 --- a/src/jobservice/worker/cworker/c_worker.go +++ b/src/jobservice/worker/cworker/c_worker.go @@ -154,7 +154,7 @@ func (w *basicWorker) Start() error { logger.Infof("Basic worker is started") // Start the reaper - w.knownJobs.Range(func(k interface{}, _ interface{}) bool { + w.knownJobs.Range(func(k any, _ any) bool { w.reaper.jobTypes = append(w.reaper.jobTypes, k.(string)) return true @@ -171,7 +171,7 @@ func (w *basicWorker) GetPoolID() string { } // RegisterJobs is used to register multiple jobs to worker. -func (w *basicWorker) RegisterJobs(jobs map[string]interface{}) error { +func (w *basicWorker) RegisterJobs(jobs map[string]any) error { if len(jobs) == 0 { // Do nothing return nil @@ -374,12 +374,12 @@ func (w *basicWorker) RetryJob(_ string) error { } // IsKnownJob ... -func (w *basicWorker) IsKnownJob(name string) (interface{}, bool) { +func (w *basicWorker) IsKnownJob(name string) (any, bool) { return w.knownJobs.Load(name) } // ValidateJobParameters ... -func (w *basicWorker) ValidateJobParameters(jobType interface{}, params job.Parameters) error { +func (w *basicWorker) ValidateJobParameters(jobType any, params job.Parameters) error { if jobType == nil { return errors.New("nil job type") } @@ -390,7 +390,7 @@ func (w *basicWorker) ValidateJobParameters(jobType interface{}, params job.Para // RegisterJob is used to register the job to the worker. // j is the type of job -func (w *basicWorker) registerJob(name string, j interface{}) (err error) { +func (w *basicWorker) registerJob(name string, j any) (err error) { if utils.IsEmptyStr(name) || j == nil { return errors.New("job can not be registered with empty name or nil interface") } @@ -406,7 +406,7 @@ func (w *basicWorker) registerJob(name string, j interface{}) (err error) { } // Same job implementation can be only registered with one name - w.knownJobs.Range(func(jName interface{}, jInList interface{}) bool { + w.knownJobs.Range(func(jName any, jInList any) bool { jobImpl := reflect.TypeOf(j).String() if reflect.TypeOf(jInList).String() == jobImpl { err = errors.Errorf("job %s has been already registered with name %s", jobImpl, jName) diff --git a/src/jobservice/worker/cworker/c_worker_test.go b/src/jobservice/worker/cworker/c_worker_test.go index c1faa7acd23..488679a7f54 100644 --- a/src/jobservice/worker/cworker/c_worker_test.go +++ b/src/jobservice/worker/cworker/c_worker_test.go @@ -78,7 +78,7 @@ func (suite *CWorkerTestSuite) SetupSuite() { ) suite.cWorker = NewWorker(envCtx, suite.namespace, 5, suite.pool, suite.lcmCtl) - err := suite.cWorker.RegisterJobs(map[string]interface{}{ + err := suite.cWorker.RegisterJobs(map[string]any{ "fake_job": (*fakeJob)(nil), "fake_long_run_job": (*fakeLongRunJob)(nil), }) @@ -110,7 +110,7 @@ func (suite *CWorkerTestSuite) TestRegisterJobs() { _, ok := suite.cWorker.IsKnownJob("fake_job") assert.EqualValues(suite.T(), true, ok, "expected known job but registering 'fake_job' appears to have failed") - params := make(map[string]interface{}) + params := make(map[string]any) params["name"] = "testing:v1" err := suite.cWorker.ValidateJobParameters((*fakeJob)(nil), params) assert.NoError(suite.T(), err, "validate parameters: nil error expected but got %s", err) @@ -184,7 +184,7 @@ func (suite *CWorkerTestSuite) TestWorkerStats() { // TestStopJob test stop job func (suite *CWorkerTestSuite) TestStopJob() { // Stop generic job - params := make(map[string]interface{}) + params := make(map[string]any) params["name"] = "testing:v1" genericJob, err := suite.cWorker.Enqueue("fake_long_run_job", params, false, "") diff --git a/src/jobservice/worker/cworker/de_duplicator.go b/src/jobservice/worker/cworker/de_duplicator.go index b02fe2b0079..091ee55594a 100644 --- a/src/jobservice/worker/cworker/de_duplicator.go +++ b/src/jobservice/worker/cworker/de_duplicator.go @@ -83,7 +83,7 @@ func (rdd *redisDeDuplicator) MustUnique(jobName string, params job.Parameters) _ = conn.Close() }() - args := []interface{}{ + args := []any{ uniqueKey, 1, "NX", @@ -127,7 +127,7 @@ func (rdd *redisDeDuplicator) DelUniqueSign(jobName string, params job.Parameter } // Same key with upstream framework -func redisKeyUniqueJob(namespace, jobName string, args map[string]interface{}) (string, error) { +func redisKeyUniqueJob(namespace, jobName string, args map[string]any) (string, error) { var buf bytes.Buffer buf.WriteString(rds.KeyNamespacePrefix(namespace)) diff --git a/src/jobservice/worker/cworker/de_duplicator_test.go b/src/jobservice/worker/cworker/de_duplicator_test.go index f91b08b1d01..ec6ec468d0a 100644 --- a/src/jobservice/worker/cworker/de_duplicator_test.go +++ b/src/jobservice/worker/cworker/de_duplicator_test.go @@ -23,7 +23,7 @@ func TestDeDuplicatorTestSuite(t *testing.T) { // TestDeDuplicator ... func (suite *DeDuplicatorTestSuite) TestDeDuplicator() { jobName := "fake_job" - jobParams := map[string]interface{}{ + jobParams := map[string]any{ "image": "ubuntu:latest", } diff --git a/src/jobservice/worker/cworker/reaper.go b/src/jobservice/worker/cworker/reaper.go index 601a9e6d021..8a6102b775e 100644 --- a/src/jobservice/worker/cworker/reaper.go +++ b/src/jobservice/worker/cworker/reaper.go @@ -250,7 +250,7 @@ func (r *reaper) scanLocks(key string, handler func(k string, v int64) error) er return errors.Wrap(err, "scan locks") } - if values, ok := reply[1].([]interface{}); ok { + if values, ok := reply[1].([]any); ok { for i := 0; i < len(values); i += 2 { k := string(values[i].([]uint8)) lc, err := strconv.ParseInt(string(values[i+1].([]uint8)), 10, 64) @@ -317,7 +317,7 @@ func (r *reaper) getCurrentWorkerPools() (map[string]bool, error) { func (r *reaper) requeueInProgressJobs(poolID string, jobTypes []string) error { numKeys := len(jobTypes) redisRequeueScript := rds.RedisLuaReenqueueScript(numKeys) - var scriptArgs = make([]interface{}, 0, numKeys+1) + var scriptArgs = make([]any, 0, numKeys+1) for _, jobType := range jobTypes { // pops from in progress, push into job queue and decrement the queue lock diff --git a/src/jobservice/worker/cworker/reaper_test.go b/src/jobservice/worker/cworker/reaper_test.go index 873a0bd38d4..51e939832f2 100644 --- a/src/jobservice/worker/cworker/reaper_test.go +++ b/src/jobservice/worker/cworker/reaper_test.go @@ -163,11 +163,11 @@ func (suite *ReaperTestSuite) TestSyncOutdatedStats() { } func mockJobData() (string, error) { - j := make(map[string]interface{}) + j := make(map[string]any) j["name"] = job.SampleJob j["id"] = utils.MakeIdentifier() j["t"] = time.Now().Unix() - args := make(map[string]interface{}) + args := make(map[string]any) j["args"] = args args["image"] = "test suite" @@ -193,7 +193,7 @@ func mockJobStats(conn redis.Conn, ns string, jid string) error { return err } - args := []interface{}{ + args := []any{ sk, "id", jid, "status", job.RunningStatus.String(), diff --git a/src/jobservice/worker/interface.go b/src/jobservice/worker/interface.go index 064b3ca9dbc..cf7a7cce982 100644 --- a/src/jobservice/worker/interface.go +++ b/src/jobservice/worker/interface.go @@ -26,11 +26,11 @@ type Interface interface { // Register multiple jobs. // - // jobs map[string]interface{}: job map, key is job name and value is job handler. + // jobs map[string]any: job map, key is job name and value is job handler. // // Return: // error if failed to register - RegisterJobs(jobs map[string]interface{}) error + RegisterJobs(jobs map[string]any) error // Get the worker pool ID // @@ -88,19 +88,19 @@ type Interface interface { // name string : name of job // // Returns: - // interface{} : the job type of the known job if it's existing + // any : the job type of the known job if it's existing // bool : if the known job requires parameters - IsKnownJob(name string) (interface{}, bool) + IsKnownJob(name string) (any, bool) // Validate the parameters of the known job // - // jobType interface{} : type of known job - // params map[string]interface{} : parameters of known job + // jobType any : type of known job + // params map[string]any : parameters of known job // // Return: // error if parameters are not valid - ValidateJobParameters(jobType interface{}, params job.Parameters) error + ValidateJobParameters(jobType any, params job.Parameters) error // Stop the job // diff --git a/src/lib/cache/cache.go b/src/lib/cache/cache.go index 910d2edd965..d1780757e37 100644 --- a/src/lib/cache/cache.go +++ b/src/lib/cache/cache.go @@ -60,13 +60,13 @@ type Cache interface { Delete(ctx context.Context, key string) error // Fetch retrieve the cached key value - Fetch(ctx context.Context, key string, value interface{}) error + Fetch(ctx context.Context, key string, value any) error // Ping ping the cache Ping(ctx context.Context) error // Save cache the value by key - Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error + Save(ctx context.Context, key string, value any, expiration ...time.Duration) error // Scan scans the keys matched by match string // NOTICE: memory cache does not support use wildcard, compared by strings.Contains diff --git a/src/lib/cache/codec.go b/src/lib/cache/codec.go index 3a5d34a2239..1abb15bd91a 100644 --- a/src/lib/cache/codec.go +++ b/src/lib/cache/codec.go @@ -21,10 +21,10 @@ import ( // Codec codec interface for cache type Codec interface { // Encode returns the encoded byte array of v. - Encode(v interface{}) ([]byte, error) + Encode(v any) ([]byte, error) // Decode analyzes the encoded data and stores the result into the v. - Decode(data []byte, v interface{}) error + Decode(data []byte, v any) error } var ( @@ -34,11 +34,11 @@ var ( type msgpackCodec struct{} -func (*msgpackCodec) Encode(v interface{}) ([]byte, error) { +func (*msgpackCodec) Encode(v any) ([]byte, error) { return msgpack.Marshal(v) } -func (*msgpackCodec) Decode(data []byte, v interface{}) error { +func (*msgpackCodec) Decode(data []byte, v any) error { return msgpack.Unmarshal(data, v) } diff --git a/src/lib/cache/helper.go b/src/lib/cache/helper.go index 4ff7eb4d051..b0f6b143f12 100644 --- a/src/lib/cache/helper.go +++ b/src/lib/cache/helper.go @@ -30,7 +30,7 @@ var ( // FetchOrSave retrieves the value for the key if present in the cache. // Otherwise, it saves the value from the builder and retrieves the value for the key again. -func FetchOrSave(ctx context.Context, c Cache, key string, value interface{}, builder func() (interface{}, error), expiration ...time.Duration) error { +func FetchOrSave(ctx context.Context, c Cache, key string, value any, builder func() (any, error), expiration ...time.Duration) error { err := c.Fetch(ctx, key, value) // value found from the cache if err == nil { diff --git a/src/lib/cache/helper_test.go b/src/lib/cache/helper_test.go index 1aed1d719c6..5d6b68e0fa7 100644 --- a/src/lib/cache/helper_test.go +++ b/src/lib/cache/helper_test.go @@ -46,7 +46,7 @@ func (suite *FetchOrSaveTestSuite) TestFetchInternalError() { mock.OnAnything(c, "Fetch").Return(fmt.Errorf("oops")) var str string - err := FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + err := FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return "str", nil }) @@ -59,7 +59,7 @@ func (suite *FetchOrSaveTestSuite) TestBuildError() { mock.OnAnything(c, "Fetch").Return(ErrNotFound) var str string - err := FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + err := FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return nil, fmt.Errorf("oops") }) @@ -73,7 +73,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveError() { mock.OnAnything(c, "Save").Return(fmt.Errorf("oops")) var str string - err := FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + err := FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return "str", nil }) @@ -86,7 +86,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { var data sync.Map - mock.OnAnything(c, "Fetch").Return(func(ctx context.Context, key string, value interface{}) error { + mock.OnAnything(c, "Fetch").Return(func(ctx context.Context, key string, value any) error { _, ok := data.Load(key) if ok { return nil @@ -95,7 +95,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { return ErrNotFound }) - mock.OnAnything(c, "Save").Return(func(ctx context.Context, key string, value interface{}, exp ...time.Duration) error { + mock.OnAnything(c, "Save").Return(func(ctx context.Context, key string, value any, exp ...time.Duration) error { data.Store(key, value) return nil @@ -110,7 +110,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { defer wg.Done() var str string - FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return "str", nil }) }() diff --git a/src/lib/cache/memory/memory.go b/src/lib/cache/memory/memory.go index 6af6d9f060f..85979cb3e39 100644 --- a/src/lib/cache/memory/memory.go +++ b/src/lib/cache/memory/memory.go @@ -66,7 +66,7 @@ func (c *Cache) Delete(_ context.Context, key string) error { } // Fetch retrieve the cached key value -func (c *Cache) Fetch(ctx context.Context, key string, value interface{}) error { +func (c *Cache) Fetch(ctx context.Context, key string, value any) error { v, ok := c.storage.Load(c.opts.Key(key)) if !ok { return cache.ErrNotFound @@ -94,7 +94,7 @@ func (c *Cache) Ping(_ context.Context) error { } // Save cache the value by key -func (c *Cache) Save(_ context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (c *Cache) Save(_ context.Context, key string, value any, expiration ...time.Duration) error { data, err := c.opts.Codec.Encode(value) if err != nil { return fmt.Errorf("failed to encode value, key %s, error: %v", key, err) @@ -120,7 +120,7 @@ func (c *Cache) Save(_ context.Context, key string, value interface{}, expiratio // Scan scans the keys matched by match string func (c *Cache) Scan(_ context.Context, match string) (cache.Iterator, error) { var keys []string - c.storage.Range(func(k, v interface{}) bool { + c.storage.Range(func(k, v any) bool { matched := true if match != "" { matched = strings.Contains(k.(string), match) diff --git a/src/lib/cache/memory/memory_test.go b/src/lib/cache/memory/memory_test.go index 883045b5cc6..218546fa2ad 100644 --- a/src/lib/cache/memory/memory_test.go +++ b/src/lib/cache/memory/memory_test.go @@ -66,9 +66,9 @@ func (suite *CacheTestSuite) TestDelete() { func (suite *CacheTestSuite) TestFetch() { key := "fetch" - suite.cache.Save(suite.ctx, key, map[string]interface{}{"name": "harbor", "version": "1.10"}) + suite.cache.Save(suite.ctx, key, map[string]any{"name": "harbor", "version": "1.10"}) - mp := map[string]interface{}{} + mp := map[string]any{} suite.cache.Fetch(suite.ctx, key, &mp) suite.Len(mp, 2) suite.Equal("harbor", mp["name"]) diff --git a/src/lib/cache/redis/redis.go b/src/lib/cache/redis/redis.go index b2f7f7a4774..cadd44b7725 100644 --- a/src/lib/cache/redis/redis.go +++ b/src/lib/cache/redis/redis.go @@ -52,7 +52,7 @@ func (c *Cache) Delete(ctx context.Context, key string) error { } // Fetch retrieve the cached key value -func (c *Cache) Fetch(ctx context.Context, key string, value interface{}) error { +func (c *Cache) Fetch(ctx context.Context, key string, value any) error { data, err := c.Client.Get(ctx, c.opts.Key(key)).Bytes() if err != nil { // convert internal or Timeout error to be ErrNotFound @@ -78,7 +78,7 @@ func (c *Cache) Ping(ctx context.Context) error { } // Save cache the value by key -func (c *Cache) Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (c *Cache) Save(ctx context.Context, key string, value any, expiration ...time.Duration) error { data, err := c.opts.Codec.Encode(value) if err != nil { return errors.Errorf("failed to encode value, key %s, error: %v", key, err) diff --git a/src/lib/cache/redis/redis_test.go b/src/lib/cache/redis/redis_test.go index 17b6616ef37..b9749e7ce3d 100644 --- a/src/lib/cache/redis/redis_test.go +++ b/src/lib/cache/redis/redis_test.go @@ -66,9 +66,9 @@ func (suite *CacheTestSuite) TestDelete() { func (suite *CacheTestSuite) TestFetch() { key := "fetch" - suite.cache.Save(suite.ctx, key, map[string]interface{}{"name": "harbor", "version": "1.10"}) + suite.cache.Save(suite.ctx, key, map[string]any{"name": "harbor", "version": "1.10"}) - mp := map[string]interface{}{} + mp := map[string]any{} suite.cache.Fetch(suite.ctx, key, &mp) suite.Len(mp, 2) suite.Equal("harbor", mp["name"]) diff --git a/src/lib/cache/util.go b/src/lib/cache/util.go index 412bfde514d..c66b9ca35da 100644 --- a/src/lib/cache/util.go +++ b/src/lib/cache/util.go @@ -22,7 +22,7 @@ type keyMutex struct { m *sync.Map } -func (km keyMutex) Lock(key interface{}) { +func (km keyMutex) Lock(key any) { m := sync.Mutex{} act, _ := km.m.LoadOrStore(key, &m) @@ -34,7 +34,7 @@ func (km keyMutex) Lock(key interface{}) { } } -func (km keyMutex) Unlock(key interface{}) { +func (km keyMutex) Unlock(key any) { act, exist := km.m.Load(key) if !exist { panic("unlock of unlocked mutex") diff --git a/src/lib/config/config.go b/src/lib/config/config.go index 0755b597392..ce1d5766a1e 100644 --- a/src/lib/config/config.go +++ b/src/lib/config/config.go @@ -45,13 +45,13 @@ var ( // Manager defines the operation for config type Manager interface { Load(ctx context.Context) error - Set(ctx context.Context, key string, value interface{}) + Set(ctx context.Context, key string, value any) Save(ctx context.Context) error Get(ctx context.Context, key string) *metadata.ConfigureValue - UpdateConfig(ctx context.Context, cfgs map[string]interface{}) error - GetUserCfgs(ctx context.Context) map[string]interface{} - ValidateCfg(ctx context.Context, cfgs map[string]interface{}) error - GetAll(ctx context.Context) map[string]interface{} + UpdateConfig(ctx context.Context, cfgs map[string]any) error + GetUserCfgs(ctx context.Context) map[string]any + ValidateCfg(ctx context.Context, cfgs map[string]any) error + GetAll(ctx context.Context) map[string]any GetDatabaseCfg() *comModels.Database } @@ -98,7 +98,7 @@ func Init() { // InitWithSettings init config with predefined configs, and optionally overwrite the keyprovider // need to import following package before calling it // _ "github.com/goharbor/harbor/src/pkg/config/inmemory" -func InitWithSettings(cfgs map[string]interface{}, kp ...encrypt.KeyProvider) { +func InitWithSettings(cfgs map[string]any, kp ...encrypt.KeyProvider) { Init() DefaultCfgManager = common.InMemoryCfgManager mgr := DefaultMgr() @@ -122,6 +122,6 @@ func Load(ctx context.Context) error { } // Upload save all configurations, used by testing -func Upload(cfg map[string]interface{}) error { +func Upload(cfg map[string]any) error { return DefaultMgr().UpdateConfig(orm.Context(), cfg) } diff --git a/src/lib/config/metadata/type.go b/src/lib/config/metadata/type.go index 1bb6ea28b32..d43a481ae82 100644 --- a/src/lib/config/metadata/type.go +++ b/src/lib/config/metadata/type.go @@ -31,7 +31,7 @@ type Type interface { // validate the configure value validate(str string) error // get the real type of current value, if it is int, return int, if it is string return string etc. - get(str string) (interface{}, error) + get(str string) (any, error) } // StringType ... @@ -42,7 +42,7 @@ func (t *StringType) validate(_ string) error { return nil } -func (t *StringType) get(str string) (interface{}, error) { +func (t *StringType) get(str string) (any, error) { return str, nil } @@ -95,7 +95,7 @@ func (t *IntType) validate(str string) error { return err } -func (t *IntType) get(str string) (interface{}, error) { +func (t *IntType) get(str string) (any, error) { return parseInt(str) } @@ -145,7 +145,7 @@ func (t *Int64Type) validate(str string) error { return err } -func (t *Int64Type) get(str string) (interface{}, error) { +func (t *Int64Type) get(str string) (any, error) { return parseInt64(str) } @@ -156,7 +156,7 @@ func (f *Float64Type) validate(str string) error { return err } -func (f *Float64Type) get(str string) (interface{}, error) { +func (f *Float64Type) get(str string) (any, error) { return parseFloat64(str) } @@ -169,7 +169,7 @@ func (t *BoolType) validate(str string) error { return err } -func (t *BoolType) get(str string) (interface{}, error) { +func (t *BoolType) get(str string) (any, error) { return strconv.ParseBool(str) } @@ -181,7 +181,7 @@ func (t *PasswordType) validate(_ string) error { return nil } -func (t *PasswordType) get(str string) (interface{}, error) { +func (t *PasswordType) get(str string) (any, error) { return str, nil } @@ -190,13 +190,13 @@ type MapType struct { } func (t *MapType) validate(str string) error { - result := map[string]interface{}{} + result := map[string]any{} err := json.Unmarshal([]byte(str), &result) return err } -func (t *MapType) get(str string) (interface{}, error) { - result := map[string]interface{}{} +func (t *MapType) get(str string) (any, error) { + result := map[string]any{} err := json.Unmarshal([]byte(str), &result) return result, err } @@ -211,7 +211,7 @@ func (t *StringToStringMapType) validate(str string) error { return err } -func (t *StringToStringMapType) get(str string) (interface{}, error) { +func (t *StringToStringMapType) get(str string) (any, error) { result := map[string]string{} err := json.Unmarshal([]byte(str), &result) return result, err @@ -244,7 +244,7 @@ func (t *DurationType) validate(str string) error { return err } -func (t *DurationType) get(str string) (interface{}, error) { +func (t *DurationType) get(str string) (any, error) { // should not parse the duration to avoid duplicate parse. return str, nil } diff --git a/src/lib/config/metadata/type_test.go b/src/lib/config/metadata/type_test.go index a96f7b8452e..285e103efb1 100644 --- a/src/lib/config/metadata/type_test.go +++ b/src/lib/config/metadata/type_test.go @@ -95,7 +95,7 @@ func TestMapType_validate(t *testing.T) { func TestMapType_get(t *testing.T) { test := &MapType{} result, _ := test.get(`{"sample":"abc", "another":"welcome"}`) - assert.Equal(t, map[string]interface{}{"sample": "abc", "another": "welcome"}, result) + assert.Equal(t, map[string]any{"sample": "abc", "another": "welcome"}, result) } func TestStringToStringMapType_validate(t *testing.T) { diff --git a/src/lib/config/metadata/value.go b/src/lib/config/metadata/value.go index 82876d5bacd..0677b95b343 100644 --- a/src/lib/config/metadata/value.go +++ b/src/lib/config/metadata/value.go @@ -169,8 +169,8 @@ func (c *ConfigureValue) GetDuration() time.Duration { return 0 } -// GetAnyType get the interface{} of current value -func (c *ConfigureValue) GetAnyType() (interface{}, error) { +// GetAnyType get the any of current value +func (c *ConfigureValue) GetAnyType() (any, error) { if item, ok := Instance().GetByName(c.Name); ok { return item.ItemType.get(c.Value) } diff --git a/src/lib/config/metadata/value_test.go b/src/lib/config/metadata/value_test.go index 2f2c745714e..26d9c2af49d 100644 --- a/src/lib/config/metadata/value_test.go +++ b/src/lib/config/metadata/value_test.go @@ -58,7 +58,7 @@ func TestConfigureValue_GetStringToStringMap(t *testing.T) { if err != nil { t.Error(err) } - assert.Equal(t, val, map[string]interface{}{"sample": "abc"}) + assert.Equal(t, val, map[string]any{"sample": "abc"}) Instance().init() } diff --git a/src/lib/config/models/model.go b/src/lib/config/models/model.go index e1a7c9c64b6..d913ad34e8c 100644 --- a/src/lib/config/models/model.go +++ b/src/lib/config/models/model.go @@ -70,8 +70,8 @@ func (ce *ConfigEntry) TableName() string { // Value ... type Value struct { - Val interface{} `json:"value"` - Editable bool `json:"editable"` + Val any `json:"value"` + Editable bool `json:"editable"` } // LdapConf holds information about ldap configuration diff --git a/src/lib/config/test/userconfig_test.go b/src/lib/config/test/userconfig_test.go index d7922ea6d2e..4fcc5f268d4 100644 --- a/src/lib/config/test/userconfig_test.go +++ b/src/lib/config/test/userconfig_test.go @@ -41,7 +41,7 @@ func TestConfig(t *testing.T) { test.InitDatabaseFromEnv() dao.PrepareTestData([]string{"delete from properties where k='scan_all_policy'"}, []string{}) defaultCACertPath = path.Join(currPath(), "test", "ca.crt") - c := map[string]interface{}{ + c := map[string]any{ common.WithTrivy: false, } Init() @@ -68,7 +68,7 @@ func TestConfig(t *testing.T) { t.Fatalf("failed to load configurations: %v", err) } - if err := Upload(map[string]interface{}{}); err != nil { + if err := Upload(map[string]any{}); err != nil { t.Fatalf("failed to upload configurations: %v", err) } @@ -225,7 +225,7 @@ pkgODrJUf0p5dhcnLyA2nZolRV1rtwlgJstnEV4JpG1MwtmAZYZUilLvnfpVxTtA y1bQusZMygQezfCuEzsewF+OpANFovCTUEs6s5vyoVNP8lk= -----END CERTIFICATE----- ` - m := map[string]interface{}{ + m := map[string]any{ common.HTTPAuthProxySkipSearch: "true", common.HTTPAuthProxyVerifyCert: "true", common.HTTPAuthProxyAdminGroups: "group1, group2", @@ -246,7 +246,7 @@ y1bQusZMygQezfCuEzsewF+OpANFovCTUEs6s5vyoVNP8lk= } func TestOIDCSetting(t *testing.T) { - m := map[string]interface{}{ + m := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://oidc.test", common.OIDCVerifyCert: "true", diff --git a/src/lib/config/userconfig.go b/src/lib/config/userconfig.go index 93806999ef4..8c3d9fc1d93 100644 --- a/src/lib/config/userconfig.go +++ b/src/lib/config/userconfig.go @@ -28,7 +28,7 @@ import ( // It contains all user related configurations, each of user related settings requires a context provided // GetSystemCfg returns the all configurations -func GetSystemCfg(ctx context.Context) (map[string]interface{}, error) { +func GetSystemCfg(ctx context.Context) (map[string]any, error) { sysCfg := DefaultMgr().GetAll(ctx) if len(sysCfg) == 0 { return nil, errors.New("can not load system config, the database might be down") diff --git a/src/lib/context.go b/src/lib/context.go index 24ef00451c6..3a241a88f59 100644 --- a/src/lib/context.go +++ b/src/lib/context.go @@ -41,14 +41,14 @@ type ArtifactInfo struct { BlobMountDigest string } -func setToContext(ctx context.Context, key contextKey, value interface{}) context.Context { +func setToContext(ctx context.Context, key contextKey, value any) context.Context { if ctx == nil { ctx = context.Background() } return context.WithValue(ctx, key, value) } -func getFromContext(ctx context.Context, key contextKey) interface{} { +func getFromContext(ctx context.Context, key contextKey) any { if ctx == nil { return nil } diff --git a/src/lib/convert_types.go b/src/lib/convert_types.go index 994a998b085..24a8b513043 100644 --- a/src/lib/convert_types.go +++ b/src/lib/convert_types.go @@ -43,7 +43,7 @@ func StringValue(v *string) string { } // ToBool convert interface to bool -func ToBool(v interface{}) bool { +func ToBool(v any) bool { switch b := v.(type) { case bool: return b diff --git a/src/lib/convert_types_test.go b/src/lib/convert_types_test.go index 08a9e9f2d44..c75f0c90721 100644 --- a/src/lib/convert_types_test.go +++ b/src/lib/convert_types_test.go @@ -20,7 +20,7 @@ import ( func TestToBool(t *testing.T) { type args struct { - v interface{} + v any } tests := []struct { name string diff --git a/src/lib/encrypt/encrypt.go b/src/lib/encrypt/encrypt.go index f8e7beaf734..58babd3b595 100644 --- a/src/lib/encrypt/encrypt.go +++ b/src/lib/encrypt/encrypt.go @@ -37,7 +37,7 @@ type Encryptor interface { // AESEncryptor uses AES to encrypt or decrypt string type AESEncryptor struct { keyProvider KeyProvider - keyParams map[string]interface{} + keyParams map[string]any } // NewAESEncryptor returns an instance of an AESEncryptor diff --git a/src/lib/encrypt/keyprovider.go b/src/lib/encrypt/keyprovider.go index da938a7fb50..b7c3303df92 100644 --- a/src/lib/encrypt/keyprovider.go +++ b/src/lib/encrypt/keyprovider.go @@ -20,7 +20,7 @@ import "os" type KeyProvider interface { // Get returns the key // params can be used to pass parameters in different implements - Get(params map[string]interface{}) (string, error) + Get(params map[string]any) (string, error) } // FileKeyProvider reads key from file @@ -37,7 +37,7 @@ func NewFileKeyProvider(path string) KeyProvider { } // Get returns the key read from file -func (f *FileKeyProvider) Get(_ map[string]interface{}) (string, error) { +func (f *FileKeyProvider) Get(_ map[string]any) (string, error) { b, err := os.ReadFile(f.path) if err != nil { return "", err @@ -51,6 +51,6 @@ type PresetKeyProvider struct { } // Get ... -func (p *PresetKeyProvider) Get(_ map[string]interface{}) (string, error) { +func (p *PresetKeyProvider) Get(_ map[string]any) (string, error) { return p.Key, nil } diff --git a/src/lib/errors/errors.go b/src/lib/errors/errors.go index 71d1074b258..dbf100d2a20 100644 --- a/src/lib/errors/errors.go +++ b/src/lib/errors/errors.go @@ -64,7 +64,7 @@ func (e *Error) MarshalJSON() ([]byte, error) { } // WithMessagef ... -func (e *Error) WithMessagef(format string, v ...interface{}) *Error { +func (e *Error) WithMessagef(format string, v ...any) *Error { e.Message = fmt.Sprintf(format, v...) return e } @@ -132,7 +132,7 @@ func NewErrs(err error) Errors { } // New ... -func New(in interface{}) *Error { +func New(in any) *Error { var err error switch in := in.(type) { case error: @@ -161,7 +161,7 @@ func Wrap(err error, message string) *Error { } // Wrapf ... -func Wrapf(err error, format string, args ...interface{}) *Error { +func Wrapf(err error, format string, args ...any) *Error { if err == nil { return nil } @@ -174,7 +174,7 @@ func Wrapf(err error, format string, args ...interface{}) *Error { } // Errorf ... -func Errorf(format string, args ...interface{}) *Error { +func Errorf(format string, args ...any) *Error { return &Error{ Message: fmt.Sprintf(format, args...), Stack: newStack(), diff --git a/src/lib/json_copy.go b/src/lib/json_copy.go index b7cf4a57fc4..9b6e22ef369 100644 --- a/src/lib/json_copy.go +++ b/src/lib/json_copy.go @@ -21,7 +21,7 @@ import ( // JSONCopy copy from src to dst with json marshal and unmarshal. // NOTE: copy from one struct to another struct may miss some values depend on // the json tag in the fields, you should know what will happened when call this function. -func JSONCopy(dst, src interface{}) error { +func JSONCopy(dst, src any) error { data, err := json.Marshal(src) if err != nil { return err diff --git a/src/lib/json_copy_test.go b/src/lib/json_copy_test.go index 4ada47dfee4..c3e15eb80cf 100644 --- a/src/lib/json_copy_test.go +++ b/src/lib/json_copy_test.go @@ -29,7 +29,7 @@ func TestJSONCopy(t *testing.T) { assert := assert.New(t) { - var m map[string]interface{} + var m map[string]any foo := &jsonCopyFoo{ Name: "foo", Age: 1, @@ -42,7 +42,7 @@ func TestJSONCopy(t *testing.T) { } { - var m map[string]interface{} + var m map[string]any var foo *jsonCopyFoo assert.Nil(m) @@ -51,7 +51,7 @@ func TestJSONCopy(t *testing.T) { } { - m := map[string]interface{}{ + m := map[string]any{ "name": "foo", "age": 1, } diff --git a/src/lib/log/logger.go b/src/lib/log/logger.go index 88a52e198e6..66e5fecd24d 100644 --- a/src/lib/log/logger.go +++ b/src/lib/log/logger.go @@ -46,8 +46,8 @@ func init() { logger.setLevel(level) } -// Fields type alias to map[string]interface{} -type Fields = map[string]interface{} +// Fields type alias to map[string]any +type Fields = map[string]any // Logger provides a struct with fields that describe the details of logger. type Logger struct { @@ -56,14 +56,14 @@ type Logger struct { lvl Level callDepth int skipLine bool - fields map[string]interface{} + fields map[string]any fieldsStr string mu *sync.Mutex // ptr here to share one sync.Mutex for clone method fallback *Logger // fallback logger when current out fail } // New returns a customized Logger -func New(out io.Writer, fmtter Formatter, lvl Level, options ...interface{}) *Logger { +func New(out io.Writer, fmtter Formatter, lvl Level, options ...any) *Logger { // Default set to be 3 depth := 3 // If passed in as option, then reset depth @@ -80,7 +80,7 @@ func New(out io.Writer, fmtter Formatter, lvl Level, options ...interface{}) *Lo fmtter: fmtter, lvl: lvl, callDepth: depth, - fields: map[string]interface{}{}, + fields: map[string]any{}, mu: &sync.Mutex{}, } } @@ -121,7 +121,7 @@ func (l *Logger) WithFields(fields Fields) *Logger { r := l.clone() if len(fields) > 0 { - copyFields := make(map[string]interface{}, len(l.fields)+len(fields)) + copyFields := make(map[string]any, len(l.fields)+len(fields)) for key, value := range l.fields { copyFields[key] = value } @@ -148,7 +148,7 @@ func (l *Logger) WithFields(fields Fields) *Logger { } // WithField returns cloned logger which fields merged with field key=value -func (l *Logger) WithField(key string, value interface{}) *Logger { +func (l *Logger) WithField(key string, value any) *Logger { return l.WithFields(Fields{key: value}) } @@ -196,7 +196,7 @@ func (l *Logger) output(record *Record) (err error) { } // Debug ... -func (l *Logger) Debug(v ...interface{}) { +func (l *Logger) Debug(v ...any) { if l.lvl <= DebugLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), DebugLevel) _ = l.output(record) @@ -204,7 +204,7 @@ func (l *Logger) Debug(v ...interface{}) { } // Debugf ... -func (l *Logger) Debugf(format string, v ...interface{}) { +func (l *Logger) Debugf(format string, v ...any) { if l.lvl <= DebugLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), DebugLevel) _ = l.output(record) @@ -212,7 +212,7 @@ func (l *Logger) Debugf(format string, v ...interface{}) { } // Info ... -func (l *Logger) Info(v ...interface{}) { +func (l *Logger) Info(v ...any) { if l.lvl <= InfoLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), InfoLevel) _ = l.output(record) @@ -220,7 +220,7 @@ func (l *Logger) Info(v ...interface{}) { } // Infof ... -func (l *Logger) Infof(format string, v ...interface{}) { +func (l *Logger) Infof(format string, v ...any) { if l.lvl <= InfoLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), InfoLevel) _ = l.output(record) @@ -228,7 +228,7 @@ func (l *Logger) Infof(format string, v ...interface{}) { } // Warning ... -func (l *Logger) Warning(v ...interface{}) { +func (l *Logger) Warning(v ...any) { if l.lvl <= WarningLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), WarningLevel) _ = l.output(record) @@ -236,7 +236,7 @@ func (l *Logger) Warning(v ...interface{}) { } // Warningf ... -func (l *Logger) Warningf(format string, v ...interface{}) { +func (l *Logger) Warningf(format string, v ...any) { if l.lvl <= WarningLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), WarningLevel) _ = l.output(record) @@ -244,7 +244,7 @@ func (l *Logger) Warningf(format string, v ...interface{}) { } // Error ... -func (l *Logger) Error(v ...interface{}) { +func (l *Logger) Error(v ...any) { if l.lvl <= ErrorLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), ErrorLevel) _ = l.output(record) @@ -252,7 +252,7 @@ func (l *Logger) Error(v ...interface{}) { } // Errorf ... -func (l *Logger) Errorf(format string, v ...interface{}) { +func (l *Logger) Errorf(format string, v ...any) { if l.lvl <= ErrorLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), ErrorLevel) _ = l.output(record) @@ -260,7 +260,7 @@ func (l *Logger) Errorf(format string, v ...interface{}) { } // Fatal ... -func (l *Logger) Fatal(v ...interface{}) { +func (l *Logger) Fatal(v ...any) { if l.lvl <= FatalLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), FatalLevel) _ = l.output(record) @@ -269,7 +269,7 @@ func (l *Logger) Fatal(v ...interface{}) { } // Fatalf ... -func (l *Logger) Fatalf(format string, v ...interface{}) { +func (l *Logger) Fatalf(format string, v ...any) { if l.lvl <= FatalLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), FatalLevel) _ = l.output(record) @@ -298,52 +298,52 @@ func (l *Logger) getLine() string { } // Debug ... -func Debug(v ...interface{}) { +func Debug(v ...any) { logger.WithDepth(4).Debug(v...) } // Debugf ... -func Debugf(format string, v ...interface{}) { +func Debugf(format string, v ...any) { logger.WithDepth(4).Debugf(format, v...) } // Info ... -func Info(v ...interface{}) { +func Info(v ...any) { logger.WithDepth(4).Info(v...) } // Infof ... -func Infof(format string, v ...interface{}) { +func Infof(format string, v ...any) { logger.WithDepth(4).Infof(format, v...) } // Warning ... -func Warning(v ...interface{}) { +func Warning(v ...any) { logger.WithDepth(4).Warning(v...) } // Warningf ... -func Warningf(format string, v ...interface{}) { +func Warningf(format string, v ...any) { logger.WithDepth(4).Warningf(format, v...) } // Error ... -func Error(v ...interface{}) { +func Error(v ...any) { logger.WithDepth(4).Error(v...) } // Errorf ... -func Errorf(format string, v ...interface{}) { +func Errorf(format string, v ...any) { logger.WithDepth(4).Errorf(format, v...) } // Fatal ... -func Fatal(v ...interface{}) { +func Fatal(v ...any) { logger.WithDepth(4).Fatal(v...) } // Fatalf ... -func Fatalf(format string, v ...interface{}) { +func Fatalf(format string, v ...any) { logger.WithDepth(4).Fatalf(format, v...) } diff --git a/src/lib/orm/error.go b/src/lib/orm/error.go index 315a413271f..ceaab192b5b 100644 --- a/src/lib/orm/error.go +++ b/src/lib/orm/error.go @@ -30,7 +30,7 @@ var ( ) // WrapNotFoundError wrap error as NotFoundError when it is orm.ErrNoRows otherwise return err -func WrapNotFoundError(err error, format string, args ...interface{}) error { +func WrapNotFoundError(err error, format string, args ...any) error { if e := AsNotFoundError(err, format, args...); e != nil { return e } @@ -39,7 +39,7 @@ func WrapNotFoundError(err error, format string, args ...interface{}) error { } // WrapConflictError wrap error as ConflictError when it is duplicate key error otherwise return err -func WrapConflictError(err error, format string, args ...interface{}) error { +func WrapConflictError(err error, format string, args ...any) error { if e := AsConflictError(err, format, args...); e != nil { return e } @@ -49,7 +49,7 @@ func WrapConflictError(err error, format string, args ...interface{}) error { // AsNotFoundError checks whether the err is orm.ErrNoRows. If it it, wrap it // as a src/internal/error.Error with not found error code, else return nil -func AsNotFoundError(err error, messageFormat string, args ...interface{}) *errors.Error { +func AsNotFoundError(err error, messageFormat string, args ...any) *errors.Error { if errors.Is(err, orm.ErrNoRows) { e := errors.NotFoundError(nil) if len(messageFormat) > 0 { @@ -62,7 +62,7 @@ func AsNotFoundError(err error, messageFormat string, args ...interface{}) *erro // AsConflictError checks whether the err is duplicate key error. If it is, wrap it // as a src/internal/error.Error with conflict error code, else return nil -func AsConflictError(err error, messageFormat string, args ...interface{}) *errors.Error { +func AsConflictError(err error, messageFormat string, args ...any) *errors.Error { if IsDuplicateKeyError(err) { e := errors.New(err). WithCode(errors.ConflictCode). @@ -74,7 +74,7 @@ func AsConflictError(err error, messageFormat string, args ...interface{}) *erro // AsForeignKeyError checks whether the err is violating foreign key constraint error. If it it, wrap it // as a src/internal/error.Error with violating foreign key constraint error code, else return nil -func AsForeignKeyError(err error, messageFormat string, args ...interface{}) *errors.Error { +func AsForeignKeyError(err error, messageFormat string, args ...any) *errors.Error { if isViolatingForeignKeyConstraintError(err) { e := errors.New(err). WithCode(errors.ViolateForeignKeyConstraintCode). diff --git a/src/lib/orm/metadata.go b/src/lib/orm/metadata.go index f4144266780..fc648b4b69d 100644 --- a/src/lib/orm/metadata.go +++ b/src/lib/orm/metadata.go @@ -34,7 +34,7 @@ var ( type key struct { Name string Filterable bool - FilterFunc func(context.Context, orm.QuerySeter, string, interface{}) orm.QuerySeter + FilterFunc func(context.Context, orm.QuerySeter, string, any) orm.QuerySeter Sortable bool } @@ -60,7 +60,7 @@ func (m *metadata) Sortable(key string) bool { } // parse the definition of the provided model(fields/methods/annotations) and return the parsed metadata -func parseModel(model interface{}) *metadata { +func parseModel(model any) *metadata { // pointer type ptr := reflect.TypeOf(model) // struct type @@ -116,7 +116,7 @@ func parseModel(model interface{}) *metadata { if !methodValue.IsValid() { continue } - filterFunc, ok := methodValue.Interface().(func(context.Context, orm.QuerySeter, string, interface{}) orm.QuerySeter) + filterFunc, ok := methodValue.Interface().(func(context.Context, orm.QuerySeter, string, any) orm.QuerySeter) if !ok { continue } diff --git a/src/lib/orm/metadata_test.go b/src/lib/orm/metadata_test.go index a6bc72e758d..dcdae710700 100644 --- a/src/lib/orm/metadata_test.go +++ b/src/lib/orm/metadata_test.go @@ -32,7 +32,7 @@ type foo struct { Field4 string `sort:"default:desc"` } -func (f *foo) FilterByField5(context.Context, orm.QuerySeter, string, interface{}) orm.QuerySeter { +func (f *foo) FilterByField5(context.Context, orm.QuerySeter, string, any) orm.QuerySeter { return nil } diff --git a/src/lib/orm/orm.go b/src/lib/orm/orm.go index a04d4831979..03a4edf445f 100644 --- a/src/lib/orm/orm.go +++ b/src/lib/orm/orm.go @@ -45,7 +45,7 @@ type ParamsList = orm.ParamsList type QuerySeter = orm.QuerySeter // RegisterModel ... -func RegisterModel(models ...interface{}) { +func RegisterModel(models ...any) { orm.RegisterModel(models...) } @@ -176,7 +176,7 @@ func WithTransaction(f func(ctx context.Context) error) func(ctx context.Context } // ReadOrCreate read or create instance to database, retry to read when met a duplicate key error after the creating -func ReadOrCreate(ctx context.Context, md interface{}, col1 string, cols ...string) (created bool, id int64, err error) { +func ReadOrCreate(ctx context.Context, md any, col1 string, cols ...string) (created bool, id int64, err error) { getter, ok := md.(interface { GetID() int64 }) @@ -237,7 +237,7 @@ func ReadOrCreate(ctx context.Context, md interface{}, col1 string, cols ...stri // The sql should return the ID list with the specific condition(e.g. select id from table1 where column1=?) // The sql runs as a prepare statement with the "?" be populated rather than concat string directly // The returning in clause is a string like "IN (id1, id2, id3, ...)" -func CreateInClause(ctx context.Context, sql string, args ...interface{}) (string, error) { +func CreateInClause(ctx context.Context, sql string, args ...any) (string, error) { ormer, err := FromContext(ctx) if err != nil { return "", err diff --git a/src/lib/orm/query.go b/src/lib/orm/query.go index 373569a2571..77271030ab1 100644 --- a/src/lib/orm/query.go +++ b/src/lib/orm/query.go @@ -39,7 +39,7 @@ import ( // // // support filter by "Field6", "field6" // -// func (f *Foo) FilterByField6(ctx context.Context, qs orm.QuerySetter, key string, value interface{}) orm.QuerySetter { +// func (f *Foo) FilterByField6(ctx context.Context, qs orm.QuerySetter, key string, value any) orm.QuerySetter { // ... // return qs // } @@ -72,7 +72,7 @@ type Config struct { type Option func(*Config) -func QuerySetter(ctx context.Context, model interface{}, query *q.Query, options ...Option) (orm.QuerySeter, error) { +func QuerySetter(ctx context.Context, model any, query *q.Query, options ...Option) (orm.QuerySeter, error) { t := reflect.TypeOf(model) if t.Kind() != reflect.Ptr { return nil, fmt.Errorf(" cannot use non-ptr model struct `%s`", getFullName(t.Elem())) @@ -128,7 +128,7 @@ func newConfig(opts ...Option) *Config { // select a, b, c from mytable order by a limit ? offset ? // it appends the " limit ? offset ? " to sql, // and appends the limit value and offset value to the params of this query -func PaginationOnRawSQL(query *q.Query, sql string, params []interface{}) (string, []interface{}) { +func PaginationOnRawSQL(query *q.Query, sql string, params []any) (string, []any) { if query != nil && query.PageSize > 0 { sql += ` limit ?` params = append(params, query.PageSize) @@ -142,7 +142,7 @@ func PaginationOnRawSQL(query *q.Query, sql string, params []interface{}) (strin } // QuerySetterForCount creates the query setter used for count with the sort and pagination information ignored -func QuerySetterForCount(ctx context.Context, model interface{}, query *q.Query, _ ...string) (orm.QuerySeter, error) { +func QuerySetterForCount(ctx context.Context, model any, query *q.Query, _ ...string) (orm.QuerySeter, error) { query = q.MustClone(query) query.Sorts = nil query.PageSize = 0 diff --git a/src/lib/orm/test/orm_test.go b/src/lib/orm/test/orm_test.go index b9046c931e4..9331f684224 100644 --- a/src/lib/orm/test/orm_test.go +++ b/src/lib/orm/test/orm_test.go @@ -418,7 +418,7 @@ func (suite *OrmSuite) TestPaginationOnRawSQL() { PageSize: 10, } sql := "select * from harbor_user where user_id > ? order by user_name " - params := []interface{}{2} + params := []any{2} sql, params = PaginationOnRawSQL(query, sql, params) suite.Equal("select * from harbor_user where user_id > ? order by user_name limit ? offset ?", sql) suite.Equal(int64(10), params[1]) diff --git a/src/lib/q/builder.go b/src/lib/q/builder.go index da9fd49bc71..da501c96112 100644 --- a/src/lib/q/builder.go +++ b/src/lib/q/builder.go @@ -47,8 +47,8 @@ func Build(q, sort string, pageNumber, pageSize int64) (*Query, error) { }, nil } -func parseKeywords(q string) (map[string]interface{}, error) { - keywords := map[string]interface{}{} +func parseKeywords(q string) (map[string]any, error) { + keywords := map[string]any{} if len(q) == 0 { return keywords, nil } @@ -97,7 +97,7 @@ func ParseSorting(sort string) []*Sort { return sorts } -func parsePattern(value string) (interface{}, error) { +func parsePattern(value string) (any, error) { // empty string if len(value) == 0 { return value, nil @@ -167,7 +167,7 @@ func parseAndList(value string) (*AndList, error) { return al, nil } -func parseList(value string, c rune) ([]interface{}, error) { +func parseList(value string, c rune) ([]any, error) { length := len(value) if c == '{' && value[length-1] != '}' { return nil, fmt.Errorf(`or list must start with "{" and end with "}"`) @@ -175,7 +175,7 @@ func parseList(value string, c rune) ([]interface{}, error) { if c == '(' && value[length-1] != ')' { return nil, fmt.Errorf(`and list must start with "(" and end with ")"`) } - var vs []interface{} + var vs []any strs := strings.Split(value[1:length-1], " ") for _, str := range strs { v := parseValue(str) @@ -188,7 +188,7 @@ func parseList(value string, c rune) ([]interface{}, error) { } // try to parse value as time first, then integer, and last string -func parseValue(value string) interface{} { +func parseValue(value string) any { value = strings.TrimSpace(value) // try to parse time time, err := time.Parse("2006-01-02T15:04:05", value) diff --git a/src/lib/q/query.go b/src/lib/q/query.go index a1cd5339c72..2b21a942a7b 100644 --- a/src/lib/q/query.go +++ b/src/lib/q/query.go @@ -15,7 +15,7 @@ package q // KeyWords ... -type KeyWords = map[string]interface{} +type KeyWords = map[string]any // Query parameters type Query struct { @@ -51,7 +51,7 @@ func New(kw KeyWords) *Query { // or returns a new Query instance func MustClone(query *Query) *Query { q := &Query{ - Keywords: map[string]interface{}{}, + Keywords: map[string]any{}, } if query != nil { q.PageNumber = query.PageNumber @@ -77,18 +77,18 @@ type Sort struct { // Range query type Range struct { - Min interface{} - Max interface{} + Min any + Max any } // AndList query type AndList struct { - Values []interface{} + Values []any } // OrList query type OrList struct { - Values []interface{} + Values []any } // FuzzyMatchValue query @@ -105,7 +105,7 @@ func NewSort(key string, desc bool) *Sort { } // NewRange creates a new range -func NewRange(minVal, maxVal interface{}) *Range { +func NewRange(minVal, maxVal any) *Range { return &Range{ Min: minVal, Max: maxVal, @@ -113,14 +113,14 @@ func NewRange(minVal, maxVal interface{}) *Range { } // NewAndList creates a new and list -func NewAndList(values []interface{}) *AndList { +func NewAndList(values []any) *AndList { return &AndList{ Values: values, } } // NewOrList creates a new or list -func NewOrList(values []interface{}) *OrList { +func NewOrList(values []any) *OrList { return &OrList{ Values: values, } diff --git a/src/lib/selector/selector.go b/src/lib/selector/selector.go index 68e07aef8eb..f258bf4ed43 100644 --- a/src/lib/selector/selector.go +++ b/src/lib/selector/selector.go @@ -28,5 +28,5 @@ type Selector interface { // Factory is factory method to return a selector implementation // Pattern can be any type of data. -// TODO: 'extras' can also be an optional interface{} to accept more complicated data. -type Factory func(decoration string, pattern interface{}, extras string) Selector +// TODO: 'extras' can also be an optional any to accept more complicated data. +type Factory func(decoration string, pattern any, extras string) Selector diff --git a/src/lib/selector/selectors/doublestar/selector.go b/src/lib/selector/selectors/doublestar/selector.go index 2e3c2853478..669839bd65f 100644 --- a/src/lib/selector/selectors/doublestar/selector.go +++ b/src/lib/selector/selectors/doublestar/selector.go @@ -134,7 +134,7 @@ func (s *selector) tagSelectExclude(artifact *iselector.Candidate) (selected boo } // New is factory method for doublestar selector -func New(decoration string, pattern interface{}, extras string) iselector.Selector { +func New(decoration string, pattern any, extras string) iselector.Selector { untagged := true // default behavior for upgrade, active keep the untagged images if decoration == Excludes { untagged = false diff --git a/src/lib/selector/selectors/index/index.go b/src/lib/selector/selectors/index/index.go index 5e786462405..6fb40b2a9bc 100644 --- a/src/lib/selector/selectors/index/index.go +++ b/src/lib/selector/selectors/index/index.go @@ -94,7 +94,7 @@ func Get(kind, decoration, pattern, extras string) (selector.Selector, error) { func Index() []*IndexedMeta { all := make([]*IndexedMeta, 0) - index.Range(func(_, v interface{}) bool { + index.Range(func(_, v any) bool { if item, ok := v.(*indexedItem); ok { all = append(all, item.Meta) return true diff --git a/src/lib/selector/selectors/label/selector.go b/src/lib/selector/selectors/label/selector.go index fcea7df7f2f..a06cd9fcce9 100644 --- a/src/lib/selector/selectors/label/selector.go +++ b/src/lib/selector/selectors/label/selector.go @@ -50,7 +50,7 @@ func (s *selector) Select(artifacts []*iselector.Candidate) (selected []*iselect } // New is factory method for label selector -func New(decoration string, pattern interface{}, _ string) iselector.Selector { +func New(decoration string, pattern any, _ string) iselector.Selector { labels := make([]string, 0) if pattern != nil { diff --git a/src/lib/selector/selectors/severity/selector.go b/src/lib/selector/selectors/severity/selector.go index 8a81acf1f0d..22291c01c0b 100644 --- a/src/lib/selector/selectors/severity/selector.go +++ b/src/lib/selector/selectors/severity/selector.go @@ -82,7 +82,7 @@ func (s *selector) Select(artifacts []*sl.Candidate) (selected []*sl.Candidate, } // New is factory method for vulnerability severity selector -func New(decoration string, pattern interface{}, _ string) sl.Selector { +func New(decoration string, pattern any, _ string) sl.Selector { var sev int if pattern != nil { sev, _ = pattern.(int) diff --git a/src/lib/selector/selectors/signature/selector.go b/src/lib/selector/selectors/signature/selector.go index 27c3b3fb457..07a5f634654 100644 --- a/src/lib/selector/selectors/signature/selector.go +++ b/src/lib/selector/selectors/signature/selector.go @@ -64,7 +64,7 @@ func (s *selector) Select(artifacts []*sl.Candidate) (selected []*sl.Candidate, } // New is factory method for signature selector -func New(decoration string, pattern interface{}, _ string) sl.Selector { +func New(decoration string, pattern any, _ string) sl.Selector { var e bool if pattern != nil { e, _ = pattern.(bool) diff --git a/src/lib/set.go b/src/lib/set.go index fb1b4b923ef..9667220baa8 100644 --- a/src/lib/set.go +++ b/src/lib/set.go @@ -17,23 +17,23 @@ package lib type void = struct{} // Set a simple set -type Set map[interface{}]void +type Set map[any]void // Add add item to set -func (s Set) Add(item interface{}) { +func (s Set) Add(item any) { s[item] = void{} } // Exists returns true when item in the set -func (s Set) Exists(item interface{}) bool { +func (s Set) Exists(item any) bool { _, ok := s[item] return ok } // Items returns the items in the set -func (s Set) Items() []interface{} { - var items []interface{} +func (s Set) Items() []any { + var items []any for item := range s { items = append(items, item) } diff --git a/src/pkg/accessory/dao/dao_test.go b/src/pkg/accessory/dao/dao_test.go index 06e9ae2cccf..8a9967d8b05 100644 --- a/src/pkg/accessory/dao/dao_test.go +++ b/src/pkg/accessory/dao/dao_test.go @@ -110,7 +110,7 @@ func (d *daoTestSuite) TestCount() { d.Require().Nil(err) d.True(total > 0) total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": d.subArtifactDigest, }, }) @@ -132,7 +132,7 @@ func (d *daoTestSuite) TestList() { d.True(found) accs, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": d.subArtifactDigest, }, }) @@ -254,7 +254,7 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Nil(err) accs, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": art.Digest, }, }) @@ -265,14 +265,14 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Len(accs, 2) _, err = d.dao.DeleteAccessories(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": art.Digest, "SubjectArtifactRepo": art.RepositoryName, }, }) d.Require().Nil(err) accs, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": art.Digest, "SubjectArtifactRepo": art.RepositoryName, }, }) diff --git a/src/pkg/artifact/dao/dao.go b/src/pkg/artifact/dao/dao.go index e22e23091a5..9faa47958a7 100644 --- a/src/pkg/artifact/dao/dao.go +++ b/src/pkg/artifact/dao/dao.go @@ -132,7 +132,7 @@ func (d *dao) Get(ctx context.Context, id int64) (*Artifact, error) { func (d *dao) GetByDigest(ctx context.Context, repository, digest string) (*Artifact, error) { qs, err := orm.QuerySetter(ctx, &Artifact{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryName": repository, "Digest": digest, }, @@ -212,7 +212,7 @@ func (d *dao) UpdatePullTime(ctx context.Context, id int64, pullTime time.Time) formatPullTime := pullTime.Format("2006-01-02 15:04:05.999999") // update db only if pull_time is null or pull_time < (in-coming)pullTime sql := "UPDATE artifact SET pull_time = ? WHERE id = ? AND (pull_time IS NULL OR pull_time < ?)" - args := []interface{}{formatPullTime, id, formatPullTime} + args := []any{formatPullTime, id, formatPullTime} _, err = ormer.Raw(sql, args...).Exec() if err != nil { @@ -273,7 +273,7 @@ func (d *dao) DeleteReferences(ctx context.Context, parentID int64) error { return err } qs, err := orm.QuerySetter(ctx, &ArtifactReference{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "parent_id": parentID, }, }) @@ -299,16 +299,16 @@ func (d *dao) ListWithLatest(ctx context.Context, query *q.Query) (artifacts []* GROUP BY repository_name ) latest ON a.repository_name = latest.repository_name AND a.push_time = latest.latest_push_time` - queryParam := make([]interface{}, 0) + queryParam := make([]any, 0) var ok bool - var pid interface{} + var pid any if pid, ok = query.Keywords["ProjectID"]; !ok { return nil, errors.New(nil).WithCode(errors.BadRequestCode). WithMessage(`the value of "ProjectID" must be set`) } queryParam = append(queryParam, pid) - var attributionValue interface{} + var attributionValue any if attributionValue, ok = query.Keywords["media_type"]; ok { sql = fmt.Sprintf(sql, "media_type") } else if attributionValue, ok = query.Keywords["artifact_type"]; ok { diff --git a/src/pkg/artifact/dao/dao_test.go b/src/pkg/artifact/dao/dao_test.go index 08b448fba83..abd612c6cf1 100644 --- a/src/pkg/artifact/dao/dao_test.go +++ b/src/pkg/artifact/dao/dao_test.go @@ -144,7 +144,7 @@ func (d *daoTestSuite) TearDownTest() { func (d *daoTestSuite) TestCount() { // query by repository ID: both tagged and untagged artifacts totalOfAll, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, }) @@ -153,7 +153,7 @@ func (d *daoTestSuite) TestCount() { // only query tagged artifacts totalOfTagged, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "*", }, @@ -163,7 +163,7 @@ func (d *daoTestSuite) TestCount() { // only query untagged artifacts totalOfUnTagged, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "nil", }, @@ -173,7 +173,7 @@ func (d *daoTestSuite) TestCount() { // specific tag value total, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "latest", }, @@ -183,7 +183,7 @@ func (d *daoTestSuite) TestCount() { // query by repository ID and digest total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Digest": "parent_digest", }, @@ -193,7 +193,7 @@ func (d *daoTestSuite) TestCount() { // set pagination in query total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, PageNumber: 1, @@ -206,7 +206,7 @@ func (d *daoTestSuite) TestCount() { func (d *daoTestSuite) TestList() { // query by repository ID: both tagged and untagged artifacts artifacts, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, }) @@ -235,7 +235,7 @@ func (d *daoTestSuite) TestList() { // only query tagged artifacts artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "*", }, @@ -264,7 +264,7 @@ func (d *daoTestSuite) TestList() { // only query untagged artifacts artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "nil", }, @@ -293,7 +293,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and digest artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Digest": "parent_digest", }, @@ -304,7 +304,7 @@ func (d *daoTestSuite) TestList() { // set pagination in query artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, PageNumber: 1, @@ -446,7 +446,7 @@ func (d *daoTestSuite) TestCreateReference() { func (d *daoTestSuite) TestListReferences() { references, err := d.dao.ListReferences(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ParentID": d.parentArtID, "ChildID": d.childArt01ID, }, @@ -526,7 +526,7 @@ func (d *daoTestSuite) TestListWithLatest() { d.Require().Nil(err) latest, err := d.dao.ListWithLatest(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": 1234, "media_type": v1.MediaTypeImageConfig, }, diff --git a/src/pkg/artifact/model.go b/src/pkg/artifact/model.go index cdf187e627f..7a2d84f45f0 100644 --- a/src/pkg/artifact/model.go +++ b/src/pkg/artifact/model.go @@ -30,22 +30,22 @@ import ( // underlying concrete detail and provides an unified artifact view // for all users. type Artifact struct { - ID int64 `json:"id"` - Type string `json:"type"` // image, chart or other OCI compatible - MediaType string `json:"media_type"` // the media type of artifact. Mostly, it's the value of `manifest.config.mediatype` - ManifestMediaType string `json:"manifest_media_type"` // the media type of manifest/index - ArtifactType string `json:"artifact_type"` // the artifactType of manifest/index - ProjectID int64 `json:"project_id"` - RepositoryID int64 `json:"repository_id"` - RepositoryName string `json:"repository_name"` - Digest string `json:"digest"` - Size int64 `json:"size"` - Icon string `json:"icon"` - PushTime time.Time `json:"push_time"` - PullTime time.Time `json:"pull_time"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` // only contains the simple attributes specific for the different artifact type, most of them should come from the config layer - Annotations map[string]string `json:"annotations"` - References []*Reference `json:"references"` // child artifacts referenced by the parent artifact if the artifact is an index + ID int64 `json:"id"` + Type string `json:"type"` // image, chart or other OCI compatible + MediaType string `json:"media_type"` // the media type of artifact. Mostly, it's the value of `manifest.config.mediatype` + ManifestMediaType string `json:"manifest_media_type"` // the media type of manifest/index + ArtifactType string `json:"artifact_type"` // the artifactType of manifest/index + ProjectID int64 `json:"project_id"` + RepositoryID int64 `json:"repository_id"` + RepositoryName string `json:"repository_name"` + Digest string `json:"digest"` + Size int64 `json:"size"` + Icon string `json:"icon"` + PushTime time.Time `json:"push_time"` + PullTime time.Time `json:"pull_time"` + ExtraAttrs map[string]any `json:"extra_attrs"` // only contains the simple attributes specific for the different artifact type, most of them should come from the config layer + Annotations map[string]string `json:"annotations"` + References []*Reference `json:"references"` // child artifacts referenced by the parent artifact if the artifact is an index } // ResolveArtifactType returns the artifact type of the artifact, prefer ArtifactType, use MediaType if ArtifactType is empty. @@ -82,7 +82,7 @@ func (a *Artifact) From(art *dao.Artifact) { a.Icon = art.Icon a.PushTime = art.PushTime a.PullTime = art.PullTime - a.ExtraAttrs = map[string]interface{}{} + a.ExtraAttrs = map[string]any{} a.Annotations = map[string]string{} if len(art.ExtraAttrs) > 0 { if err := json.Unmarshal([]byte(art.ExtraAttrs), &a.ExtraAttrs); err != nil { diff --git a/src/pkg/artifact/model_test.go b/src/pkg/artifact/model_test.go index 24bd77eba07..02aecdab6ac 100644 --- a/src/pkg/artifact/model_test.go +++ b/src/pkg/artifact/model_test.go @@ -78,7 +78,7 @@ func (m *modelTestSuite) TestArtifactTo() { Size: 1024, PushTime: time.Now(), PullTime: time.Now(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "attr1": "value1", }, Annotations: map[string]string{ diff --git a/src/pkg/audit/dao/dao.go b/src/pkg/audit/dao/dao.go index 09e87c5ee7e..21828621c56 100644 --- a/src/pkg/audit/dao/dao.go +++ b/src/pkg/audit/dao/dao.go @@ -51,7 +51,7 @@ func New() DAO { return &dao{} } -var allowedMaps = map[string]interface{}{ +var allowedMaps = map[string]any{ strings.ToLower(rbac.ActionPull.String()): struct{}{}, strings.ToLower(rbac.ActionCreate.String()): struct{}{}, strings.ToLower(rbac.ActionDelete.String()): struct{}{}, diff --git a/src/pkg/audit/dao/dao_test.go b/src/pkg/audit/dao/dao_test.go index b1103adb493..ee3a01ccab1 100644 --- a/src/pkg/audit/dao/dao_test.go +++ b/src/pkg/audit/dao/dao_test.go @@ -65,7 +65,7 @@ func (d *daoTestSuite) TestCount() { d.Require().Nil(err) d.True(total > 0) total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "library/test-audit", }, }) @@ -80,7 +80,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and name audits, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "library/test-audit", }, }) @@ -134,7 +134,7 @@ func (d *daoTestSuite) TestListPIDs() { ol.Values = append(ol.Values, item) } audits, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": ol, }, }) diff --git a/src/pkg/auditext/dao/dao_test.go b/src/pkg/auditext/dao/dao_test.go index 76ada028496..f1387ec178b 100644 --- a/src/pkg/auditext/dao/dao_test.go +++ b/src/pkg/auditext/dao/dao_test.go @@ -68,7 +68,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and name audits, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "user01", }, }) @@ -94,7 +94,7 @@ func (d *daoTestSuite) TestCount() { d.Require().Nil(err) d.True(total > 0) total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "user01", }, }) @@ -135,7 +135,7 @@ func (d *daoTestSuite) TestListPIDs() { ol.Values = append(ol.Values, item) } audits, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": ol, }, }) diff --git a/src/pkg/auditext/event/utils.go b/src/pkg/auditext/event/utils.go index 5f3406c0623..e79c67ff43d 100644 --- a/src/pkg/auditext/event/utils.go +++ b/src/pkg/auditext/event/utils.go @@ -26,7 +26,7 @@ func Redact(payload string, sensitiveAttributes []string) string { if len(payload) == 0 { return "" } - var jsonData map[string]interface{} + var jsonData map[string]any if err := json.Unmarshal([]byte(payload), &jsonData); err != nil { log.Fatalf("Error parsing JSON: %v", err) return "" @@ -42,15 +42,15 @@ func Redact(payload string, sensitiveAttributes []string) string { } // replacePassword recursively replaces attribute in maskAttributes's value with "***" -func replacePassword(data map[string]interface{}, maskAttributes []string) { +func replacePassword(data map[string]any, maskAttributes []string) { for key, value := range data { if slices.Contains(maskAttributes, key) { data[key] = "***" - } else if nestedMap, ok := value.(map[string]interface{}); ok { + } else if nestedMap, ok := value.(map[string]any); ok { replacePassword(nestedMap, maskAttributes) - } else if nestedArray, ok := value.([]interface{}); ok { + } else if nestedArray, ok := value.([]any); ok { for _, item := range nestedArray { - if itemMap, ok := item.(map[string]interface{}); ok { + if itemMap, ok := item.(map[string]any); ok { replacePassword(itemMap, maskAttributes) } } diff --git a/src/pkg/auditext/event/utils_test.go b/src/pkg/auditext/event/utils_test.go index a46e268fa86..872ea430a8f 100644 --- a/src/pkg/auditext/event/utils_test.go +++ b/src/pkg/auditext/event/utils_test.go @@ -44,15 +44,15 @@ func TestRedact(t *testing.T) { func Test_replacePassword(t *testing.T) { type args struct { - data map[string]interface{} + data map[string]any maskAttributes []string } tests := []struct { name string args args }{ - {"normal case", args{map[string]interface{}{"password": "123456"}, []string{"password"}}}, - {"nested case", args{map[string]interface{}{"master": map[string]interface{}{"password": "123456"}}, []string{"password"}}}, + {"normal case", args{map[string]any{"password": "123456"}, []string{"password"}}}, + {"nested case", args{map[string]any{"master": map[string]any{"password": "123456"}}, []string{"password"}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -60,8 +60,8 @@ func Test_replacePassword(t *testing.T) { if val, ok := tt.args.data["password"]; ok && val != nil && tt.args.data["password"] != "***" { t.Errorf("replacePassword() = %v, want %v", tt.args.data["password"], "***") } - if val, ok := tt.args.data["master"]; ok && val != nil && tt.args.data["master"].(map[string]interface{})["password"] != "***" { - t.Errorf("replacePassword() = %v, want %v", tt.args.data["master"].(map[string]interface{})["password"], "***") + if val, ok := tt.args.data["master"]; ok && val != nil && tt.args.data["master"].(map[string]any)["password"] != "***" { + t.Errorf("replacePassword() = %v, want %v", tt.args.data["master"].(map[string]any)["password"], "***") } }) } diff --git a/src/pkg/blob/dao/dao.go b/src/pkg/blob/dao/dao.go index ba5aa67a1fa..efac1ea70b1 100644 --- a/src/pkg/blob/dao/dao.go +++ b/src/pkg/blob/dao/dao.go @@ -195,7 +195,7 @@ func (d *dao) UpdateBlobStatus(ctx context.Context, blob *models.Blob) (int64, e } var newVersion int64 - params := []interface{}{time.Now(), blob.Status, blob.ID, blob.Version} + params := []any{time.Now(), blob.Status, blob.ID, blob.Version} stats := models.StatusMap[blob.Status] for _, stat := range stats { params = append(params, stat) @@ -247,7 +247,7 @@ func (d *dao) FindBlobsShouldUnassociatedWithProject(ctx context.Context, projec } sql := `SELECT b.digest_blob FROM artifact a, artifact_blob b WHERE a.digest = b.digest_af AND a.project_id = ? AND b.digest_blob IN (%s)` - params := []interface{}{projectID} + params := []any{projectID} for _, blob := range blobs { params = append(params, blob.Digest) } @@ -279,10 +279,10 @@ func (d *dao) SumBlobsSizeByProject(ctx context.Context, projectID int64, exclud return 0, err } - params := []interface{}{projectID} + params := []any{projectID} sql := `SELECT SUM(size) FROM blob JOIN project_blob ON blob.id = project_blob.blob_id AND project_id = ?` if excludeForeignLayer { - foreignLayerTypes := []interface{}{ + foreignLayerTypes := []any{ schema2.MediaTypeForeignLayer, } @@ -305,10 +305,10 @@ func (d *dao) SumBlobsSize(ctx context.Context, excludeForeignLayer bool) (int64 return 0, err } - params := []interface{}{} + params := []any{} sql := `SELECT SUM(size) FROM blob` if excludeForeignLayer { - foreignLayerTypes := []interface{}{ + foreignLayerTypes := []any{ schema2.MediaTypeForeignLayer, } sql = fmt.Sprintf(`%s Where content_type NOT IN (%s)`, sql, orm.ParamPlaceholderForIn(len(foreignLayerTypes))) diff --git a/src/pkg/blob/dao/dao_test.go b/src/pkg/blob/dao/dao_test.go index 69771a89fa2..8c7d2b668c7 100644 --- a/src/pkg/blob/dao/dao_test.go +++ b/src/pkg/blob/dao/dao_test.go @@ -206,7 +206,7 @@ func (suite *DaoTestSuite) TestListBlobs() { suite.dao.CreateBlob(ctx, &models.Blob{Digest: digest2}) ol := q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, }, } @@ -216,7 +216,7 @@ func (suite *DaoTestSuite) TestListBlobs() { } ol = q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, digest2, }, diff --git a/src/pkg/blob/manager_test.go b/src/pkg/blob/manager_test.go index 8ed541970f3..59a03602283 100644 --- a/src/pkg/blob/manager_test.go +++ b/src/pkg/blob/manager_test.go @@ -38,7 +38,7 @@ func (suite *ManagerTestSuite) SetupSuite() { func (suite *ManagerTestSuite) isAssociatedWithArtifact(ctx context.Context, blobDigest, artifactDigest string) (bool, error) { ol := q.OrList{ - Values: []interface{}{ + Values: []any{ blobDigest, }, } @@ -52,7 +52,7 @@ func (suite *ManagerTestSuite) isAssociatedWithArtifact(ctx context.Context, blo func (suite *ManagerTestSuite) isAssociatedWithProject(ctx context.Context, blobDigest string, projectID int64) (bool, error) { ol := q.OrList{ - Values: []interface{}{ + Values: []any{ blobDigest, }, } @@ -304,7 +304,7 @@ func (suite *ManagerTestSuite) TestList() { digest2 := suite.DigestString() ol := q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, digest2, }, @@ -317,7 +317,7 @@ func (suite *ManagerTestSuite) TestList() { Mgr.Create(ctx, digest2, "media type", 100) ol = q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, digest2, }, diff --git a/src/pkg/blob/models/blob.go b/src/pkg/blob/models/blob.go index 541b5eed5b3..3f5a0a2f39c 100644 --- a/src/pkg/blob/models/blob.go +++ b/src/pkg/blob/models/blob.go @@ -123,7 +123,7 @@ func (b *Blob) IsManifest() bool { } // FilterByArtifactDigest returns orm.QuerySeter with artifact digest filter -func (b *Blob) FilterByArtifactDigest(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (b *Blob) FilterByArtifactDigest(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { v, ok := value.(string) if !ok { return qs @@ -133,7 +133,7 @@ func (b *Blob) FilterByArtifactDigest(_ context.Context, qs orm.QuerySeter, _ st } // FilterByArtifactDigests returns orm.QuerySeter with artifact digests filter -func (b *Blob) FilterByArtifactDigests(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (b *Blob) FilterByArtifactDigests(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { artifactDigests, ok := value.([]string) if !ok { return qs @@ -148,7 +148,7 @@ func (b *Blob) FilterByArtifactDigests(_ context.Context, qs orm.QuerySeter, _ s } // FilterByProjectID returns orm.QuerySeter with project id filter -func (b *Blob) FilterByProjectID(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (b *Blob) FilterByProjectID(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { projectID, ok := value.(int64) if !ok { return qs diff --git a/src/pkg/cached/base_manager.go b/src/pkg/cached/base_manager.go index e98c11dbd98..fda307aba9b 100644 --- a/src/pkg/cached/base_manager.go +++ b/src/pkg/cached/base_manager.go @@ -39,7 +39,7 @@ func (*cacheClient) Delete(ctx context.Context, key string) error { return cache.LayerCache().Delete(ctx, key) } -func (*cacheClient) Fetch(ctx context.Context, key string, value interface{}) error { +func (*cacheClient) Fetch(ctx context.Context, key string, value any) error { return cache.LayerCache().Fetch(ctx, key, value) } @@ -47,7 +47,7 @@ func (*cacheClient) Ping(ctx context.Context) error { return cache.LayerCache().Ping(ctx) } -func (*cacheClient) Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (*cacheClient) Save(ctx context.Context, key string, value any, expiration ...time.Duration) error { // intercept here // it should ignore save cache if this request is wrapped by orm.Transaction, // because if tx rollback, we can not rollback cache, diff --git a/src/pkg/cached/base_manager_test.go b/src/pkg/cached/base_manager_test.go index 5db2613f9ea..c0c89d012c6 100644 --- a/src/pkg/cached/base_manager_test.go +++ b/src/pkg/cached/base_manager_test.go @@ -33,7 +33,7 @@ type testCache struct { iterator *testcache.Iterator } -func (tc *testCache) Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (tc *testCache) Save(ctx context.Context, key string, value any, expiration ...time.Duration) error { if orm.HasCommittedKey(ctx) { return nil } diff --git a/src/pkg/cached/manager.go b/src/pkg/cached/manager.go index d2a0b714023..9ac21a28040 100644 --- a/src/pkg/cached/manager.go +++ b/src/pkg/cached/manager.go @@ -68,7 +68,7 @@ func NewObjectKey(ns string) *ObjectKey { // Format formats fields to string. // eg. namespace: 'artifact' // Format("id", 100, "digest", "aaa"): "artifact:id:100:digest:aaa" -func (ok *ObjectKey) Format(keysAndValues ...interface{}) (string, error) { +func (ok *ObjectKey) Format(keysAndValues ...any) (string, error) { // keysAndValues must be paired. if len(keysAndValues)%2 != 0 { return "", errors.Errorf("invalid keysAndValues: %v", keysAndValues...) diff --git a/src/pkg/cached/project/redis/manager.go b/src/pkg/cached/project/redis/manager.go index da945b817d2..6cb611142ba 100644 --- a/src/pkg/cached/project/redis/manager.go +++ b/src/pkg/cached/project/redis/manager.go @@ -95,7 +95,7 @@ func (m *Manager) Delete(ctx context.Context, id int64) error { return nil } -func (m *Manager) Get(ctx context.Context, idOrName interface{}) (*models.Project, error) { +func (m *Manager) Get(ctx context.Context, idOrName any) (*models.Project, error) { var ( key string err error diff --git a/src/pkg/chart/model.go b/src/pkg/chart/model.go index 9454f086db0..3229f78b65a 100644 --- a/src/pkg/chart/model.go +++ b/src/pkg/chart/model.go @@ -23,7 +23,7 @@ import ( // VersionDetails keeps the detailed data info of the chart version type VersionDetails struct { Dependencies []*helm_chart.Dependency `json:"dependencies"` - Values map[string]interface{} `json:"values"` + Values map[string]any `json:"values"` Files map[string]string `json:"files"` Security *SecurityReport `json:"security"` } diff --git a/src/pkg/chart/operator.go b/src/pkg/chart/operator.go index d3ce0fc6a37..8e8176912ba 100644 --- a/src/pkg/chart/operator.go +++ b/src/pkg/chart/operator.go @@ -70,7 +70,7 @@ func (cho *operator) GetDetails(content []byte) (*VersionDetails, error) { depts = chartData.Metadata.Dependencies } - var values map[string]interface{} + var values map[string]any files := make(map[string]string) // Parse values if chartData.Values != nil { @@ -130,14 +130,14 @@ func (cho *operator) GetData(content []byte) (*helm_chart.Chart, error) { } // Recursively read value -func readValue(values map[string]interface{}, keyPrefix string, valueMap map[string]interface{}) { +func readValue(values map[string]any, keyPrefix string, valueMap map[string]any) { for key, value := range values { longKey := key if keyPrefix != "" { longKey = fmt.Sprintf("%s.%s", keyPrefix, key) } - if subValues, ok := value.(map[string]interface{}); ok { + if subValues, ok := value.(map[string]any); ok { readValue(subValues, longKey, valueMap) } else { valueMap[longKey] = value diff --git a/src/pkg/config/db/cache.go b/src/pkg/config/db/cache.go index 2c69f4c9feb..902b85eaf8b 100644 --- a/src/pkg/config/db/cache.go +++ b/src/pkg/config/db/cache.go @@ -32,12 +32,12 @@ type Cache struct { } // Load - load config from database, only user setting will be load from database. -func (d *Cache) Load(ctx context.Context) (map[string]interface{}, error) { - f := func() (interface{}, error) { +func (d *Cache) Load(ctx context.Context) (map[string]any, error) { + f := func() (any, error) { return d.driver.Load(ctx) } - result := map[string]interface{}{} + result := map[string]any{} // let the cache expired after one minute // because the there no way to rollback the config items been saved when invalidate the cache failed @@ -49,7 +49,7 @@ func (d *Cache) Load(ctx context.Context) (map[string]interface{}, error) { } // Save - Only save user config items in the cfgs map -func (d *Cache) Save(ctx context.Context, cfg map[string]interface{}) error { +func (d *Cache) Save(ctx context.Context, cfg map[string]any) error { if err := d.driver.Save(ctx, cfg); err != nil { return err } diff --git a/src/pkg/config/db/cache_test.go b/src/pkg/config/db/cache_test.go index 50ab312dce0..0f151caa001 100644 --- a/src/pkg/config/db/cache_test.go +++ b/src/pkg/config/db/cache_test.go @@ -33,7 +33,7 @@ func TestCacheLoadAndSave(t *testing.T) { cache, _ := cache.New("redis") driver := NewCacheDriver(cache, &Database{cfgDAO: dao.New()}) - cfgs := map[string]interface{}{ + cfgs := map[string]any{ common.AUTHMode: "db_auth", common.LDAPURL: "ldap://ldap.vmware.com", } @@ -50,7 +50,7 @@ func TestCacheLoadAndSave(t *testing.T) { func BenchmarkCacheLoad(b *testing.B) { ctx := orm.Context() - cfgs := map[string]interface{}{} + cfgs := map[string]any{} for _, item := range metadata.Instance().GetAll() { cfgs[item.Name] = item.DefaultValue } diff --git a/src/pkg/config/db/dao/dao.go b/src/pkg/config/db/dao/dao.go index 8ab731ad76a..809d56ee3de 100644 --- a/src/pkg/config/db/dao/dao.go +++ b/src/pkg/config/db/dao/dao.go @@ -47,7 +47,7 @@ func (d *dao) GetConfigEntries(ctx context.Context) ([]*models.ConfigEntry, erro } var p []*models.ConfigEntry sql := "select * from properties" - n, err := o.Raw(sql, []interface{}{}).QueryRows(&p) + n, err := o.Raw(sql, []any{}).QueryRows(&p) if err != nil { return nil, err diff --git a/src/pkg/config/db/db.go b/src/pkg/config/db/db.go index f0c7e6e3ea5..8be70311eb5 100644 --- a/src/pkg/config/db/db.go +++ b/src/pkg/config/db/db.go @@ -32,8 +32,8 @@ type Database struct { } // Load - load config from database, only user setting will be load from database. -func (d *Database) Load(ctx context.Context) (map[string]interface{}, error) { - resultMap := map[string]interface{}{} +func (d *Database) Load(ctx context.Context) (map[string]any, error) { + resultMap := map[string]any{} configEntries, err := d.cfgDAO.GetConfigEntries(ctx) if err != nil { return resultMap, err @@ -60,7 +60,7 @@ func (d *Database) Load(ctx context.Context) (map[string]interface{}, error) { } // Save - Only save user config items in the cfgs map -func (d *Database) Save(ctx context.Context, cfgs map[string]interface{}) error { +func (d *Database) Save(ctx context.Context, cfgs map[string]any) error { var configEntries []models.ConfigEntry for key, value := range cfgs { if item, ok := metadata.Instance().GetByName(key); ok { diff --git a/src/pkg/config/db/db_test.go b/src/pkg/config/db/db_test.go index 99a9e3871ef..7a561e4f199 100644 --- a/src/pkg/config/db/db_test.go +++ b/src/pkg/config/db/db_test.go @@ -26,7 +26,7 @@ import ( func TestDatabase_Load(t *testing.T) { - cfgs := map[string]interface{}{ + cfgs := map[string]any{ common.AUTHMode: "db_auth", common.LDAPURL: "ldap://ldap.vmware.com", } @@ -50,7 +50,7 @@ func TestDatabase_Save(t *testing.T) { if err != nil { t.Errorf("failed to load config %v", err) } - cfgMap := map[string]interface{}{"ldap_url": ldapURL} + cfgMap := map[string]any{"ldap_url": ldapURL} driver.Save(testCtx, cfgMap) updatedMap, err := driver.Load(testCtx) if err != nil { @@ -62,7 +62,7 @@ func TestDatabase_Save(t *testing.T) { } func BenchmarkDatabaseLoad(b *testing.B) { - cfgs := map[string]interface{}{} + cfgs := map[string]any{} for _, item := range metadata.Instance().GetAll() { cfgs[item.Name] = item.DefaultValue } diff --git a/src/pkg/config/db/manager_test.go b/src/pkg/config/db/manager_test.go index 24ef30acdd1..219d4132694 100644 --- a/src/pkg/config/db/manager_test.go +++ b/src/pkg/config/db/manager_test.go @@ -30,7 +30,7 @@ import ( "github.com/goharbor/harbor/src/pkg/config/store" ) -var TestDBConfig = map[string]interface{}{ +var TestDBConfig = map[string]any{ "postgresql_host": "localhost", "postgresql_database": "registry", "postgresql_password": "root123", @@ -72,7 +72,7 @@ func TestSaveToDatabase(t *testing.T) { } func TestUpdateCfg(t *testing.T) { - testConfig := map[string]interface{}{ + testConfig := map[string]any{ "ldap_url": "ldaps://ldap.vmware.com", "ldap_search_dn": "cn=admin,dc=example,dc=com", "ldap_timeout": 10, @@ -99,7 +99,7 @@ func TestCfgManager_loadDefaultValues(t *testing.T) { func TestCfgManger_loadSystemValues(t *testing.T) { configManager.LoadDefault() configManager.LoadSystemConfigFromEnv() - configManager.UpdateConfig(testCtx, map[string]interface{}{ + configManager.UpdateConfig(testCtx, map[string]any{ "postgresql_host": "127.0.0.1", }) if configManager.Get(testCtx, "postgresql_host").GetString() != "127.0.0.1" { @@ -107,7 +107,7 @@ func TestCfgManger_loadSystemValues(t *testing.T) { } } func TestCfgManager_GetDatabaseCfg(t *testing.T) { - configManager.UpdateConfig(testCtx, map[string]interface{}{ + configManager.UpdateConfig(testCtx, map[string]any{ "postgresql_host": "localhost", "postgresql_database": "registry", "postgresql_password": "root123", @@ -155,7 +155,7 @@ func TestConfigStore_Load(t *testing.T) { func TestToString(t *testing.T) { cases := []struct { name string - value interface{} + value any expect string }{ { diff --git a/src/pkg/config/inmemory/manager.go b/src/pkg/config/inmemory/manager.go index 025166f0df0..2ef9945daaf 100644 --- a/src/pkg/config/inmemory/manager.go +++ b/src/pkg/config/inmemory/manager.go @@ -31,16 +31,16 @@ func init() { // Driver driver for unit testing type Driver struct { sync.Mutex - cfgMap map[string]interface{} + cfgMap map[string]any } // Load load data from driver, for example load from database, // it should be invoked before get any user scope config // for system scope config, because it is immutable, no need to call this method -func (d *Driver) Load(context.Context) (map[string]interface{}, error) { +func (d *Driver) Load(context.Context) (map[string]any, error) { d.Lock() defer d.Unlock() - res := make(map[string]interface{}) + res := make(map[string]any) for k, v := range d.cfgMap { res[k] = v } @@ -48,7 +48,7 @@ func (d *Driver) Load(context.Context) (map[string]interface{}, error) { } // Save only save user config setting to driver, for example: database, REST -func (d *Driver) Save(_ context.Context, cfg map[string]interface{}) error { +func (d *Driver) Save(_ context.Context, cfg map[string]any) error { d.Lock() defer d.Unlock() for k, v := range cfg { @@ -59,7 +59,7 @@ func (d *Driver) Save(_ context.Context, cfg map[string]interface{}) error { // NewInMemoryManager create a manager for unit testing, doesn't involve database or REST func NewInMemoryManager() *config.CfgManager { - manager := &config.CfgManager{Store: store.NewConfigStore(&Driver{cfgMap: map[string]interface{}{}})} + manager := &config.CfgManager{Store: store.NewConfigStore(&Driver{cfgMap: map[string]any{}})} // load default Value manager.LoadDefault() // load system config from env diff --git a/src/pkg/config/inmemory/manager_test.go b/src/pkg/config/inmemory/manager_test.go index ee0bb7ff0b0..b57589b9b99 100644 --- a/src/pkg/config/inmemory/manager_test.go +++ b/src/pkg/config/inmemory/manager_test.go @@ -24,7 +24,7 @@ import ( func TestNewInMemoryManager(t *testing.T) { ctx := context.Background() inMemoryManager := NewInMemoryManager() - inMemoryManager.UpdateConfig(ctx, map[string]interface{}{ + inMemoryManager.UpdateConfig(ctx, map[string]any{ "ldap_url": "ldaps://ldap.vmware.com", "ldap_timeout": 5, "ldap_verify_cert": true, diff --git a/src/pkg/config/manager.go b/src/pkg/config/manager.go index 75215af1c11..c4628c7a37d 100644 --- a/src/pkg/config/manager.go +++ b/src/pkg/config/manager.go @@ -75,8 +75,8 @@ func (c *CfgManager) LoadSystemConfigFromEnv() { } // GetAll get all settings. -func (c *CfgManager) GetAll(ctx context.Context) map[string]interface{} { - resultMap := map[string]interface{}{} +func (c *CfgManager) GetAll(ctx context.Context) map[string]any { + resultMap := map[string]any{} if err := c.Store.Load(ctx); err != nil { log.Errorf("AllConfigs failed, error %v", err) return resultMap @@ -96,8 +96,8 @@ func (c *CfgManager) GetAll(ctx context.Context) map[string]interface{} { } // GetUserCfgs retrieve all user configs -func (c *CfgManager) GetUserCfgs(ctx context.Context) map[string]interface{} { - resultMap := map[string]interface{}{} +func (c *CfgManager) GetUserCfgs(ctx context.Context) map[string]any { + resultMap := map[string]any{} if err := c.Store.Load(ctx); err != nil { log.Errorf("UserConfigs failed, error %v", err) return resultMap @@ -146,7 +146,7 @@ func (c *CfgManager) Get(_ context.Context, key string) *metadata.ConfigureValue } // Set ... -func (c *CfgManager) Set(_ context.Context, key string, value interface{}) { +func (c *CfgManager) Set(_ context.Context, key string, value any) { configValue, err := metadata.NewCfgValue(key, utils.GetStrValueOfAnyType(value)) if err != nil { log.Errorf("error when setting key: %v, error %v", key, err) @@ -176,12 +176,12 @@ func (c *CfgManager) GetDatabaseCfg() *models.Database { } // UpdateConfig - Update config Store with a specified configuration and also save updated configure. -func (c *CfgManager) UpdateConfig(ctx context.Context, cfgs map[string]interface{}) error { +func (c *CfgManager) UpdateConfig(ctx context.Context, cfgs map[string]any) error { return c.Store.Update(ctx, cfgs) } // ValidateCfg validate config by metadata. return the first error if exist. -func (c *CfgManager) ValidateCfg(ctx context.Context, cfgs map[string]interface{}) error { +func (c *CfgManager) ValidateCfg(ctx context.Context, cfgs map[string]any) error { for key, value := range cfgs { item, exist := metadata.Instance().GetByName(key) if !exist { diff --git a/src/pkg/config/rest/rest.go b/src/pkg/config/rest/rest.go index c7368c4c051..138e91af9bc 100644 --- a/src/pkg/config/rest/rest.go +++ b/src/pkg/config/rest/rest.go @@ -36,13 +36,13 @@ func NewRESTDriver(configRESTURL string, modifiers ...modifier.Modifier) *Driver // Value ... type Value struct { - Val interface{} `json:"value"` - Editable bool `json:"editable"` + Val any `json:"value"` + Editable bool `json:"editable"` } // Load - load config data from REST server -func (h *Driver) Load(_ context.Context) (map[string]interface{}, error) { - cfgMap := map[string]interface{}{} +func (h *Driver) Load(_ context.Context) (map[string]any, error) { + cfgMap := map[string]any{} origMap := map[string]*Value{} log.Infof("get configuration from url: %+v", h.configRESTURL) err := h.client.Get(h.configRESTURL, &origMap) @@ -59,6 +59,6 @@ func (h *Driver) Load(_ context.Context) (map[string]interface{}, error) { } // Save - Save config data to REST server by PUT method -func (h *Driver) Save(_ context.Context, cfg map[string]interface{}) error { +func (h *Driver) Save(_ context.Context, cfg map[string]any) error { return h.client.Put(h.configRESTURL, cfg) } diff --git a/src/pkg/config/rest/rest_test.go b/src/pkg/config/rest/rest_test.go index f1940010bdd..3be9a782946 100644 --- a/src/pkg/config/rest/rest_test.go +++ b/src/pkg/config/rest/rest_test.go @@ -28,7 +28,7 @@ import ( ) func ConfigGetHandler(w http.ResponseWriter, r *http.Request) { - cfgs := map[string]interface{}{ + cfgs := map[string]any{ "ldap_url": &Value{Val: "ldaps://ldap.vmware.com", Editable: true}, "ldap_scope": &Value{Val: 5, Editable: true}, "ldap_verify_cert": &Value{Val: true, Editable: true}, @@ -54,10 +54,10 @@ func TestHTTPDriver_Load(t *testing.T) { assert.Equal(t, true, configMap["ldap_verify_cert"]) } -var configMapForTest = map[string]interface{}{} +var configMapForTest = map[string]any{} func ConfigPutHandler(w http.ResponseWriter, r *http.Request) { - cfgs := map[string]interface{}{} + cfgs := map[string]any{} content, err := io.ReadAll(r.Body) if err != nil { log.Fatal(err) @@ -75,7 +75,7 @@ func TestHTTPDriver_Save(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(ConfigPutHandler)) defer server.Close() httpDriver := NewRESTDriver(server.URL) - configMap := map[string]interface{}{ + configMap := map[string]any{ "ldap_url": "ldap://www.example.com", "ldap_timeout": 10, "ldap_verify_cert": false, diff --git a/src/pkg/config/store/driver.go b/src/pkg/config/store/driver.go index 4b3cb7b0537..853fab6f667 100644 --- a/src/pkg/config/store/driver.go +++ b/src/pkg/config/store/driver.go @@ -20,7 +20,7 @@ import "context" // Driver the interface to save/load config type Driver interface { // Load - load config item from config driver - Load(ctx context.Context) (map[string]interface{}, error) + Load(ctx context.Context) (map[string]any, error) // Save - save config item into config driver - Save(ctx context.Context, cfg map[string]interface{}) error + Save(ctx context.Context, cfg map[string]any) error } diff --git a/src/pkg/config/store/store.go b/src/pkg/config/store/store.go index 846e7a34f8e..6c1e61b6519 100644 --- a/src/pkg/config/store/store.go +++ b/src/pkg/config/store/store.go @@ -51,8 +51,8 @@ func (c *ConfigStore) Get(key string) (*metadata.ConfigureValue, error) { return nil, metadata.ErrValueNotSet } -// GetAnyType get interface{} type for config items -func (c *ConfigStore) GetAnyType(key string) (interface{}, error) { +// GetAnyType get any type for config items +func (c *ConfigStore) GetAnyType(key string) (any, error) { if value, ok := c.cfgValues.Load(key); ok { if result, ok := value.(metadata.ConfigureValue); ok { return result.GetAnyType() @@ -96,8 +96,8 @@ func (c *ConfigStore) Load(ctx context.Context) error { // Save - Save all data in current store func (c *ConfigStore) Save(ctx context.Context) error { - cfgMap := map[string]interface{}{} - c.cfgValues.Range(func(key, value interface{}) bool { + cfgMap := map[string]any{} + c.cfgValues.Range(func(key, value any) bool { keyStr := fmt.Sprintf("%v", key) if configValue, ok := value.(metadata.ConfigureValue); ok { valueStr := configValue.Value @@ -118,7 +118,7 @@ func (c *ConfigStore) Save(ctx context.Context) error { } // Update - Only update specified settings in cfgMap in store and driver -func (c *ConfigStore) Update(ctx context.Context, cfgMap map[string]interface{}) error { +func (c *ConfigStore) Update(ctx context.Context, cfgMap map[string]any) error { // Update to store for key, value := range cfgMap { configValue, err := metadata.NewCfgValue(key, utils.GetStrValueOfAnyType(value)) @@ -137,7 +137,7 @@ func (c *ConfigStore) Update(ctx context.Context, cfgMap map[string]interface{}) } // ToString ... -func ToString(value interface{}) (string, error) { +func ToString(value any) (string, error) { if value == nil { return "nil", nil } diff --git a/src/pkg/config/validate/ldapgroup.go b/src/pkg/config/validate/ldapgroup.go index e9f9af879ac..b1dc852e44d 100644 --- a/src/pkg/config/validate/ldapgroup.go +++ b/src/pkg/config/validate/ldapgroup.go @@ -28,7 +28,7 @@ type LdapGroupValidateRule struct { } // Validate validate the ldap group config settings, cfgs is the config items need to be updated, the final config should be merged with the cfgMgr -func (l LdapGroupValidateRule) Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]interface{}) error { +func (l LdapGroupValidateRule) Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]any) error { cfg := &cfgModels.GroupConf{ Filter: cfgMgr.Get(ctx, common.LDAPGroupSearchFilter).GetString(), NameAttribute: cfgMgr.Get(ctx, common.LDAPGroupAttributeName).GetString(), diff --git a/src/pkg/config/validate/test/ldapgroup_test.go b/src/pkg/config/validate/test/ldapgroup_test.go index 1ff938369b1..d639e03627a 100644 --- a/src/pkg/config/validate/test/ldapgroup_test.go +++ b/src/pkg/config/validate/test/ldapgroup_test.go @@ -30,7 +30,7 @@ import ( func TestMain(m *testing.M) { test.InitDatabaseFromEnv() - config.InitWithSettings(map[string]interface{}{ + config.InitWithSettings(map[string]any{ "ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_attribute_name": "", "ldap_group_membership_attribute": "memberof", @@ -47,7 +47,7 @@ func TestLdapGroupValidateRule_Validate(t *testing.T) { type args struct { ctx context.Context cfgMgr config.Manager - cfgs map[string]interface{} + cfgs map[string]any } cases := []struct { name string @@ -56,17 +56,17 @@ func TestLdapGroupValidateRule_Validate(t *testing.T) { }{ { name: `nothing updated, no error`, - in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]interface{}{}}, + in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]any{}}, want: nil, }, { name: `empty ldap group membership attribute, update all`, - in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]interface{}{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_attribute_name": "cn", "ldap_group_membership_attribute": ""}}, + in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]any{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_attribute_name": "cn", "ldap_group_membership_attribute": ""}}, want: errors.New("ldap group membership attribute can not be empty"), }, { name: `empty ldap group attribute name, update partially`, - in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]interface{}{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_membership_attribute": "memberof"}}, + in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]any{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_membership_attribute": "memberof"}}, want: errors.New("ldap group name attribute can not be empty"), }, } diff --git a/src/pkg/config/validate/validate.go b/src/pkg/config/validate/validate.go index 4173efd4d02..b0dc2f4faac 100644 --- a/src/pkg/config/validate/validate.go +++ b/src/pkg/config/validate/validate.go @@ -27,5 +27,5 @@ import ( // 3. Add the rule to validateRules in pkg/config/manager.go type Rule interface { // Validate validates a specific group of configuration items, cfgs contains the config need to be updated, the final config should merged with the cfgMgr - Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]interface{}) error + Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]any) error } diff --git a/src/pkg/exporter/cache.go b/src/pkg/exporter/cache.go index 10a4d6c10b7..9dc41df8de6 100644 --- a/src/pkg/exporter/cache.go +++ b/src/pkg/exporter/cache.go @@ -24,7 +24,7 @@ var c *cache const defaultCacheCleanInterval = 10 type cachedValue struct { - Value interface{} + Value any Expiration int64 } @@ -35,7 +35,7 @@ type cache struct { } // CacheGet get a value from cache -func CacheGet(key string) (value interface{}, ok bool) { +func CacheGet(key string) (value any, ok bool) { c.RLock() v, ok := c.store[key] c.RUnlock() @@ -52,7 +52,7 @@ func CacheGet(key string) (value interface{}, ok bool) { } // CachePut put a value to cache with key -func CachePut(key, value interface{}) { +func CachePut(key, value any) { c.Lock() defer c.Unlock() c.store[key.(string)] = cachedValue{ diff --git a/src/pkg/exporter/statistics_collector.go b/src/pkg/exporter/statistics_collector.go index eb36c63736d..695c17f547d 100644 --- a/src/pkg/exporter/statistics_collector.go +++ b/src/pkg/exporter/statistics_collector.go @@ -119,12 +119,12 @@ func (g StatisticsCollector) getPublicProjectsAndRepositories(ctx context.Contex if pubProjectsAmount == 0 { return pubProjectsAmount, 0 } - var ids []interface{} + var ids []any for _, p := range pubProjects { ids = append(ids, p.ProjectID) } n, err := g.repoCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": q.NewOrList(ids), }, }) diff --git a/src/pkg/label/dao/dao_test.go b/src/pkg/label/dao/dao_test.go index 7049f0db1a4..881d92495c6 100644 --- a/src/pkg/label/dao/dao_test.go +++ b/src/pkg/label/dao/dao_test.go @@ -164,7 +164,7 @@ func (l *labelDaoTestSuite) DeleteReference() { func (l *labelDaoTestSuite) DeleteReferences() { n, err := l.dao.DeleteReferences(l.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "LabelID": 1000, }, }) diff --git a/src/pkg/label/manager.go b/src/pkg/label/manager.go index 224a47e56b6..994ade5eabb 100644 --- a/src/pkg/label/manager.go +++ b/src/pkg/label/manager.go @@ -105,7 +105,7 @@ func (m *manager) AddTo(ctx context.Context, labelID int64, artifactID int64) er } func (m *manager) RemoveFrom(ctx context.Context, labelID int64, artifactID int64) error { n, err := m.dao.DeleteReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "LabelID": labelID, "ArtifactID": artifactID, }, @@ -121,7 +121,7 @@ func (m *manager) RemoveFrom(ctx context.Context, labelID int64, artifactID int6 func (m *manager) RemoveAllFrom(ctx context.Context, artifactID int64) error { _, err := m.dao.DeleteReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) @@ -130,7 +130,7 @@ func (m *manager) RemoveAllFrom(ctx context.Context, artifactID int64) error { func (m *manager) RemoveFromAllArtifacts(ctx context.Context, labelID int64) error { _, err := m.dao.DeleteReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "LabelID": labelID, }, }) diff --git a/src/pkg/member/dao/dao.go b/src/pkg/member/dao/dao.go index 1b4b9e4119c..22655d1083e 100644 --- a/src/pkg/member/dao/dao.go +++ b/src/pkg/member/dao/dao.go @@ -79,7 +79,7 @@ func (d *dao) GetProjectMember(ctx context.Context, queryMember models.Member, q on pm.project_id = ? and u.user_id = pm.entity_id join role r on pm.role = r.role_id where pm.entity_type = 'u') as a where a.project_id = ? ` - queryParam := make([]interface{}, 1) + queryParam := make([]any, 1) // used ProjectID already queryParam = append(queryParam, queryMember.ProjectID) queryParam = append(queryParam, queryMember.ProjectID) @@ -119,7 +119,7 @@ func (d *dao) GetTotalOfProjectMembers(ctx context.Context, projectID int64, _ * sql := "SELECT COUNT(1) FROM project_member WHERE project_id = ?" - queryParam := []interface{}{projectID} + queryParam := []any{projectID} if len(roles) > 0 { sql += " AND role = ?" @@ -223,7 +223,7 @@ func (d *dao) SearchMemberByName(ctx context.Context, projectID int64, entityNam left join role r on pm.role = r.role_id where pm.project_id = ? and ug.group_name like ? order by entity_name ` - queryParam := make([]interface{}, 4) + queryParam := make([]any, 4) queryParam = append(queryParam, projectID) queryParam = append(queryParam, "%"+orm.Escape(entityName)+"%") queryParam = append(queryParam, projectID) @@ -238,7 +238,7 @@ func (d *dao) ListRoles(ctx context.Context, user *models.User, projectID int64) if user == nil { return nil, nil } - var params []interface{} + var params []any sql := ` select role from project_member diff --git a/src/pkg/notification/hook/hook.go b/src/pkg/notification/hook/hook.go index 690e69b4cc6..643431714ff 100644 --- a/src/pkg/notification/hook/hook.go +++ b/src/pkg/notification/hook/hook.go @@ -58,7 +58,7 @@ func (hm *DefaultManager) StartHook(ctx context.Context, event *model.HookEvent, return errors.Errorf("invalid event target type: %s", event.Target.Type) } - extraAttrs := map[string]interface{}{ + extraAttrs := map[string]any{ "event_type": event.EventType, "payload": data.Parameters["payload"], } @@ -73,7 +73,7 @@ func (hm *DefaultManager) StartHook(ctx context.Context, event *model.HookEvent, Metadata: &job.Metadata{ JobKind: data.Metadata.JobKind, }, - Parameters: map[string]interface{}(data.Parameters), + Parameters: map[string]any(data.Parameters), }) if err != nil { return errors.Errorf("failed to create task for webhook based on policy %d: %v", event.PolicyID, err) diff --git a/src/pkg/notification/policy/dao/dao_test.go b/src/pkg/notification/policy/dao/dao_test.go index 2cf9f3d023c..5e31eded745 100644 --- a/src/pkg/notification/policy/dao/dao_test.go +++ b/src/pkg/notification/policy/dao/dao_test.go @@ -99,7 +99,7 @@ func (suite *DaoTestSuite) TestDelete() { func (suite *DaoTestSuite) TestList() { jobs, err := suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": 333, }, }) @@ -151,7 +151,7 @@ func (suite *DaoTestSuite) TestCount() { suite.True(total > 0) total, err = suite.dao.Count(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": 111, }, }) diff --git a/src/pkg/notifier/event/event.go b/src/pkg/notifier/event/event.go index bed42902ed3..68cae60a2e9 100644 --- a/src/pkg/notifier/event/event.go +++ b/src/pkg/notifier/event/event.go @@ -27,7 +27,7 @@ import ( // Event to publish type Event struct { Topic string - Data interface{} + Data any } // TopicEvent - Events that contains topic information diff --git a/src/pkg/notifier/handler/notification/http_handler.go b/src/pkg/notifier/handler/notification/http_handler.go index 4c62c378fa1..53546d3f920 100644 --- a/src/pkg/notifier/handler/notification/http_handler.go +++ b/src/pkg/notifier/handler/notification/http_handler.go @@ -36,7 +36,7 @@ func (h *HTTPHandler) Name() string { } // Handle handles http event -func (h *HTTPHandler) Handle(ctx context.Context, value interface{}) error { +func (h *HTTPHandler) Handle(ctx context.Context, value any) error { if value == nil { return errors.New("HTTPHandler cannot handle nil value") } @@ -84,7 +84,7 @@ func (h *HTTPHandler) process(ctx context.Context, event *model.HookEvent) error return errors.Wrap(err, "error to marshal header") } - j.Parameters = map[string]interface{}{ + j.Parameters = map[string]any{ "payload": string(payload), "address": event.Target.Address, "header": string(headerBytes), diff --git a/src/pkg/notifier/handler/notification/slack_handler.go b/src/pkg/notifier/handler/notification/slack_handler.go index b447c909e49..c5152d7476c 100644 --- a/src/pkg/notifier/handler/notification/slack_handler.go +++ b/src/pkg/notifier/handler/notification/slack_handler.go @@ -85,7 +85,7 @@ func (s *SlackHandler) Name() string { } // Handle handles event to slack -func (s *SlackHandler) Handle(ctx context.Context, value interface{}) error { +func (s *SlackHandler) Handle(ctx context.Context, value any) error { if value == nil { return errors.New("SlackHandler cannot handle nil value") } @@ -118,7 +118,7 @@ func (s *SlackHandler) process(ctx context.Context, event *model.HookEvent) erro return fmt.Errorf("convert payload to slack body failed: %v", err) } - j.Parameters = map[string]interface{}{ + j.Parameters = map[string]any{ "payload": payload, "address": event.Target.Address, "skip_cert_verify": event.Target.SkipCertVerify, @@ -127,7 +127,7 @@ func (s *SlackHandler) process(ctx context.Context, event *model.HookEvent) erro } func (s *SlackHandler) convert(payLoad *model.Payload) (string, error) { - data := make(map[string]interface{}) + data := make(map[string]any) data["Type"] = payLoad.Type data["OccurAt"] = payLoad.OccurAt data["Operator"] = payLoad.Operator diff --git a/src/pkg/notifier/model/event.go b/src/pkg/notifier/model/event.go index 4bf852df0a0..3969982d9b7 100644 --- a/src/pkg/notifier/model/event.go +++ b/src/pkg/notifier/model/event.go @@ -48,11 +48,11 @@ type EventData struct { // Resource describe infos of resource triggered notification type Resource struct { - Digest string `json:"digest,omitempty"` - Tag string `json:"tag,omitempty"` - ResourceURL string `json:"resource_url,omitempty"` - ScanOverview map[string]interface{} `json:"scan_overview,omitempty"` - SBOMOverview map[string]interface{} `json:"sbom_overview,omitempty"` + Digest string `json:"digest,omitempty"` + Tag string `json:"tag,omitempty"` + ResourceURL string `json:"resource_url,omitempty"` + ScanOverview map[string]any `json:"scan_overview,omitempty"` + SBOMOverview map[string]any `json:"sbom_overview,omitempty"` } // Repository info of notification event diff --git a/src/pkg/notifier/notification_handler.go b/src/pkg/notifier/notification_handler.go index 70769139651..4130b696509 100644 --- a/src/pkg/notifier/notification_handler.go +++ b/src/pkg/notifier/notification_handler.go @@ -24,7 +24,7 @@ type NotificationHandler interface { // Handle the event when it coming. // value might be optional, it depends on usages. - Handle(ctx context.Context, value interface{}) error + Handle(ctx context.Context, value any) error // IsStateful returns whether the handler is stateful or not. // If handler is stateful, it will not be triggered in parallel. diff --git a/src/pkg/notifier/notifier.go b/src/pkg/notifier/notifier.go index b8f2a2c36c9..6666482e952 100644 --- a/src/pkg/notifier/notifier.go +++ b/src/pkg/notifier/notifier.go @@ -38,7 +38,7 @@ type Notification struct { // Value of notification. // Optional - Value interface{} + Value any } // HandlerChannel provides not only the chan itself but also the count of @@ -237,7 +237,7 @@ func UnSubscribe(topic string, handler string) error { } // Publish is a wrapper utility method for NotificationWatcher.notify() -func Publish(ctx context.Context, topic string, value interface{}) error { +func Publish(ctx context.Context, topic string, value any) error { return notificationWatcher.Notify(ctx, Notification{ Topic: topic, Value: value, diff --git a/src/pkg/notifier/notifier_test.go b/src/pkg/notifier/notifier_test.go index ba1ceb63c53..b4539d04881 100644 --- a/src/pkg/notifier/notifier_test.go +++ b/src/pkg/notifier/notifier_test.go @@ -24,7 +24,7 @@ func (fsh *fakeStatefulHandler) IsStateful() bool { return true } -func (fsh *fakeStatefulHandler) Handle(ctx context.Context, v interface{}) error { +func (fsh *fakeStatefulHandler) Handle(ctx context.Context, v any) error { increment := 0 if v != nil && reflect.TypeOf(v).Kind() == reflect.Int { increment = v.(int) @@ -43,7 +43,7 @@ func (fsh *fakeStatelessHandler) Name() string { return "fakeStateless" } -func (fsh *fakeStatelessHandler) Handle(ctx context.Context, v interface{}) error { +func (fsh *fakeStatelessHandler) Handle(ctx context.Context, v any) error { return nil } diff --git a/src/pkg/oidc/helper.go b/src/pkg/oidc/helper.go index 3ce329fada0..db3ba7eab31 100644 --- a/src/pkg/oidc/helper.go +++ b/src/pkg/oidc/helper.go @@ -48,7 +48,7 @@ const ( ) type claimsProvider interface { - Claims(v interface{}) error + Claims(v any) error } type providerHelper struct { @@ -376,7 +376,7 @@ func userInfoFromClaims(c claimsProvider, setting cfgModels.OIDCSetting) (*UserI return nil, err } if setting.UserClaim != "" { - allClaims := make(map[string]interface{}) + allClaims := make(map[string]any) if err := c.Claims(&allClaims); err != nil { return nil, err } @@ -406,12 +406,12 @@ func userInfoFromClaims(c claimsProvider, setting cfgModels.OIDCSetting) (*UserI // If the claims does not have the claim defined as k, the second return value will be false, otherwise true func groupsFromClaims(gp claimsProvider, k string) ([]string, bool) { res := make([]string, 0) - claimMap := make(map[string]interface{}) + claimMap := make(map[string]any) if err := gp.Claims(&claimMap); err != nil { log.Errorf("failed to fetch claims, error: %v", err) return res, false } - g, ok := claimMap[k].([]interface{}) + g, ok := claimMap[k].([]any) if !ok { if len(strings.TrimSpace(k)) > 0 { log.Warningf("Unable to get groups from claims, claims: %+v, groups claims key: %s", claimMap, k) diff --git a/src/pkg/oidc/helper_test.go b/src/pkg/oidc/helper_test.go index c79a7c2269d..315340a0047 100644 --- a/src/pkg/oidc/helper_test.go +++ b/src/pkg/oidc/helper_test.go @@ -37,7 +37,7 @@ import ( func TestMain(m *testing.M) { test.InitDatabaseFromEnv() - conf := map[string]interface{}{ + conf := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://accounts.google.com", common.OIDCVerifyCert: "true", @@ -72,7 +72,7 @@ func TestHelperGet(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "https://oauth2.googleapis.com/token", p.Endpoint().TokenURL) - update := map[string]interface{}{ + update := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://accounts.google.com", common.OIDCVerifyCert: "true", @@ -91,7 +91,7 @@ func TestHelperGet(t *testing.T) { } func TestAuthCodeURL(t *testing.T) { - conf := map[string]interface{}{ + conf := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://accounts.google.com", common.OIDCVerifyCert: "true", @@ -130,10 +130,10 @@ func TestTestEndpoint(t *testing.T) { } type fakeClaims struct { - claims map[string]interface{} + claims map[string]any } -func (fc *fakeClaims) Claims(n interface{}) error { +func (fc *fakeClaims) Claims(n any) error { b, err := json.Marshal(fc.claims) if err != nil { return err @@ -142,14 +142,14 @@ func (fc *fakeClaims) Claims(n interface{}) error { } func TestGroupsFromClaim(t *testing.T) { - in := map[string]interface{}{ + in := map[string]any{ "user": "user1", - "groups": []interface{}{"group1", "group2"}, - "groups_2": []interface{}{"group1", "group2", 2}, + "groups": []any{"group1", "group2"}, + "groups_2": []any{"group1", "group2", 2}, } m := []struct { - input map[string]interface{} + input map[string]any key string expect []string ok bool @@ -190,15 +190,15 @@ func TestGroupsFromClaim(t *testing.T) { func TestUserInfoFromClaims(t *testing.T) { s := []struct { - input map[string]interface{} + input map[string]any setting cfgModels.OIDCSetting expect *UserInfo }{ { - input: map[string]interface{}{ + input: map[string]any{ "name": "Daniel", "email": "daniel@gmail.com", - "groups": []interface{}{"g1", "g2"}, + "groups": []any{"g1", "g2"}, }, setting: cfgModels.OIDCSetting{ Name: "t1", @@ -217,10 +217,10 @@ func TestUserInfoFromClaims(t *testing.T) { }, }, { - input: map[string]interface{}{ + input: map[string]any{ "name": "Daniel", "email": "daniel@gmail.com", - "groups": []interface{}{"g1", "g2"}, + "groups": []any{"g1", "g2"}, }, setting: cfgModels.OIDCSetting{ Name: "t2", @@ -240,12 +240,12 @@ func TestUserInfoFromClaims(t *testing.T) { }, }, { - input: map[string]interface{}{ + input: map[string]any{ "iss": "issuer", "sub": "subject000", "name": "jack", "email": "jack@gmail.com", - "groupclaim": []interface{}{}, + "groupclaim": []any{}, }, setting: cfgModels.OIDCSetting{ Name: "t3", @@ -265,10 +265,10 @@ func TestUserInfoFromClaims(t *testing.T) { }, }, { - input: map[string]interface{}{ + input: map[string]any{ "name": "Alvaro", "email": "airadier@gmail.com", - "groups": []interface{}{"g1", "g2"}, + "groups": []any{"g1", "g2"}, }, setting: cfgModels.OIDCSetting{ Name: "t4", diff --git a/src/pkg/p2p/preheat/dao/instance/dao_test.go b/src/pkg/p2p/preheat/dao/instance/dao_test.go index cc2b6e4caa6..f2a25dbdebf 100644 --- a/src/pkg/p2p/preheat/dao/instance/dao_test.go +++ b/src/pkg/p2p/preheat/dao/instance/dao_test.go @@ -149,7 +149,7 @@ func (is *instanceSuite) TestList() { assert.Equal(t, defaultInstance.ID, instances[0].ID) // keyword search - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["name"] = "kraken-us-1" instances, err = is.dao.List(is.ctx, &q.Query{Keywords: keywords}) assert.Nil(t, err) diff --git a/src/pkg/p2p/preheat/dao/policy/dao_test.go b/src/pkg/p2p/preheat/dao/policy/dao_test.go index fb6161bc4da..1498801ffbd 100644 --- a/src/pkg/p2p/preheat/dao/policy/dao_test.go +++ b/src/pkg/p2p/preheat/dao/policy/dao_test.go @@ -182,7 +182,7 @@ func (d *daoTestSuite) TestList() { // list policy filter by project query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "project_id": 1, }, } diff --git a/src/pkg/p2p/preheat/job_test.go b/src/pkg/p2p/preheat/job_test.go index d561558ba48..de54164d1dc 100644 --- a/src/pkg/p2p/preheat/job_test.go +++ b/src/pkg/p2p/preheat/job_test.go @@ -58,7 +58,7 @@ func (suite *JobTestSuite) SetupSuite() { ImageName: "busybox", Tag: "latest", URL: "https://harbor.com", - Headers: map[string]interface{}{ + Headers: map[string]any{ "robot$my": "jwt-token", }, } diff --git a/src/pkg/p2p/preheat/models/policy/policy.go b/src/pkg/p2p/preheat/models/policy/policy.go index 65c50f30243..789038be092 100644 --- a/src/pkg/p2p/preheat/models/policy/policy.go +++ b/src/pkg/p2p/preheat/models/policy/policy.go @@ -73,10 +73,10 @@ type Schema struct { TriggerStr string `orm:"column(trigger)" json:"-"` Enabled bool `orm:"column(enabled)" json:"enabled"` // ExtraAttrs is used to store extra attributes provided by vendor. - ExtraAttrsStr string `orm:"column(extra_attrs)" json:"-"` - ExtraAttrs map[string]interface{} `orm:"-" json:"extra_attrs"` - CreatedAt time.Time `orm:"column(creation_time)" json:"creation_time"` - UpdatedTime time.Time `orm:"column(update_time)" json:"update_time"` + ExtraAttrsStr string `orm:"column(extra_attrs)" json:"-"` + ExtraAttrs map[string]any `orm:"-" json:"extra_attrs"` + CreatedAt time.Time `orm:"column(creation_time)" json:"creation_time"` + UpdatedTime time.Time `orm:"column(update_time)" json:"update_time"` } // TableName specifies the policy schema table name. @@ -102,8 +102,8 @@ type FilterType = string // Filter holds the info of the filter type Filter struct { - Type FilterType `json:"type"` - Value interface{} `json:"value"` + Type FilterType `json:"type"` + Value any `json:"value"` } // TriggerType represents the type of trigger. @@ -235,12 +235,12 @@ func decodeTrigger(triggerStr string) (*Trigger, error) { } // decodeExtraAttrs parse extraAttrsStr to extraAttrs. -func decodeExtraAttrs(extraAttrsStr string) (map[string]interface{}, error) { +func decodeExtraAttrs(extraAttrsStr string) (map[string]any, error) { if len(extraAttrsStr) == 0 { return nil, nil } - extraAttrs := make(map[string]interface{}) + extraAttrs := make(map[string]any) if err := json.Unmarshal([]byte(extraAttrsStr), &extraAttrs); err != nil { return nil, err } diff --git a/src/pkg/p2p/preheat/models/policy/policy_test.go b/src/pkg/p2p/preheat/models/policy/policy_test.go index 1637501d2e1..c36f7082d39 100644 --- a/src/pkg/p2p/preheat/models/policy/policy_test.go +++ b/src/pkg/p2p/preheat/models/policy/policy_test.go @@ -85,7 +85,7 @@ func (p *PolicyTestSuite) TestDecode() { p.Len(s.Filters, 3) p.NotNil(s.Trigger) - p.Equal(map[string]interface{}{"key": "value"}, s.ExtraAttrs) + p.Equal(map[string]any{"key": "value"}, s.ExtraAttrs) // invalid filter or trigger s.FiltersStr = "" @@ -125,7 +125,7 @@ func (p *PolicyTestSuite) TestEncode() { }, TriggerStr: "", Enabled: false, - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "key": "value", }, } diff --git a/src/pkg/p2p/preheat/policy/manager.go b/src/pkg/p2p/preheat/policy/manager.go index b8f84588eb2..ab301447402 100644 --- a/src/pkg/p2p/preheat/policy/manager.go +++ b/src/pkg/p2p/preheat/policy/manager.go @@ -125,7 +125,7 @@ func (m *manager) ListPoliciesByProject(ctx context.Context, project int64, quer } if query.Keywords == nil { - query.Keywords = make(map[string]interface{}) + query.Keywords = make(map[string]any) } // set project filter query.Keywords["project_id"] = project diff --git a/src/pkg/p2p/preheat/provider/client/http_client.go b/src/pkg/p2p/preheat/provider/client/http_client.go index 0c367286f77..d3acbfdead1 100644 --- a/src/pkg/p2p/preheat/provider/client/http_client.go +++ b/src/pkg/p2p/preheat/provider/client/http_client.go @@ -147,7 +147,7 @@ func (hc *HTTPClient) get(url string, cred *auth.Credential, parmas map[string]s } // Post content to the service specified by the url -func (hc *HTTPClient) Post(url string, cred *auth.Credential, body interface{}, options map[string]string) ([]byte, error) { +func (hc *HTTPClient) Post(url string, cred *auth.Credential, body any, options map[string]string) ([]byte, error) { bytes, err := hc.post(url, cred, body, options) logMsg := fmt.Sprintf("Post %s with cred=%v, options=%v", url, cred, options) if err != nil { @@ -159,7 +159,7 @@ func (hc *HTTPClient) Post(url string, cred *auth.Credential, body interface{}, return bytes, err } -func (hc *HTTPClient) post(url string, cred *auth.Credential, body interface{}, options map[string]string) ([]byte, error) { +func (hc *HTTPClient) post(url string, cred *auth.Credential, body any, options map[string]string) ([]byte, error) { if len(url) == 0 { return nil, errors.New("empty url") } diff --git a/src/pkg/p2p/preheat/provider/dragonfly.go b/src/pkg/p2p/preheat/provider/dragonfly.go index 623c45b18b7..ebfb429e713 100644 --- a/src/pkg/p2p/preheat/provider/dragonfly.go +++ b/src/pkg/p2p/preheat/provider/dragonfly.go @@ -368,7 +368,7 @@ func (dd *DragonflyDriver) getCred() *auth.Credential { } } -func headerToMapString(header map[string]interface{}) map[string]string { +func headerToMapString(header map[string]any) map[string]string { m := make(map[string]string) for k, v := range header { if s, ok := v.(string); ok { diff --git a/src/pkg/p2p/preheat/provider/dragonfly_test.go b/src/pkg/p2p/preheat/provider/dragonfly_test.go index 06d26f5949c..35c18f762ad 100644 --- a/src/pkg/p2p/preheat/provider/dragonfly_test.go +++ b/src/pkg/p2p/preheat/provider/dragonfly_test.go @@ -85,7 +85,7 @@ func (suite *DragonflyTestSuite) TestPreheat() { Tag: "latest", URL: "https://harbor.com", Digest: "sha256:f3c97e3bd1e27393eb853a5c90b1132f2cda84336d5ba5d100c720dc98524c82", - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "scope": "all_peers", "cluster_ids": []uint{1, 2, 3}, }, diff --git a/src/pkg/p2p/preheat/provider/preheat_image.go b/src/pkg/p2p/preheat/provider/preheat_image.go index 081ac21f726..ebabd19a85a 100644 --- a/src/pkg/p2p/preheat/provider/preheat_image.go +++ b/src/pkg/p2p/preheat/provider/preheat_image.go @@ -39,7 +39,7 @@ type PreheatImage struct { URL string `json:"url"` // The headers which will be sent to the above URL of preheating image - Headers map[string]interface{} `json:"headers"` + Headers map[string]any `json:"headers"` // The image name ImageName string `json:"image,omitempty"` @@ -51,7 +51,7 @@ type PreheatImage struct { Digest string `json:"digest"` // ExtraAttrs contains extra attributes for the preheating image. - ExtraAttrs map[string]interface{} `json:"extra_attrs,omitempty"` + ExtraAttrs map[string]any `json:"extra_attrs,omitempty"` } // FromJSON build preheating image from the given data. diff --git a/src/pkg/permission/evaluator/rbac/casbin_match.go b/src/pkg/permission/evaluator/rbac/casbin_match.go index 543512b469f..36a3a115e8e 100644 --- a/src/pkg/permission/evaluator/rbac/casbin_match.go +++ b/src/pkg/permission/evaluator/rbac/casbin_match.go @@ -39,8 +39,8 @@ func (s *regexpStore) Get(key string, build func(string) *regexp.Regexp) *regexp } func (s *regexpStore) Purge() { - var keys []interface{} - s.entries.Range(func(key, _ interface{}) bool { + var keys []any + s.entries.Range(func(key, _ any) bool { keys = append(keys, key) return true }) @@ -94,7 +94,7 @@ func keyMatch2(key1 string, key2 string) bool { return store.Get(key2, keyMatch2Build).MatchString(key1) } -func keyMatch2Func(args ...interface{}) (interface{}, error) { +func keyMatch2Func(args ...any) (any, error) { name1 := args[0].(string) name2 := args[1].(string) diff --git a/src/pkg/permission/evaluator/rbac/casbin_match_test.go b/src/pkg/permission/evaluator/rbac/casbin_match_test.go index da2562ff9b9..911eda4513c 100644 --- a/src/pkg/permission/evaluator/rbac/casbin_match_test.go +++ b/src/pkg/permission/evaluator/rbac/casbin_match_test.go @@ -67,7 +67,7 @@ func TestRegexpStore(t *testing.T) { sLen := func() int { var l int - s.entries.Range(func(key, value interface{}) bool { + s.entries.Range(func(key, value any) bool { l++ return true diff --git a/src/pkg/permission/types/namespace.go b/src/pkg/permission/types/namespace.go index e76c44b5e31..e17ed86b23e 100644 --- a/src/pkg/permission/types/namespace.go +++ b/src/pkg/permission/types/namespace.go @@ -33,7 +33,7 @@ type Namespace interface { // Resource returns new resource for subresources with the namespace Resource(subresources ...Resource) Resource // Identity returns identity attached with namespace - Identity() interface{} + Identity() any // GetPolicies returns all policies of the namespace GetPolicies() []*Policy } diff --git a/src/pkg/project/dao/dao.go b/src/pkg/project/dao/dao.go index 05d9f193bce..f0ecf79ac47 100644 --- a/src/pkg/project/dao/dao.go +++ b/src/pkg/project/dao/dao.go @@ -218,7 +218,7 @@ func (d *dao) ListAdminRolesOfUser(ctx context.Context, user commonmodels.User) var membersG []models.Member if len(user.GroupIDs) > 0 { - var params []interface{} + var params []any params = append(params, user.GroupIDs) sqlG := fmt.Sprintf(`select b.* from project as a left join project_member as b on a.project_id = b.project_id diff --git a/src/pkg/project/manager.go b/src/pkg/project/manager.go index b030061afdd..24c97559656 100644 --- a/src/pkg/project/manager.go +++ b/src/pkg/project/manager.go @@ -39,7 +39,7 @@ type Manager interface { Delete(ctx context.Context, id int64) error // Get the project specified by the ID or name - Get(ctx context.Context, idOrName interface{}) (*models.Project, error) + Get(ctx context.Context, idOrName any) (*models.Project, error) // List projects according to the query List(ctx context.Context, query *q.Query) ([]*models.Project, error) @@ -98,7 +98,7 @@ func (m *manager) Delete(ctx context.Context, id int64) error { } // Get the project specified by the ID -func (m *manager) Get(ctx context.Context, idOrName interface{}) (*models.Project, error) { +func (m *manager) Get(ctx context.Context, idOrName any) (*models.Project, error) { id, ok := idOrName.(int64) if ok { return m.dao.Get(ctx, id) diff --git a/src/pkg/project/models/project.go b/src/pkg/project/models/project.go index 80318aa21a4..ae8256a7d79 100644 --- a/src/pkg/project/models/project.go +++ b/src/pkg/project/models/project.go @@ -170,7 +170,7 @@ func (p *Project) ProxyCacheSpeed() int32 { } // FilterByPublic returns orm.QuerySeter with public filter -func (p *Project) FilterByPublic(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByPublic(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { subQuery := `SELECT project_id FROM project_metadata WHERE name = 'public' AND value = '%s'` if isTrue(value) { subQuery = fmt.Sprintf(subQuery, "true") @@ -181,7 +181,7 @@ func (p *Project) FilterByPublic(_ context.Context, qs orm.QuerySeter, _ string, } // FilterByOwner returns orm.QuerySeter with owner filter -func (p *Project) FilterByOwner(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByOwner(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { username, ok := value.(string) if !ok { return qs @@ -191,7 +191,7 @@ func (p *Project) FilterByOwner(_ context.Context, qs orm.QuerySeter, _ string, } // FilterByMember returns orm.QuerySeter with member filter -func (p *Project) FilterByMember(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByMember(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { query, ok := value.(*MemberQuery) if !ok { return qs @@ -219,7 +219,7 @@ func (p *Project) FilterByMember(_ context.Context, qs orm.QuerySeter, _ string, } // FilterByNames returns orm.QuerySeter with name filter -func (p *Project) FilterByNames(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByNames(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { query, ok := value.(*NamesQuery) if !ok { return qs @@ -242,7 +242,7 @@ func (p *Project) FilterByNames(_ context.Context, qs orm.QuerySeter, _ string, return qs.FilterRaw("project_id", fmt.Sprintf("IN (%s)", subQuery)) } -func isTrue(i interface{}) bool { +func isTrue(i any) bool { switch value := i.(type) { case bool: return value diff --git a/src/pkg/proxy/secret/manager.go b/src/pkg/proxy/secret/manager.go index ac98fc6562d..a461e67ed1b 100644 --- a/src/pkg/proxy/secret/manager.go +++ b/src/pkg/proxy/secret/manager.go @@ -129,7 +129,7 @@ func (man *mgr) gc() { return } log.Debugf("Running GC on secret map...") - man.m.Range(func(k, v interface{}) bool { + man.m.Range(func(k, v any) bool { repoV, ok := v.(targetRepository) if ok && repoV.expiresAt.Before(time.Now()) { log.Debugf("Removed expire secret: %s, repo: %s", k, repoV.name) diff --git a/src/pkg/quota/dao/dao.go b/src/pkg/quota/dao/dao.go index 1a93443c40b..4053f7e1763 100644 --- a/src/pkg/quota/dao/dao.go +++ b/src/pkg/quota/dao/dao.go @@ -186,12 +186,12 @@ func (d *dao) Update(ctx context.Context, quota *models.Quota) error { var ( sql string - params []interface{} + params []any ) if quota.UsedChanged { sql = "UPDATE quota_usage SET used = ?, update_time = ?, version = ? WHERE id = ? AND version = ?" - params = []interface{}{ + params = []any{ quota.Used, time.Now(), getVersion(quota.UsedVersion), @@ -200,7 +200,7 @@ func (d *dao) Update(ctx context.Context, quota *models.Quota) error { } } else { sql = "UPDATE quota SET hard = ?, update_time = ?, version = ? WHERE id = ? AND version = ?" - params = []interface{}{ + params = []any{ quota.Hard, time.Now(), getVersion(quota.HardVersion), diff --git a/src/pkg/quota/dao/util.go b/src/pkg/quota/dao/util.go index 60c8c9c2df9..01d55eae064 100644 --- a/src/pkg/quota/dao/util.go +++ b/src/pkg/quota/dao/util.go @@ -42,8 +42,8 @@ type listQuery struct { ReferenceIDs []string `json:"reference_ids"` } -func listConditions(query *q.Query) (string, []interface{}) { - params := []interface{}{} +func listConditions(query *q.Query) (string, []any) { + params := []any{} sql := "" if query == nil { return sql, params diff --git a/src/pkg/quota/driver/driver.go b/src/pkg/quota/driver/driver.go index 854c60f74ec..309d837b599 100644 --- a/src/pkg/quota/driver/driver.go +++ b/src/pkg/quota/driver/driver.go @@ -27,7 +27,7 @@ var ( ) // QuotaRefObject type for quota ref object -type QuotaRefObject map[string]interface{} +type QuotaRefObject map[string]any // Driver the driver for quota type Driver interface { diff --git a/src/pkg/rbac/dao/dao.go b/src/pkg/rbac/dao/dao.go index 0c05b8388a5..dc827065043 100644 --- a/src/pkg/rbac/dao/dao.go +++ b/src/pkg/rbac/dao/dao.go @@ -93,7 +93,7 @@ func (d *dao) ListPermissions(ctx context.Context, query *q.Query) ([]*model.Rol func (d *dao) DeletePermissionsByRole(ctx context.Context, roleType string, roleID int64) error { qs, err := orm.QuerySetter(ctx, &model.RolePermission{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "role_type": roleType, "role_id": roleID, }, diff --git a/src/pkg/rbac/dao/dao_test.go b/src/pkg/rbac/dao/dao_test.go index e709554ea19..44213607fcb 100644 --- a/src/pkg/rbac/dao/dao_test.go +++ b/src/pkg/rbac/dao/dao_test.go @@ -126,7 +126,7 @@ func (suite *DaoTestSuite) TestDeletePermission() { func (suite *DaoTestSuite) TestListPermissions() { rps, err := suite.dao.ListPermissions(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "role_type": "robot", "role_id": 1, "permission_policy_id": 4, @@ -141,7 +141,7 @@ func (suite *DaoTestSuite) TestDeletePermissionsByRole() { suite.Require().Nil(err) rps, err := suite.dao.ListPermissions(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "role_type": "serviceaccount", "role_id": 2, }, @@ -172,7 +172,7 @@ func (suite *DaoTestSuite) TestDeleteRbacPolicy() { func (suite *DaoTestSuite) TestListRbacPolicies() { rps, err := suite.dao.ListRbacPolicies(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "scope": "/project/1", "resource": "repository", "action": "pull", diff --git a/src/pkg/reg/adapter/dtr/client.go b/src/pkg/reg/adapter/dtr/client.go index 3a135686ee8..f037562e826 100644 --- a/src/pkg/reg/adapter/dtr/client.go +++ b/src/pkg/reg/adapter/dtr/client.go @@ -53,7 +53,7 @@ func NewClient(registry *model.Registry) *Client { } // getAndIteratePagination will iterator over a paginated response from DTR -func (c *Client) getAndIteratePagination(endpoint string, v interface{}) error { +func (c *Client) getAndIteratePagination(endpoint string, v any) error { urlAPI, err := url.Parse(endpoint) if err != nil { return err diff --git a/src/pkg/reg/adapter/gitlab/adapter.go b/src/pkg/reg/adapter/gitlab/adapter.go index f5545448422..8b5aa72e31c 100644 --- a/src/pkg/reg/adapter/gitlab/adapter.go +++ b/src/pkg/reg/adapter/gitlab/adapter.go @@ -165,7 +165,7 @@ func (a *adapter) FetchArtifacts(filters []*model.Filter) ([]*model.Resource, er } tags = append(tags, vTag.Name) } - info := make(map[string]interface{}) + info := make(map[string]any) info["location"] = repository.Location info["path"] = repository.Path diff --git a/src/pkg/reg/adapter/gitlab/client.go b/src/pkg/reg/adapter/gitlab/client.go index af268da62d8..ad08e18c308 100644 --- a/src/pkg/reg/adapter/gitlab/client.go +++ b/src/pkg/reg/adapter/gitlab/client.go @@ -111,7 +111,7 @@ func (c *Client) getTags(projectID int64, repositoryID int64) ([]*Tag, error) { // GetAndIteratePagination iterates the pagination header and returns all resources // The parameter "v" must be a pointer to a slice -func (c *Client) GetAndIteratePagination(endpoint string, v interface{}) error { +func (c *Client) GetAndIteratePagination(endpoint string, v any) error { urlAPI, err := url.Parse(endpoint) if err != nil { return err diff --git a/src/pkg/reg/adapter/harbor/base/adapter.go b/src/pkg/reg/adapter/harbor/base/adapter.go index 9e2c5ec1a3b..c65f232e7b8 100644 --- a/src/pkg/reg/adapter/harbor/base/adapter.go +++ b/src/pkg/reg/adapter/harbor/base/adapter.go @@ -256,7 +256,7 @@ func (a *Adapter) ListProjects(filters []*model.Filter) ([]*Project, error) { return a.Client.ListProjects("") } -func abstractPublicMetadata(metadata map[string]interface{}) map[string]interface{} { +func abstractPublicMetadata(metadata map[string]any) map[string]any { if metadata == nil { return nil } @@ -264,20 +264,20 @@ func abstractPublicMetadata(metadata map[string]interface{}) map[string]interfac if !exist { return nil } - return map[string]interface{}{ + return map[string]any{ "public": public, } } // currently, mergeMetadata only handles the public metadata -func mergeMetadata(metadata1, metadata2 map[string]interface{}) map[string]interface{} { +func mergeMetadata(metadata1, metadata2 map[string]any) map[string]any { public := parsePublic(metadata1) && parsePublic(metadata2) - return map[string]interface{}{ + return map[string]any{ "public": strconv.FormatBool(public), } } -func parsePublic(metadata map[string]interface{}) bool { +func parsePublic(metadata map[string]any) bool { if metadata == nil { return false } @@ -303,10 +303,10 @@ func parsePublic(metadata map[string]interface{}) bool { // Project model type Project struct { - ID int64 `json:"project_id"` - Name string `json:"name"` - Metadata map[string]interface{} `json:"metadata"` - RegistryID int64 `json:"registry_id"` + ID int64 `json:"project_id"` + Name string `json:"name"` + Metadata map[string]any `json:"metadata"` + RegistryID int64 `json:"registry_id"` } func isLocalHarbor(url string) bool { diff --git a/src/pkg/reg/adapter/harbor/base/adapter_test.go b/src/pkg/reg/adapter/harbor/base/adapter_test.go index dc692c5ab25..9866e764dad 100644 --- a/src/pkg/reg/adapter/harbor/base/adapter_test.go +++ b/src/pkg/reg/adapter/harbor/base/adapter_test.go @@ -194,15 +194,15 @@ func TestPrepareForPush(t *testing.T) { func TestParsePublic(t *testing.T) { cases := []struct { - metadata map[string]interface{} + metadata map[string]any result bool }{ {nil, false}, - {map[string]interface{}{}, false}, - {map[string]interface{}{"public": true}, true}, - {map[string]interface{}{"public": "not_bool"}, false}, - {map[string]interface{}{"public": "true"}, true}, - {map[string]interface{}{"public": struct{}{}}, false}, + {map[string]any{}, false}, + {map[string]any{"public": true}, true}, + {map[string]any{"public": "not_bool"}, false}, + {map[string]any{"public": "true"}, true}, + {map[string]any{"public": struct{}{}}, false}, } for _, c := range cases { assert.Equal(t, c.result, parsePublic(c.metadata)) @@ -211,33 +211,33 @@ func TestParsePublic(t *testing.T) { func TestMergeMetadata(t *testing.T) { cases := []struct { - m1 map[string]interface{} - m2 map[string]interface{} + m1 map[string]any + m2 map[string]any public bool }{ { - m1: map[string]interface{}{ + m1: map[string]any{ "public": "true", }, - m2: map[string]interface{}{ + m2: map[string]any{ "public": "true", }, public: true, }, { - m1: map[string]interface{}{ + m1: map[string]any{ "public": "false", }, - m2: map[string]interface{}{ + m2: map[string]any{ "public": "true", }, public: false, }, { - m1: map[string]interface{}{ + m1: map[string]any{ "public": "false", }, - m2: map[string]interface{}{ + m2: map[string]any{ "public": "false", }, public: false, @@ -255,14 +255,14 @@ func TestAbstractPublicMetadata(t *testing.T) { assert.Nil(t, meta) // contains no public metadata - metadata := map[string]interface{}{ + metadata := map[string]any{ "other": "test", } meta = abstractPublicMetadata(metadata) assert.Nil(t, meta) // contains public metadata - metadata = map[string]interface{}{ + metadata = map[string]any{ "other": "test", "public": "true", } diff --git a/src/pkg/reg/adapter/harbor/base/client.go b/src/pkg/reg/adapter/harbor/base/client.go index 64f98cfad55..73c21552926 100644 --- a/src/pkg/reg/adapter/harbor/base/client.go +++ b/src/pkg/reg/adapter/harbor/base/client.go @@ -81,10 +81,10 @@ func (c *Client) ListLabels() ([]string, error) { } // CreateProject creates project -func (c *Client) CreateProject(name string, metadata map[string]interface{}) error { +func (c *Client) CreateProject(name string, metadata map[string]any) error { project := struct { - Name string `json:"project_name"` - Metadata map[string]interface{} `json:"metadata"` + Name string `json:"project_name"` + Metadata map[string]any `json:"metadata"` }{ Name: name, Metadata: metadata, diff --git a/src/pkg/reg/adapter/huawei/huawei_adapter.go b/src/pkg/reg/adapter/huawei/huawei_adapter.go index f75710ea864..2ab71536f01 100644 --- a/src/pkg/reg/adapter/huawei/huawei_adapter.go +++ b/src/pkg/reg/adapter/huawei/huawei_adapter.go @@ -212,7 +212,7 @@ func (a *adapter) PrepareForPush(resources []*model.Resource) error { func (a *adapter) GetNamespace(namespaceStr string) (*model.Namespace, error) { var namespace = &model.Namespace{ Name: "", - Metadata: make(map[string]interface{}), + Metadata: make(map[string]any), } urls := fmt.Sprintf("%s/dockyard/v2/namespaces/%s", a.registry.URL, namespaceStr) @@ -299,8 +299,8 @@ type hwNamespace struct { ImageCount int64 `json:"image_count"` } -func (ns hwNamespace) metadata() map[string]interface{} { - var metadata = make(map[string]interface{}) +func (ns hwNamespace) metadata() map[string]any { + var metadata = make(map[string]any) metadata["id"] = ns.ID metadata["creator_name"] = ns.CreatorName metadata["domain_public"] = ns.DomainPublic diff --git a/src/pkg/reg/adapter/huawei/huawei_adapter_test.go b/src/pkg/reg/adapter/huawei/huawei_adapter_test.go index cffcb0fca13..290bc2754aa 100644 --- a/src/pkg/reg/adapter/huawei/huawei_adapter_test.go +++ b/src/pkg/reg/adapter/huawei/huawei_adapter_test.go @@ -71,7 +71,7 @@ func TestAdapter_PrepareForPush(t *testing.T) { repository := &model.Repository{ Name: "domain_repo_new", - Metadata: make(map[string]interface{}), + Metadata: make(map[string]any), } resource := &model.Resource{} metadata := &model.ResourceMetadata{ diff --git a/src/pkg/reg/adapter/huawei/image_registry.go b/src/pkg/reg/adapter/huawei/image_registry.go index 2037aedc650..1650665df95 100644 --- a/src/pkg/reg/adapter/huawei/image_registry.go +++ b/src/pkg/reg/adapter/huawei/image_registry.go @@ -149,7 +149,7 @@ func (a *adapter) DeleteManifest(repository, reference string) error { func parseRepoQueryResultToResource(repo hwRepoQueryResult) *model.Resource { var resource model.Resource - info := make(map[string]interface{}) + info := make(map[string]any) info["category"] = repo.Category info["description"] = repo.Description info["size"] = repo.Size diff --git a/src/pkg/reg/adapter/volcenginecr/consts.go b/src/pkg/reg/adapter/volcenginecr/consts.go index d519d2bb0b8..d4844fed773 100644 --- a/src/pkg/reg/adapter/volcenginecr/consts.go +++ b/src/pkg/reg/adapter/volcenginecr/consts.go @@ -17,7 +17,7 @@ package volcenginecr import "errors" var ( - regionRegs = map[string]interface{}{ + regionRegs = map[string]any{ "(.*)-(cn-.*)": nil, } errListNamespaceResp = errors.New("[VolcengineCR adapt] ListNamespaces resp nil") diff --git a/src/pkg/reg/dao/dao_test.go b/src/pkg/reg/dao/dao_test.go index fa357e56a51..e723cb1fc8f 100644 --- a/src/pkg/reg/dao/dao_test.go +++ b/src/pkg/reg/dao/dao_test.go @@ -66,7 +66,7 @@ func (d *daoTestSuite) TestCount() { // query by name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "harbor", }, }) @@ -89,7 +89,7 @@ func (d *daoTestSuite) TestList() { // query by name registries, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "harbor", }, }) diff --git a/src/pkg/reg/model/namespace.go b/src/pkg/reg/model/namespace.go index 87ae11b60ef..754cc6536df 100644 --- a/src/pkg/reg/model/namespace.go +++ b/src/pkg/reg/model/namespace.go @@ -20,8 +20,8 @@ package model // if the namespace has hierarchical structure, e.g organization->team, // it should be converted to organization.team type Namespace struct { - Name string `json:"name"` - Metadata map[string]interface{} `json:"metadata"` + Name string `json:"name"` + Metadata map[string]any `json:"metadata"` } // GetStringMetadata get a string value metadata from the namespace, if not found, return the default value. diff --git a/src/pkg/reg/model/policy.go b/src/pkg/reg/model/policy.go index 3b7260b77dc..6242f6b71f5 100644 --- a/src/pkg/reg/model/policy.go +++ b/src/pkg/reg/model/policy.go @@ -35,9 +35,9 @@ const ( // Filter holds the info of the filter type Filter struct { - Type string `json:"type"` - Value interface{} `json:"value"` - Decoration string `json:"decoration,omitempty"` + Type string `json:"type"` + Value any `json:"value"` + Decoration string `json:"decoration,omitempty"` } func (f *Filter) Validate() error { @@ -62,7 +62,7 @@ func (f *Filter) Validate() error { } } case FilterTypeLabel: - labels, ok := f.Value.([]interface{}) + labels, ok := f.Value.([]any) if !ok { return errors.New(nil).WithCode(errors.BadRequestCode). WithMessage("the type of label filter value isn't string slice") diff --git a/src/pkg/reg/model/resource.go b/src/pkg/reg/model/resource.go index 6cc5a0d2993..aa164db5789 100644 --- a/src/pkg/reg/model/resource.go +++ b/src/pkg/reg/model/resource.go @@ -27,10 +27,10 @@ const ( // Resource represents the general replicating content type Resource struct { - Type string `json:"type"` - Metadata *ResourceMetadata `json:"metadata"` - Registry *Registry `json:"registry"` - ExtendedInfo map[string]interface{} `json:"extended_info"` + Type string `json:"type"` + Metadata *ResourceMetadata `json:"metadata"` + Registry *Registry `json:"registry"` + ExtendedInfo map[string]any `json:"extended_info"` // Indicate if the resource is a deleted resource Deleted bool `json:"deleted"` // indicate the resource is a tag deletion @@ -51,8 +51,8 @@ type ResourceMetadata struct { // Repository info of the resource type Repository struct { - Name string `json:"name"` - Metadata map[string]interface{} `json:"metadata"` + Name string `json:"name"` + Metadata map[string]any `json:"metadata"` } // Artifact is the individual unit that can be replicated diff --git a/src/pkg/registry/interceptor/readonly/interceptor_test.go b/src/pkg/registry/interceptor/readonly/interceptor_test.go index f588b08239d..c8cdf02ddbe 100644 --- a/src/pkg/registry/interceptor/readonly/interceptor_test.go +++ b/src/pkg/registry/interceptor/readonly/interceptor_test.go @@ -53,7 +53,7 @@ func TestIntercept(t *testing.T) { // method: DELETE // read only enable: true req, _ = http.NewRequest(http.MethodDelete, "", nil) - err := config.DefaultMgr().UpdateConfig(context.Background(), map[string]interface{}{common.ReadOnly: true}) + err := config.DefaultMgr().UpdateConfig(context.Background(), map[string]any{common.ReadOnly: true}) require.Nil(t, err) time.Sleep(1 * time.Nanosecond) // make sure the cached key is expired assert.Equal(t, Err, interceptor.Intercept(req)) diff --git a/src/pkg/replication/dao/dao_test.go b/src/pkg/replication/dao/dao_test.go index e8c061d33c9..a0145e78274 100644 --- a/src/pkg/replication/dao/dao_test.go +++ b/src/pkg/replication/dao/dao_test.go @@ -63,7 +63,7 @@ func (d *daoTestSuite) TestCount() { // query by name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "test-rule", }, }) @@ -86,7 +86,7 @@ func (d *daoTestSuite) TestList() { // query by name policies, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "test-rule", }, }) diff --git a/src/pkg/repository/dao/dao_test.go b/src/pkg/repository/dao/dao_test.go index ed630dcc674..cb649d1a6ab 100644 --- a/src/pkg/repository/dao/dao_test.go +++ b/src/pkg/repository/dao/dao_test.go @@ -79,7 +79,7 @@ func (d *daoTestSuite) TestCount() { // query by name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": repository, }, }) @@ -102,7 +102,7 @@ func (d *daoTestSuite) TestList() { // query by name repositories, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": repository, }, }) diff --git a/src/pkg/repository/manager.go b/src/pkg/repository/manager.go index 4e36821dc0d..4d7115b5aa4 100644 --- a/src/pkg/repository/manager.go +++ b/src/pkg/repository/manager.go @@ -74,7 +74,7 @@ func (m *manager) Get(ctx context.Context, id int64) (*model.RepoRecord, error) func (m *manager) GetByName(ctx context.Context, name string) (repository *model.RepoRecord, err error) { repositories, err := m.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": name, }, }) diff --git a/src/pkg/repository/model/model.go b/src/pkg/repository/model/model.go index 6b1a44a0cc8..0e7616aecc8 100644 --- a/src/pkg/repository/model/model.go +++ b/src/pkg/repository/model/model.go @@ -42,7 +42,7 @@ type RepoRecord struct { } // FilterByBlobDigest filters the repositories by the blob digest -func (r *RepoRecord) FilterByBlobDigest(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (r *RepoRecord) FilterByBlobDigest(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { digest, ok := value.(string) if !ok || len(digest) == 0 { return qs diff --git a/src/pkg/retention/dao/retention_test.go b/src/pkg/retention/dao/retention_test.go index 18c89a55195..950eeb42289 100644 --- a/src/pkg/retention/dao/retention_test.go +++ b/src/pkg/retention/dao/retention_test.go @@ -54,7 +54,7 @@ func TestPolicy(t *testing.T) { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, diff --git a/src/pkg/retention/job_test.go b/src/pkg/retention/job_test.go index 3656d7aa06d..da856765b75 100644 --- a/src/pkg/retention/job_test.go +++ b/src/pkg/retention/job_test.go @@ -153,41 +153,41 @@ func (frc *fakeRetentionClient) DeleteRepository(repo *selector.Repository) erro type fakeLogger struct{} // For debuging -func (l *fakeLogger) Debug(v ...interface{}) {} +func (l *fakeLogger) Debug(v ...any) {} // For debuging with format -func (l *fakeLogger) Debugf(format string, v ...interface{}) {} +func (l *fakeLogger) Debugf(format string, v ...any) {} // For logging info -func (l *fakeLogger) Info(v ...interface{}) { +func (l *fakeLogger) Info(v ...any) { fmt.Println(v...) } // For logging info with format -func (l *fakeLogger) Infof(format string, v ...interface{}) { +func (l *fakeLogger) Infof(format string, v ...any) { fmt.Printf(format+"\n", v...) } // For warning -func (l *fakeLogger) Warning(v ...interface{}) {} +func (l *fakeLogger) Warning(v ...any) {} // For warning with format -func (l *fakeLogger) Warningf(format string, v ...interface{}) {} +func (l *fakeLogger) Warningf(format string, v ...any) {} // For logging error -func (l *fakeLogger) Error(v ...interface{}) { +func (l *fakeLogger) Error(v ...any) { fmt.Println(v...) } // For logging error with format -func (l *fakeLogger) Errorf(format string, v ...interface{}) { +func (l *fakeLogger) Errorf(format string, v ...any) { } // For fatal error -func (l *fakeLogger) Fatal(v ...interface{}) {} +func (l *fakeLogger) Fatal(v ...any) {} // For fatal error with error -func (l *fakeLogger) Fatalf(format string, v ...interface{}) {} +func (l *fakeLogger) Fatalf(format string, v ...any) {} type fakeJobContext struct{} @@ -195,7 +195,7 @@ func (c *fakeJobContext) Build(tracker job.Tracker) (job.Context, error) { return nil, nil } -func (c *fakeJobContext) Get(prop string) (interface{}, bool) { +func (c *fakeJobContext) Get(prop string) (any, bool) { return nil, false } diff --git a/src/pkg/retention/launcher.go b/src/pkg/retention/launcher.go index 766b67568da..968d839f849 100644 --- a/src/pkg/retention/launcher.go +++ b/src/pkg/retention/launcher.go @@ -83,7 +83,7 @@ type jobData struct { TaskID int64 Repository selector.Repository JobName string - JobParams map[string]interface{} + JobParams map[string]any } type launcher struct { @@ -211,7 +211,7 @@ func createJobs(repositoryRules map[selector.Repository]*lwp.Metadata, isDryRun jobData := &jobData{ Repository: repository, JobName: job.RetentionVendorType, - JobParams: make(map[string]interface{}, 3), + JobParams: make(map[string]any, 3), } // set dry run jobData.JobParams[ParamDryRun] = isDryRun @@ -241,7 +241,7 @@ func (l *launcher) submitTasks(ctx context.Context, executionID int64, jobDatas JobKind: job.KindGeneric, }, }, - map[string]interface{}{ + map[string]any{ "repository": jobData.Repository.Name, "dry_run": jobData.JobParams[ParamDryRun], }) @@ -288,7 +288,7 @@ func getRepositories(ctx context.Context, _ project.Manager, repositoryMgr repos */ // get image repositories imageRepositories, err := repositoryMgr.List(ctx, &pq.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": projectID, }, }) diff --git a/src/pkg/retention/manager_test.go b/src/pkg/retention/manager_test.go index 26edc51439d..e4e36c8946b 100644 --- a/src/pkg/retention/manager_test.go +++ b/src/pkg/retention/manager_test.go @@ -50,7 +50,7 @@ func TestPolicy(t *testing.T) { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, @@ -118,7 +118,7 @@ func TestExecution(t *testing.T) { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, diff --git a/src/pkg/retention/policy/action/index/index.go b/src/pkg/retention/policy/action/index/index.go index 693bdba7326..d706ada3e8e 100644 --- a/src/pkg/retention/policy/action/index/index.go +++ b/src/pkg/retention/policy/action/index/index.go @@ -40,7 +40,7 @@ func Register(action string, factory action.PerformerFactory) { } // Get performer with the provided action -func Get(act string, params interface{}, isDryRun bool) (action.Performer, error) { +func Get(act string, params any, isDryRun bool) (action.Performer, error) { if len(act) == 0 { return nil, errors.New("empty action") } diff --git a/src/pkg/retention/policy/action/index/index_test.go b/src/pkg/retention/policy/action/index/index_test.go index d7e43bd0a26..76d73d871ea 100644 --- a/src/pkg/retention/policy/action/index/index_test.go +++ b/src/pkg/retention/policy/action/index/index_test.go @@ -74,7 +74,7 @@ func (suite *IndexTestSuite) TestGet() { } type fakePerformer struct { - parameters interface{} + parameters any isDryRun bool } @@ -89,7 +89,7 @@ func (p *fakePerformer) Perform(ctx context.Context, candidates []*selector.Cand return } -func newFakePerformer(params interface{}, isDryRun bool) action.Performer { +func newFakePerformer(params any, isDryRun bool) action.Performer { return &fakePerformer{ parameters: params, isDryRun: isDryRun, diff --git a/src/pkg/retention/policy/action/performer.go b/src/pkg/retention/policy/action/performer.go index 2d2497c31dd..4d90eaddd23 100644 --- a/src/pkg/retention/policy/action/performer.go +++ b/src/pkg/retention/policy/action/performer.go @@ -43,7 +43,7 @@ type Performer interface { } // PerformerFactory is factory method for creating Performer -type PerformerFactory func(params interface{}, isDryRun bool) Performer +type PerformerFactory func(params any, isDryRun bool) Performer // retainAction make sure all the candidates will be retained and others will be cleared type retainAction struct { @@ -110,7 +110,7 @@ func isImmutable(ctx context.Context, c *selector.Candidate) bool { } // NewRetainAction is factory method for RetainAction -func NewRetainAction(params interface{}, isDryRun bool) Performer { +func NewRetainAction(params any, isDryRun bool) Performer { if params != nil { if all, ok := params.([]*selector.Candidate); ok { return &retainAction{ diff --git a/src/pkg/retention/policy/models.go b/src/pkg/retention/policy/models.go index 7e5e8d0b9fc..e41e079e711 100644 --- a/src/pkg/retention/policy/models.go +++ b/src/pkg/retention/policy/models.go @@ -117,7 +117,7 @@ type Trigger struct { // Settings for the specified trigger // '[cron]="* 22 11 * * *"' for the 'Schedule' - Settings map[string]interface{} `json:"settings" valid:"Required"` + Settings map[string]any `json:"settings" valid:"Required"` } // Scope definition @@ -164,7 +164,7 @@ func WithNDaysSinceLastPull(projID int64, n int) *Metadata { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "0 0 0 * * *", }, }, diff --git a/src/pkg/retention/policy/models_test.go b/src/pkg/retention/policy/models_test.go index 78daa1d4e30..ea551d30af7 100644 --- a/src/pkg/retention/policy/models_test.go +++ b/src/pkg/retention/policy/models_test.go @@ -65,15 +65,15 @@ func (p *PolicyTestSuite) TestValidateRetentionPolicy() { p.NoError(p.policy.ValidateRetentionPolicy()) // cron value is an empty string - p.policy.Trigger.Settings = map[string]interface{}{"cron": ""} + p.policy.Trigger.Settings = map[string]any{"cron": ""} p.NoError(p.policy.ValidateRetentionPolicy()) // the 1st field of cron value is not 0 - p.policy.Trigger.Settings = map[string]interface{}{"cron": "1 0 0 1 1 *"} + p.policy.Trigger.Settings = map[string]any{"cron": "1 0 0 1 1 *"} p.Error(p.policy.ValidateRetentionPolicy()) // valid cron value - p.policy.Trigger.Settings = map[string]interface{}{"cron": "0 0 0 1 1 *"} + p.policy.Trigger.Settings = map[string]any{"cron": "0 0 0 1 1 *"} p.NoError(p.policy.ValidateRetentionPolicy()) } @@ -109,7 +109,7 @@ func TestRule(t *testing.T) { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, @@ -162,7 +162,7 @@ func TestParamValid(t *testing.T) { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, @@ -209,7 +209,7 @@ func TestParamValid(t *testing.T) { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, diff --git a/src/pkg/retention/policy/rule/index/index.go b/src/pkg/retention/policy/rule/index/index.go index 1555aedd662..7f7941dd136 100644 --- a/src/pkg/retention/policy/rule/index/index.go +++ b/src/pkg/retention/policy/rule/index/index.go @@ -253,7 +253,7 @@ func Get(templateID string, parameters rule.Parameters) (rule.Evaluator, error) func Index() []*Metadata { res := make([]*Metadata, 0) - index.Range(func(_, v interface{}) bool { + index.Range(func(_, v any) bool { if item, ok := v.(*indexedItem); ok { res = append(res, item.Meta) return true diff --git a/src/pkg/retention/policy/rule/models.go b/src/pkg/retention/policy/rule/models.go index 0c55abe5271..35566f450eb 100644 --- a/src/pkg/retention/policy/rule/models.go +++ b/src/pkg/retention/policy/rule/models.go @@ -84,4 +84,4 @@ type Selector struct { type Parameters map[string]Parameter // Parameter of rule -type Parameter interface{} +type Parameter any diff --git a/src/pkg/robot/dao/dao_test.go b/src/pkg/robot/dao/dao_test.go index 1a04434f458..d42a1ff9ca8 100644 --- a/src/pkg/robot/dao/dao_test.go +++ b/src/pkg/robot/dao/dao_test.go @@ -89,7 +89,7 @@ func (suite *DaoTestSuite) TestDelete() { func (suite *DaoTestSuite) TestList() { robots, err := suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "test3", }, }) @@ -106,7 +106,7 @@ func (suite *DaoTestSuite) TestList() { _, err = suite.dao.Create(orm.Context(), r) suite.Nil(err) robots, err = suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "testvisible", "visible": true, }, @@ -133,7 +133,7 @@ func (suite *DaoTestSuite) TestCount() { // query by name total, err = suite.dao.Count(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "test3", }, }) @@ -156,7 +156,7 @@ func (suite *DaoTestSuite) TestUpdate() { func (suite *DaoTestSuite) TestDeleteByProjectID() { robots, err := suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "project_id": 2, }, }) @@ -166,7 +166,7 @@ func (suite *DaoTestSuite) TestDeleteByProjectID() { suite.Nil(err) robots, err = suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "project_id": 2, }, }) diff --git a/src/pkg/scan/dao/scan/report_test.go b/src/pkg/scan/dao/scan/report_test.go index 6f6b81d1464..7aa2ab2d5c7 100644 --- a/src/pkg/scan/dao/scan/report_test.go +++ b/src/pkg/scan/dao/scan/report_test.go @@ -69,7 +69,7 @@ func (suite *ReportTestSuite) TestReportList() { query1 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "digest": "digest1001", "registration_uuid": "ruuid", "mime_type": v1.MimeTypeNativeReport, @@ -82,7 +82,7 @@ func (suite *ReportTestSuite) TestReportList() { query2 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "digest": "digest1002", }, } diff --git a/src/pkg/scan/dao/scan/vulnerability_test.go b/src/pkg/scan/dao/scan/vulnerability_test.go index 9b56ffd672d..e1a828b1487 100644 --- a/src/pkg/scan/dao/scan/vulnerability_test.go +++ b/src/pkg/scan/dao/scan/vulnerability_test.go @@ -240,7 +240,7 @@ func (suite *VulnerabilityTestSuite) TestDeleteVulnerabilityRecord() { // TestListVulnerabilityRecord gets vulnerability records for scanner func (suite *VulnerabilityTestSuite) TestListVulnerabilityRecord() { - vulns, err := suite.vulnerabilityRecordDao.List(suite.Context(), &q.Query{Keywords: map[string]interface{}{"CVEID": "CVE-ID1"}}) + vulns, err := suite.vulnerabilityRecordDao.List(suite.Context(), &q.Query{Keywords: map[string]any{"CVEID": "CVE-ID1"}}) suite.NoError(err, "Error when fetching vulnerability records for report") suite.True(len(vulns) > 0) } diff --git a/src/pkg/scan/dao/scanner/model.go b/src/pkg/scan/dao/scanner/model.go index cc418e624f9..070dc410e99 100644 --- a/src/pkg/scan/dao/scanner/model.go +++ b/src/pkg/scan/dao/scanner/model.go @@ -66,9 +66,9 @@ type Registration struct { Metadata *v1.ScannerAdapterMetadata `orm:"-" json:"-"` // Timestamps - CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"` - UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"update_time"` - Capabilities map[string]interface{} `orm:"-" json:"capabilities,omitempty"` + CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"` + UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"update_time"` + Capabilities map[string]any `orm:"-" json:"capabilities,omitempty"` } // TableName for Endpoint diff --git a/src/pkg/scan/dao/scanner/registration_test.go b/src/pkg/scan/dao/scanner/registration_test.go index 0dd6b0f1f86..f6f8f2b22fc 100644 --- a/src/pkg/scan/dao/scanner/registration_test.go +++ b/src/pkg/scan/dao/scanner/registration_test.go @@ -108,7 +108,7 @@ func (suite *RegistrationDAOTestSuite) TestList() { require.Equal(suite.T(), 1, len(l)) // with query and found items - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["description"] = &q.FuzzyMatchValue{Value: "sample"} l, err = ListRegistrations(suite.Context(), &q.Query{ PageSize: 5, @@ -127,7 +127,7 @@ func (suite *RegistrationDAOTestSuite) TestList() { require.Equal(suite.T(), 0, len(l)) // Exact match - exactKeywords := make(map[string]interface{}) + exactKeywords := make(map[string]any) exactKeywords["name"] = "forUT" l, err = ListRegistrations(suite.Context(), &q.Query{ Keywords: exactKeywords, diff --git a/src/pkg/scan/export/manager.go b/src/pkg/scan/export/manager.go index b145265ed5d..ed0d886fef2 100644 --- a/src/pkg/scan/export/manager.go +++ b/src/pkg/scan/export/manager.go @@ -164,7 +164,7 @@ func (em *exportManager) buildQuery(ctx context.Context, params Params) (beego_o PageSize: pageSize, Sorting: "", } - paginationParams := make([]interface{}, 0) + paginationParams := make([]any, 0) query, pageLimits := orm.PaginationOnRawSQL(q, sql, paginationParams) // user can open ORM_DEBUG for log the sql return ormer.Raw(query, pageLimits), nil diff --git a/src/pkg/scan/export/manager_test.go b/src/pkg/scan/export/manager_test.go index 45c288a1167..c2e31f44dcd 100644 --- a/src/pkg/scan/export/manager_test.go +++ b/src/pkg/scan/export/manager_test.go @@ -174,8 +174,8 @@ func (suite *ExportManagerSuite) generateVulnerabilityRecordsForReport(registrat } else { vulnV2.Severity = "Low" } - var vendorAttributes = make(map[string]interface{}) - vendorAttributes["CVSS"] = map[string]interface{}{"nvd": map[string]interface{}{"V2Score": "4.3"}} + var vendorAttributes = make(map[string]any) + vendorAttributes["CVSS"] = map[string]any{"nvd": map[string]any{"V2Score": "4.3"}} data, _ := json.Marshal(vendorAttributes) vulnV2.VendorAttributes = string(data) vulns = append(vulns, vulnV2) diff --git a/src/pkg/scan/handler.go b/src/pkg/scan/handler.go index 2844769ac5c..c26640d8c32 100644 --- a/src/pkg/scan/handler.go +++ b/src/pkg/scan/handler.go @@ -46,7 +46,7 @@ type Handler interface { // RequiredPermissions defines the permission used by the scan robot account RequiredPermissions() []*types.Policy // RequestParameters defines the parameters for scan request - RequestParameters() map[string]interface{} + RequestParameters() map[string]any // PostScan defines the operation after scan PostScan(ctx job.Context, sr *v1.ScanRequest, rp *scan.Report, rawReport string, startTime time.Time, robot *model.Robot) (string, error) ReportHandler @@ -65,5 +65,5 @@ type ReportHandler interface { // GetPlaceHolder get the the report place holder GetPlaceHolder(ctx context.Context, artRepo string, artDigest string, scannerUUID string, mimeType string) (rp *scan.Report, err error) // GetSummary get the summary of the report - GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]interface{}, error) + GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]any, error) } diff --git a/src/pkg/scan/init_test.go b/src/pkg/scan/init_test.go index 5904e7d233f..ce474817594 100644 --- a/src/pkg/scan/init_test.go +++ b/src/pkg/scan/init_test.go @@ -39,7 +39,7 @@ func TestEnsureScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name__in": []string{"scanner"}, }, }).Return(nil, errors.New("DB error")) @@ -57,7 +57,7 @@ func TestEnsureScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name__in": []string{ "trivy", }, @@ -81,7 +81,7 @@ func TestEnsureScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name__in": []string{ "trivy", }, @@ -136,7 +136,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return(nil, errors.New("DB error")) err := EnsureDefaultScanner(context.TODO(), "trivy") @@ -150,7 +150,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return([]*scanner.Registration{ {Name: "trivy"}, {Name: "trivy"}, @@ -167,7 +167,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return([]*scanner.Registration{ { Name: "trivy", @@ -188,7 +188,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return([]*scanner.Registration{ { Name: "trivy", @@ -221,7 +221,7 @@ func TestRemoveImmutableScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "immutable": true, "name__in": []string{"scanner"}, }, @@ -249,7 +249,7 @@ func TestRemoveImmutableScanners(t *testing.T) { }} mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "immutable": true, "name__in": []string{ "scanner-1", @@ -285,7 +285,7 @@ func TestRemoveImmutableScanners(t *testing.T) { }} mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "immutable": true, "name__in": []string{ "scanner-1", diff --git a/src/pkg/scan/job.go b/src/pkg/scan/job.go index e485a143dd1..c0e106e13b4 100644 --- a/src/pkg/scan/job.go +++ b/src/pkg/scan/job.go @@ -501,10 +501,10 @@ func extractMimeTypes(params job.Parameters) ([]string, error) { return nil, errors.Errorf("missing job parameter '%s'", JobParameterMimes) } - l, ok := v.([]interface{}) + l, ok := v.([]any) if !ok { return nil, errors.Errorf( - "malformed job parameter '%s', expecting []interface{} but got %s", + "malformed job parameter '%s', expecting []any but got %s", JobParameterMimes, reflect.TypeOf(v).String(), ) diff --git a/src/pkg/scan/postprocessors/report_converters.go b/src/pkg/scan/postprocessors/report_converters.go index 2be32c434f9..a9a1082f968 100644 --- a/src/pkg/scan/postprocessors/report_converters.go +++ b/src/pkg/scan/postprocessors/report_converters.go @@ -105,7 +105,7 @@ func (c *nativeToRelationalSchemaConverter) toSchema(ctx context.Context, report return err } - var cveIDs []interface{} + var cveIDs []any for _, v := range vulnReport.Vulnerabilities { v.Severity = vuln.ParseSeverityVersion3(v.Severity.String()) cveIDs = append(cveIDs, v.ID) @@ -226,7 +226,7 @@ func (c *nativeToRelationalSchemaConverter) fromSchema(_ context.Context, _ stri // GetNativeV1ReportFromResolvedData returns the native V1 scan report from the resolved // interface data. -func (c *nativeToRelationalSchemaConverter) getNativeV1ReportFromResolvedData(ctx job.Context, rp interface{}) (*vuln.Report, error) { +func (c *nativeToRelationalSchemaConverter) getNativeV1ReportFromResolvedData(ctx job.Context, rp any) (*vuln.Report, error) { report, ok := rp.(*vuln.Report) if !ok { return nil, errors.New("Data cannot be converted to v1 report format") @@ -295,7 +295,7 @@ func toVulnerabilityItem(record *scan.VulnerabilityRecord, artifactDigest string item.Links = append(item.Links, urls...) item.Severity = vuln.ParseSeverityVersion3(record.Severity) item.Package = record.Package - var vendorAttributes map[string]interface{} + var vendorAttributes map[string]any _ = json.Unmarshal([]byte(record.VendorAttributes), &vendorAttributes) item.VendorAttributes = vendorAttributes @@ -356,7 +356,7 @@ func (c *nativeToRelationalSchemaConverter) updateReport(ctx context.Context, vu // CVS ... type CVS struct { - CVSS map[string]map[string]interface{} `json:"CVSS"` + CVSS map[string]map[string]any `json:"CVSS"` } func parseScoreFromVendorAttribute(ctx context.Context, vendorAttribute string) float64 { diff --git a/src/pkg/scan/report/manager.go b/src/pkg/scan/report/manager.go index 3bc2de1f112..becfdf3ecd6 100644 --- a/src/pkg/scan/report/manager.go +++ b/src/pkg/scan/report/manager.go @@ -167,7 +167,7 @@ func (bm *basicManager) GetBy(ctx context.Context, digest string, registrationUU return nil, errors.New("empty digest to get report data") } - kws := make(map[string]interface{}) + kws := make(map[string]any) kws["digest"] = digest if len(registrationUUID) > 0 { kws["registration_uuid"] = registrationUUID diff --git a/src/pkg/scan/report/report.go b/src/pkg/scan/report/report.go index 33c25da3be3..d9fa6fb8120 100644 --- a/src/pkg/scan/report/report.go +++ b/src/pkg/scan/report/report.go @@ -22,7 +22,7 @@ import ( ) // Merger is a helper function to merge report together -type Merger func(r1, r2 interface{}) (interface{}, error) +type Merger func(r1, r2 any) (any, error) // SupportedMergers declares mappings between mime type and report merger func. var SupportedMergers = map[string]Merger{ @@ -31,7 +31,7 @@ var SupportedMergers = map[string]Merger{ } // Merge merge report r1 and r2 -func Merge(mimeType string, r1, r2 interface{}) (interface{}, error) { +func Merge(mimeType string, r1, r2 any) (any, error) { m, ok := SupportedMergers[mimeType] if !ok { return nil, errors.Errorf("no report merger bound with mime type %s", mimeType) @@ -41,7 +41,7 @@ func Merge(mimeType string, r1, r2 interface{}) (interface{}, error) { } // MergeNativeReport merge report r1 and r2 -func MergeNativeReport(r1, r2 interface{}) (interface{}, error) { +func MergeNativeReport(r1, r2 any) (any, error) { nr1, ok := r1.(*vuln.Report) if !ok { return nil, errors.New("native report required") @@ -59,8 +59,8 @@ func MergeNativeReport(r1, r2 interface{}) (interface{}, error) { type Reports []*scan.Report // ResolveData resolve the data from the reports and merge them together -func (l Reports) ResolveData(mimeType string) (interface{}, error) { - var result interface{} +func (l Reports) ResolveData(mimeType string) (any, error) { + var result any for _, rp := range l { // Resolve scan report data only when it is ready and its mime type equal the given one diff --git a/src/pkg/scan/report/summary.go b/src/pkg/scan/report/summary.go index 252a61921b0..0fc907d049e 100644 --- a/src/pkg/scan/report/summary.go +++ b/src/pkg/scan/report/summary.go @@ -41,7 +41,7 @@ func WithArtifactDigest(artifactDigest string) Option { } // SummaryMerger is a helper function to merge summary together -type SummaryMerger func(s1, s2 interface{}) (interface{}, error) +type SummaryMerger func(s1, s2 any) (any, error) // SupportedSummaryMergers declares mappings between mime type and summary merger func. var SupportedSummaryMergers = map[string]SummaryMerger{ @@ -50,7 +50,7 @@ var SupportedSummaryMergers = map[string]SummaryMerger{ } // MergeSummary merge summary s1 and s2 -func MergeSummary(mimeType string, s1, s2 interface{}) (interface{}, error) { +func MergeSummary(mimeType string, s1, s2 any) (any, error) { m, ok := SupportedSummaryMergers[mimeType] if !ok { return nil, errors.Errorf("no summary merger bound with mime type %s", mimeType) @@ -60,7 +60,7 @@ func MergeSummary(mimeType string, s1, s2 interface{}) (interface{}, error) { } // MergeNativeSummary merge vuln.NativeReportSummary together -func MergeNativeSummary(s1, s2 interface{}) (interface{}, error) { +func MergeNativeSummary(s1, s2 any) (any, error) { nrs1, ok := s1.(*vuln.NativeReportSummary) if !ok { return nil, errors.New("native report summary required") @@ -82,7 +82,7 @@ var SupportedGenerators = map[string]SummaryGenerator{ // GenerateSummary is a helper function to generate report // summary based on the given report. -func GenerateSummary(r *scan.Report, options ...Option) (interface{}, error) { +func GenerateSummary(r *scan.Report, options ...Option) (any, error) { g, ok := SupportedGenerators[r.MimeType] if !ok { return nil, errors.Errorf("no generator bound with mime type %s", r.MimeType) @@ -93,10 +93,10 @@ func GenerateSummary(r *scan.Report, options ...Option) (interface{}, error) { // SummaryGenerator is a func template which used to generated report // summary for relevant mime type. -type SummaryGenerator func(r *scan.Report, options ...Option) (interface{}, error) +type SummaryGenerator func(r *scan.Report, options ...Option) (any, error) // GenerateNativeSummary generates the report summary for the native report. -func GenerateNativeSummary(r *scan.Report, _ ...Option) (interface{}, error) { +func GenerateNativeSummary(r *scan.Report, _ ...Option) (any, error) { sum := &vuln.NativeReportSummary{} sum.ReportID = r.UUID sum.StartTime = r.StartTime diff --git a/src/pkg/scan/report/supported_mimes.go b/src/pkg/scan/report/supported_mimes.go index 7ab8d13eb78..da5e04a4b18 100644 --- a/src/pkg/scan/report/supported_mimes.go +++ b/src/pkg/scan/report/supported_mimes.go @@ -24,14 +24,14 @@ import ( ) // SupportedMimes indicates what mime types are supported to render at UI end. -var SupportedMimes = map[string]interface{}{ +var SupportedMimes = map[string]any{ // The native report type v1.MimeTypeNativeReport: (*vuln.Report)(nil), v1.MimeTypeGenericVulnerabilityReport: (*vuln.Report)(nil), } // ResolveData is a helper func to parse the JSON data with the given mime type. -func ResolveData(mime string, jsonData []byte, options ...Option) (interface{}, error) { +func ResolveData(mime string, jsonData []byte, options ...Option) (any, error) { // If no resolver defined for the given mime types, directly ignore it. // The raw data will be used. t, ok := SupportedMimes[mime] diff --git a/src/pkg/scan/rest/v1/client.go b/src/pkg/scan/rest/v1/client.go index a5ae04075f5..b9238e53cae 100644 --- a/src/pkg/scan/rest/v1/client.go +++ b/src/pkg/scan/rest/v1/client.go @@ -59,7 +59,7 @@ type Client interface { // GetScanReport gets the scan result for the corresponding ScanRequest identifier. // Note that this is a blocking method which either returns a non `nil` scan report or error. - // A caller is supposed to cast the returned interface{} to a structure that corresponds + // A caller is supposed to cast the returned any to a structure that corresponds // to the specified MIME type. // // Arguments: diff --git a/src/pkg/scan/rest/v1/models.go b/src/pkg/scan/rest/v1/models.go index 06e6fb0a1c7..83fb29ec7d3 100644 --- a/src/pkg/scan/rest/v1/models.go +++ b/src/pkg/scan/rest/v1/models.go @@ -159,8 +159,8 @@ func (md *ScannerAdapterMetadata) GetCapability(mimeType string) *ScannerCapabil } // ConvertCapability converts the capability to map, used in get scanner API -func (md *ScannerAdapterMetadata) ConvertCapability() map[string]interface{} { - capabilities := make(map[string]interface{}) +func (md *ScannerAdapterMetadata) ConvertCapability() map[string]any { + capabilities := make(map[string]any) oldScanner := true for _, c := range md.Capabilities { if len(c.Type) > 0 { @@ -228,7 +228,7 @@ type ScanType struct { // ProducesMimeTypes defines scanreport should be ProducesMimeTypes []string `json:"produces_mime_types"` // Parameters extra parameters - Parameters map[string]interface{} `json:"parameters"` + Parameters map[string]any `json:"parameters"` } // FromJSON parses ScanRequest from json data diff --git a/src/pkg/scan/sbom/dao/dao_test.go b/src/pkg/scan/sbom/dao/dao_test.go index 2fcb7a3b0e3..b8b6f5ae846 100644 --- a/src/pkg/scan/sbom/dao/dao_test.go +++ b/src/pkg/scan/sbom/dao/dao_test.go @@ -94,7 +94,7 @@ func (suite *ReportTestSuite) TestUpdate() { query1 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": 111, "registration_uuid": "ruuid", "mime_type": v1.MimeTypeSBOMReport, @@ -110,7 +110,7 @@ func (suite *ReportTestSuite) TestReportList() { query1 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": 111, "registration_uuid": "ruuid", "mime_type": v1.MimeTypeSBOMReport, @@ -123,7 +123,7 @@ func (suite *ReportTestSuite) TestReportList() { query2 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": 222, }, } diff --git a/src/pkg/scan/sbom/manager.go b/src/pkg/scan/sbom/manager.go index 75ccad1abd1..57545b76550 100644 --- a/src/pkg/scan/sbom/manager.go +++ b/src/pkg/scan/sbom/manager.go @@ -152,7 +152,7 @@ func (bm *basicManager) GetBy(ctx context.Context, artifactID int64, registratio return nil, errors.New("no artifact id to get sbom report data") } - kws := make(map[string]interface{}) + kws := make(map[string]any) kws["artifact_id"] = artifactID if len(registrationUUID) > 0 { kws["registration_uuid"] = registrationUUID diff --git a/src/pkg/scan/sbom/model/report.go b/src/pkg/scan/sbom/model/report.go index 6d1424b1ac3..7620731ab6d 100644 --- a/src/pkg/scan/sbom/model/report.go +++ b/src/pkg/scan/sbom/model/report.go @@ -42,5 +42,5 @@ type RawSBOMReport struct { // MediaType the media type of the report, e.g. application/spdx+json MediaType string `json:"media_type"` // SBOM sbom content - SBOM map[string]interface{} `json:"sbom,omitempty"` + SBOM map[string]any `json:"sbom,omitempty"` } diff --git a/src/pkg/scan/sbom/model/summary.go b/src/pkg/scan/sbom/model/summary.go index 0d7e6a2ef29..139375fa59f 100644 --- a/src/pkg/scan/sbom/model/summary.go +++ b/src/pkg/scan/sbom/model/summary.go @@ -34,7 +34,7 @@ const ( ) // Summary includes the sbom summary information -type Summary map[string]interface{} +type Summary map[string]any // SBOMAccArt returns the repository and digest of the SBOM func (s Summary) SBOMAccArt() (repo, digest string) { diff --git a/src/pkg/scan/sbom/sbom.go b/src/pkg/scan/sbom/sbom.go index b58057f9e32..f1707a28f14 100644 --- a/src/pkg/scan/sbom/sbom.go +++ b/src/pkg/scan/sbom/sbom.go @@ -78,8 +78,8 @@ func (h *scanHandler) RequestProducesMineTypes() []string { } // RequestParameters defines the parameters for scan request -func (h *scanHandler) RequestParameters() map[string]interface{} { - return map[string]interface{}{"sbom_media_types": []string{sbomMediaTypeSpdx}} +func (h *scanHandler) RequestParameters() map[string]any { + return map[string]any{"sbom_media_types": []string{sbomMediaTypeSpdx}} } // PostScan defines task specific operations after the scan is complete @@ -295,7 +295,7 @@ func (h *scanHandler) GetPlaceHolder(ctx context.Context, artRepo string, artDig }, nil } -func (h *scanHandler) GetSummary(ctx context.Context, art *artifact.Artifact, mimeTypes []string) (map[string]interface{}, error) { +func (h *scanHandler) GetSummary(ctx context.Context, art *artifact.Artifact, mimeTypes []string) (map[string]any, error) { if len(mimeTypes) == 0 { return nil, errors.New("no mime types to get report summaries") } @@ -312,10 +312,10 @@ func (h *scanHandler) GetSummary(ctx context.Context, art *artifact.Artifact, mi return nil, err } if len(reports) == 0 { - return map[string]interface{}{}, nil + return map[string]any{}, nil } reportContent := reports[0].ReportSummary - result := map[string]interface{}{} + result := map[string]any{} if len(reportContent) == 0 { status := h.TaskMgrFunc().RetrieveStatusFromTask(ctx, reports[0].UUID) if len(status) > 0 { diff --git a/src/pkg/scan/scanner/manager_test.go b/src/pkg/scan/scanner/manager_test.go index 742aae302bb..8338d32f4d1 100644 --- a/src/pkg/scan/scanner/manager_test.go +++ b/src/pkg/scan/scanner/manager_test.go @@ -64,7 +64,7 @@ func (suite *BasicManagerTestSuite) TearDownSuite() { // TestList tests list registrations func (suite *BasicManagerTestSuite) TestList() { - m := make(map[string]interface{}, 1) + m := make(map[string]any, 1) m["name"] = "forUT" l, err := suite.mgr.List(suite.Context(), &q.Query{ diff --git a/src/pkg/scan/vuln/report.go b/src/pkg/scan/vuln/report.go index fbc119f6443..71585bb51e7 100644 --- a/src/pkg/scan/vuln/report.go +++ b/src/pkg/scan/vuln/report.go @@ -35,7 +35,7 @@ type Report struct { vulnerabilityItemList *VulnerabilityItemList // SBOM sbom content - SBOM map[string]interface{} `json:"sbom,omitempty"` + SBOM map[string]any `json:"sbom,omitempty"` } // GetVulnerabilityItemList returns VulnerabilityItemList from the Vulnerabilities of report @@ -225,7 +225,7 @@ type VulnerabilityItem struct { CWEIds []string `json:"cwe_ids"` // A collection of vendor specific attributes for the vulnerability item // with each attribute represented as a key-value pair. - VendorAttributes map[string]interface{} `json:"vendor_attributes"` + VendorAttributes map[string]any `json:"vendor_attributes"` } // Key returns the uniq key for the item diff --git a/src/pkg/scan/vulnerability/vul.go b/src/pkg/scan/vulnerability/vul.go index 26fe7ab1ae1..518fd2229ef 100644 --- a/src/pkg/scan/vulnerability/vul.go +++ b/src/pkg/scan/vulnerability/vul.go @@ -230,7 +230,7 @@ func (h *scanHandler) RequestProducesMineTypes() []string { } // RequestParameters defines the parameters for scan request -func (h *scanHandler) RequestParameters() map[string]interface{} { +func (h *scanHandler) RequestParameters() map[string]any { return nil } @@ -270,7 +270,7 @@ func (h *scanHandler) Update(ctx context.Context, uuid string, rpt string) error return nil } -func (h *scanHandler) GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]interface{}, error) { +func (h *scanHandler) GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]any, error) { bc := h.ScanControllerFunc() if ar == nil { return nil, errors.New("no way to get report summaries for nil artifact") @@ -280,7 +280,7 @@ func (h *scanHandler) GetSummary(ctx context.Context, ar *artifact.Artifact, mim if err != nil { return nil, err } - summaries := make(map[string]interface{}, len(rps)) + summaries := make(map[string]any, len(rps)) for _, rp := range rps { sum, err := report.GenerateSummary(rp) if err != nil { diff --git a/src/pkg/scheduler/dao_test.go b/src/pkg/scheduler/dao_test.go index e2503e8a74a..e44c276abfb 100644 --- a/src/pkg/scheduler/dao_test.go +++ b/src/pkg/scheduler/dao_test.go @@ -76,7 +76,7 @@ func (d *daoTestSuite) TestCreate() { func (d *daoTestSuite) TestList() { schedules, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "CallbackFuncName": "callback_func_01", }, }) diff --git a/src/pkg/scheduler/scheduler.go b/src/pkg/scheduler/scheduler.go index be065e6d6ab..accdd82624e 100644 --- a/src/pkg/scheduler/scheduler.go +++ b/src/pkg/scheduler/scheduler.go @@ -36,15 +36,15 @@ var ( // Schedule describes the detail information about the created schedule type Schedule struct { - ID int64 `json:"id"` - VendorType string `json:"vendor_type"` - VendorID int64 `json:"vendor_id"` - CRONType string `json:"cron_type"` - CRON string `json:"cron"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` - Status string `json:"status"` // status of the underlying task(jobservice job) - CreationTime time.Time `json:"creation_time"` - UpdateTime time.Time `json:"update_time"` + ID int64 `json:"id"` + VendorType string `json:"vendor_type"` + VendorID int64 `json:"vendor_id"` + CRONType string `json:"cron_type"` + CRON string `json:"cron"` + ExtraAttrs map[string]any `json:"extra_attrs"` + Status string `json:"status"` // status of the underlying task(jobservice job) + CreationTime time.Time `json:"creation_time"` + UpdateTime time.Time `json:"update_time"` // we can extend this model to include more information(e.g. how many times the schedule already // runs; when will the schedule runs next time) } @@ -60,7 +60,7 @@ type Scheduler interface { // function must decode it before using // The customized attributes can be put into the "extraAttrs" Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, - cron string, callbackFuncName string, callbackFuncParams interface{}, extraAttrs map[string]interface{}) (int64, error) + cron string, callbackFuncName string, callbackFuncParams any, extraAttrs map[string]any) (int64, error) // UnScheduleByID the schedule specified by ID UnScheduleByID(ctx context.Context, id int64) error // UnScheduleByVendor the schedule specified by vendor @@ -93,7 +93,7 @@ func (s *scheduler) CountSchedules(ctx context.Context, query *q.Query) (int64, } func (s *scheduler) Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, - cron string, callbackFuncName string, callbackFuncParams interface{}, extraAttrs map[string]interface{}) (int64, error) { + cron string, callbackFuncName string, callbackFuncParams any, extraAttrs map[string]any) (int64, error) { if len(vendorType) == 0 { return 0, fmt.Errorf("empty vendor type") } @@ -121,7 +121,7 @@ func (s *scheduler) Schedule(ctx context.Context, vendorType string, vendorID in return 0, err } sched.CallbackFuncParam = string(paramsData) - params := map[string]interface{}{} + params := map[string]any{} if len(paramsData) > 0 { err = json.Unmarshal(paramsData, ¶ms) if err != nil { @@ -196,7 +196,7 @@ func (s *scheduler) Schedule(ctx context.Context, vendorType string, vendorID in func (s *scheduler) UnScheduleByID(ctx context.Context, id int64) error { executions, err := s.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": JobNameScheduler, "VendorID": id, }, @@ -228,7 +228,7 @@ func (s *scheduler) UnScheduleByID(ctx context.Context, id int64) error { func (s *scheduler) UnScheduleByVendor(ctx context.Context, vendorType string, vendorID int64) error { q := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": vendorType, }, } @@ -282,7 +282,7 @@ func (s *scheduler) convertSchedule(ctx context.Context, schedule *schedule) (*S UpdateTime: schedule.UpdateTime, } if len(schedule.ExtraAttrs) > 0 { - extras := map[string]interface{}{} + extras := map[string]any{} if err := json.Unmarshal([]byte(schedule.ExtraAttrs), &extras); err != nil { log.Errorf("failed to unmarshal the extra attributes of schedule %d: %v", schedule.ID, err) return nil, err @@ -291,7 +291,7 @@ func (s *scheduler) convertSchedule(ctx context.Context, schedule *schedule) (*S } executions, err := s.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": JobNameScheduler, "VendorID": schedule.ID, }, diff --git a/src/pkg/scheduler/scheduler_test.go b/src/pkg/scheduler/scheduler_test.go index 3eed26f9141..5177041678d 100644 --- a/src/pkg/scheduler/scheduler_test.go +++ b/src/pkg/scheduler/scheduler_test.go @@ -57,7 +57,7 @@ func (s *schedulerTestSuite) SetupTest() { func (s *schedulerTestSuite) TestSchedule() { // empty vendor type - extras := make(map[string]interface{}) + extras := make(map[string]any) id, err := s.scheduler.Schedule(s.ctx, "", 0, "", "0 * * * * *", "callback", nil, extras) s.NotNil(err) diff --git a/src/pkg/securityhub/dao/security.go b/src/pkg/securityhub/dao/security.go index 03506d28a2f..557b10a0fbe 100644 --- a/src/pkg/securityhub/dao/security.go +++ b/src/pkg/securityhub/dao/security.go @@ -105,7 +105,7 @@ type filterMetaData struct { // ColumnName is the column name in the database, if it is empty, the key will be used as the column name ColumnName string // FilterFunc is the function to generate the filter sql, default is exactMatchFilter - FilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) + FilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []any) } // filterMap define the query condition @@ -120,9 +120,9 @@ var filterMap = map[string]*filterMetaData{ "digest": &filterMetaData{DataType: stringType, ColumnName: "a.digest"}, } -var applyFilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) +var applyFilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []any) -func exactMatchFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) { +func exactMatchFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []any) { if query == nil { return } @@ -138,7 +138,7 @@ func exactMatchFilter(_ context.Context, key string, query *q.Query) (sqlStr str return } -func rangeFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) { +func rangeFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []any) { if query == nil { return } @@ -151,7 +151,7 @@ func rangeFilter(_ context.Context, key string, query *q.Query) (sqlStr string, return } -func tagFilter(ctx context.Context, _ string, query *q.Query) (sqlStr string, params []interface{}) { +func tagFilter(ctx context.Context, _ string, query *q.Query) (sqlStr string, params []any) { if query == nil { return } @@ -272,7 +272,7 @@ func (d *dao) CountVulnerabilities(ctx context.Context, registrationUUID string, return 0, err } sqlStr := vulnerabilitySQL - params := []interface{}{registrationUUID} + params := []any{registrationUUID} if err := checkQFilter(query, filterMap); err != nil { return 0, err } @@ -293,7 +293,7 @@ func (d *dao) CountVulnerabilities(ctx context.Context, registrationUUID string, } // countExceedLimit check if the count is exceed to limit 1000, avoid count all record for large table -func (d *dao) countExceedLimit(ctx context.Context, sqlStr string, params []interface{}) (bool, error) { +func (d *dao) countExceedLimit(ctx context.Context, sqlStr string, params []any) (bool, error) { o, err := orm.FromContext(ctx) if err != nil { return false, err @@ -313,7 +313,7 @@ func (d *dao) ListVulnerabilities(ctx context.Context, registrationUUID string, return nil, err } sqlStr := vulnerabilitySQL - params := []interface{}{registrationUUID} + params := []any{registrationUUID} if err := checkQFilter(query, filterMap); err != nil { return nil, err } @@ -324,7 +324,7 @@ func (d *dao) ListVulnerabilities(ctx context.Context, registrationUUID string, return vulnRecs, err } -func applyVulFilter(ctx context.Context, sqlStr string, query *q.Query, params []interface{}) (queryStr string, newParam []interface{}) { +func applyVulFilter(ctx context.Context, sqlStr string, query *q.Query, params []any) (queryStr string, newParam []any) { if query == nil { return sqlStr, params } @@ -342,7 +342,7 @@ func applyVulFilter(ctx context.Context, sqlStr string, query *q.Query, params [ } // applyVulPagination apply pagination to the query and sort by cvss_score_v3 desc -func applyVulPagination(sqlStr string, query *q.Query, params []interface{}) (string, []interface{}) { +func applyVulPagination(sqlStr string, query *q.Query, params []any) (string, []any) { offSet := int64(0) pageSize := int64(15) if query != nil && query.PageNumber > 1 { diff --git a/src/pkg/securityhub/dao/security_test.go b/src/pkg/securityhub/dao/security_test.go index ae6025b3088..00b522c48b0 100644 --- a/src/pkg/securityhub/dao/security_test.go +++ b/src/pkg/securityhub/dao/security_test.go @@ -159,10 +159,10 @@ func (suite *SecurityDaoTestSuite) TestExactMatchFilter() { name string args args wantSQLStr string - wantParams []interface{} + wantParams []any }{ - {"normal", args{suite.Context(), "cve_id", q.New(q.KeyWords{"cve_id": "CVE-2023-2345"})}, " and cve_id = ?", []interface{}{"CVE-2023-2345"}}, - {"digest", args{suite.Context(), "digest", q.New(q.KeyWords{"digest": "digest123"})}, " and a.digest = ?", []interface{}{"digest123"}}, + {"normal", args{suite.Context(), "cve_id", q.New(q.KeyWords{"cve_id": "CVE-2023-2345"})}, " and cve_id = ?", []any{"CVE-2023-2345"}}, + {"digest", args{suite.Context(), "digest", q.New(q.KeyWords{"digest": "digest123"})}, " and a.digest = ?", []any{"digest123"}}, } for _, tt := range tests { suite.Run(tt.name, func() { @@ -183,9 +183,9 @@ func (suite *SecurityDaoTestSuite) TestRangeFilter() { name string args args wantSQLStr string - wantParams []interface{} + wantParams []any }{ - {"normal", args{suite.Context(), "cvss_score_v3", q.New(q.KeyWords{"cvss_score_v3": &q.Range{1.0, 2.0}})}, " and cvss_score_v3 between ? and ?", []interface{}{1.0, 2.0}}, + {"normal", args{suite.Context(), "cvss_score_v3", q.New(q.KeyWords{"cvss_score_v3": &q.Range{1.0, 2.0}})}, " and cvss_score_v3 between ? and ?", []any{1.0, 2.0}}, } for _, tt := range tests { suite.Run(tt.name, func() { @@ -224,7 +224,7 @@ func (suite *SecurityDaoTestSuite) TestTagFilter() { name string args args wantSqlStr string - wantParams []interface{} + wantParams []any }{ {"normal", args{suite.Context(), "tag", q.New(q.KeyWords{"tag": "tag_test"})}, " and a.id IN", nil}, } @@ -242,13 +242,13 @@ func (suite *SecurityDaoTestSuite) TestApplyVulFilter() { ctx context.Context sqlStr string query *q.Query - params []interface{} + params []any } tests := []struct { name string args args wantSqlStr string - wantParams []interface{} + wantParams []any }{ {"normal", args{suite.Context(), "select * from vulnerability_record", q.New(q.KeyWords{"tag": "tag_test"}), nil}, " and a.id IN", nil}, } diff --git a/src/pkg/systemartifact/cleanupcriteria.go b/src/pkg/systemartifact/cleanupcriteria.go index c148fa12d26..75a59b9cada 100644 --- a/src/pkg/systemartifact/cleanupcriteria.go +++ b/src/pkg/systemartifact/cleanupcriteria.go @@ -64,6 +64,6 @@ func (cleanupCriteria *defaultSelector) List(ctx context.Context) ([]*model.Syst duration := time.Duration(DefaultCleanupWindowSeconds) * time.Second timeRange := q.Range{Max: currentTime.Add(-duration).Format(time.RFC3339)} logger.Debugf("Cleaning up system artifacts with range: %v", timeRange) - query := q.New(map[string]interface{}{"create_time": &timeRange}) + query := q.New(map[string]any{"create_time": &timeRange}) return cleanupCriteria.dao.List(ctx, query) } diff --git a/src/pkg/systemartifact/cleanupcriteria_test.go b/src/pkg/systemartifact/cleanupcriteria_test.go index 23b22823542..d4807e5f52c 100644 --- a/src/pkg/systemartifact/cleanupcriteria_test.go +++ b/src/pkg/systemartifact/cleanupcriteria_test.go @@ -144,7 +144,7 @@ func (suite *defaultCleanupCriteriaTestSuite) TestListWithFilters() { actualSysArtifactIds := make(map[int64]bool) - query := q.Query{Keywords: map[string]interface{}{"vendor": "test_vendor37000", "repository": "test_repo37000"}} + query := q.Query{Keywords: map[string]any{"vendor": "test_vendor37000", "repository": "test_repo37000"}} sysArtifactList, err := suite.cleanupCriteria.ListWithFilters(suite.ctx, &query) for _, sysArtifact := range sysArtifactList { diff --git a/src/pkg/systemartifact/dao/dao_test.go b/src/pkg/systemartifact/dao/dao_test.go index b0b9ae2a13a..3023b39ec2d 100644 --- a/src/pkg/systemartifact/dao/dao_test.go +++ b/src/pkg/systemartifact/dao/dao_test.go @@ -267,7 +267,7 @@ func (suite *daoTestSuite) TestList() { // attempt to read all the system artifact records { query := q.Query{} - query.Keywords = map[string]interface{}{"repository": "test_repo4", "digest": "test_digest4"} + query.Keywords = map[string]any{"repository": "test_repo4", "digest": "test_digest4"} sysArtifacts, err := suite.dao.List(suite.ctx, &query) suite.NotNilf(sysArtifacts, "Expected system artifacts list to be non-nil") diff --git a/src/pkg/tag/dao/dao.go b/src/pkg/tag/dao/dao.go index 26103e21a48..0145de9cced 100644 --- a/src/pkg/tag/dao/dao.go +++ b/src/pkg/tag/dao/dao.go @@ -142,7 +142,7 @@ func (d *dao) Delete(ctx context.Context, id int64) error { func (d *dao) DeleteOfArtifact(ctx context.Context, artifactID int64) error { qs, err := orm.QuerySetter(ctx, &tag.Tag{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) diff --git a/src/pkg/tag/dao/dao_test.go b/src/pkg/tag/dao/dao_test.go index 7b5a20dcd82..c8bf4b9ea55 100644 --- a/src/pkg/tag/dao/dao_test.go +++ b/src/pkg/tag/dao/dao_test.go @@ -86,7 +86,7 @@ func (d *daoTestSuite) TestCount() { d.True(total > 0) // query by repository ID and name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "repository_id": 1000, "name": "latest", }, @@ -110,7 +110,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and name tags, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "repository_id": 1000, "name": "latest", }, @@ -251,7 +251,7 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Nil(err) tags, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) @@ -262,7 +262,7 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Nil(err) tags, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) diff --git a/src/pkg/task/dao/execution.go b/src/pkg/task/dao/execution.go index 54128742d18..819c5a091e4 100644 --- a/src/pkg/task/dao/execution.go +++ b/src/pkg/task/dao/execution.go @@ -346,7 +346,7 @@ func (e *executionDAO) refreshStatus(ctx context.Context, id int64) (bool, strin type jsonbStru struct { keyPrefix string key string - value interface{} + value any } func (e *executionDAO) querySetter(ctx context.Context, query *q.Query, options ...orm.Option) (orm.QuerySeter, error) { @@ -359,7 +359,7 @@ func (e *executionDAO) querySetter(ctx context.Context, query *q.Query, options if query != nil && len(query.Keywords) > 0 { var ( jsonbStrus []jsonbStru - args []interface{} + args []any ) for key, value := range query.Keywords { @@ -407,13 +407,13 @@ func (e *executionDAO) querySetter(ctx context.Context, query *q.Query, options // key = extra_attrs.a.b.c // // ==> sql = "select id from execution where extra_attrs->?->?->>?=?", args = {a, b, c, value} -func buildInClauseSQLForExtraAttrs(jsonbStrus []jsonbStru) (string, []interface{}) { +func buildInClauseSQLForExtraAttrs(jsonbStrus []jsonbStru) (string, []any) { if len(jsonbStrus) == 0 { return "", nil } var cond string - var args []interface{} + var args []any sql := "select id from execution where" for i, jsonbStr := range jsonbStrus { diff --git a/src/pkg/task/dao/execution_test.go b/src/pkg/task/dao/execution_test.go index edf711d8460..14ef22efb1d 100644 --- a/src/pkg/task/dao/execution_test.go +++ b/src/pkg/task/dao/execution_test.go @@ -66,7 +66,7 @@ func (e *executionDAOTestSuite) TearDownTest() { func (e *executionDAOTestSuite) TestCount() { count, err := e.executionDAO.Count(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "value", }, @@ -75,7 +75,7 @@ func (e *executionDAOTestSuite) TestCount() { e.Equal(int64(1), count) count, err = e.executionDAO.Count(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "incorrect-value", }, @@ -86,7 +86,7 @@ func (e *executionDAOTestSuite) TestCount() { func (e *executionDAOTestSuite) TestList() { executions, err := e.executionDAO.List(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "value", }, @@ -96,7 +96,7 @@ func (e *executionDAOTestSuite) TestList() { e.Equal(e.executionID, executions[0].ID) executions, err = e.executionDAO.List(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "incorrect-value", }, diff --git a/src/pkg/task/dao/task.go b/src/pkg/task/dao/task.go index 6bead6283ba..6dad77962ea 100644 --- a/src/pkg/task/dao/task.go +++ b/src/pkg/task/dao/task.go @@ -261,7 +261,7 @@ func (t *taskDAO) querySetter(ctx context.Context, query *q.Query, options ...or var ( key string keyPrefix string - value interface{} + value any ) for key, value = range query.Keywords { if strings.HasPrefix(key, "ExtraAttrs.") { diff --git a/src/pkg/task/dao/task_test.go b/src/pkg/task/dao/task_test.go index 58a41e5519a..f2ac2a67a38 100644 --- a/src/pkg/task/dao/task_test.go +++ b/src/pkg/task/dao/task_test.go @@ -73,7 +73,7 @@ func (t *taskDAOTestSuite) TearDownTest() { func (t *taskDAOTestSuite) TestCount() { count, err := t.taskDAO.Count(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "value", }, @@ -82,7 +82,7 @@ func (t *taskDAOTestSuite) TestCount() { t.Equal(int64(1), count) count, err = t.taskDAO.Count(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "incorrect-value", }, @@ -93,7 +93,7 @@ func (t *taskDAOTestSuite) TestCount() { func (t *taskDAOTestSuite) TestList() { tasks, err := t.taskDAO.List(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "value", }, @@ -103,7 +103,7 @@ func (t *taskDAOTestSuite) TestList() { t.Equal(t.taskID, tasks[0].ID) tasks, err = t.taskDAO.List(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "incorrect-value", }, diff --git a/src/pkg/task/execution.go b/src/pkg/task/execution.go index 31c993e36e2..0dab797b2c9 100644 --- a/src/pkg/task/execution.go +++ b/src/pkg/task/execution.go @@ -41,9 +41,9 @@ type ExecutionManager interface { // and the "vendorID" specifies the ID of vendor if needed(e.g. policy ID for replication and retention). // The "extraAttrs" can be used to set the customized attributes Create(ctx context.Context, vendorType string, vendorID int64, trigger string, - extraAttrs ...map[string]interface{}) (id int64, err error) + extraAttrs ...map[string]any) (id int64, err error) // Update the extra attributes of the specified execution - UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) (err error) + UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) (err error) // MarkDone marks the status of the specified execution as success. // It must be called to update the execution status if the created execution contains no tasks. // In other cases, the execution status can be calculated from the referenced tasks automatically @@ -96,8 +96,8 @@ func (e *executionManager) Count(ctx context.Context, query *q.Query) (int64, er } func (e *executionManager) Create(ctx context.Context, vendorType string, vendorID int64, trigger string, - extraAttrs ...map[string]interface{}) (int64, error) { - extras := map[string]interface{}{} + extraAttrs ...map[string]any) (int64, error) { + extras := map[string]any{} if len(extraAttrs) > 0 && extraAttrs[0] != nil { extras = extraAttrs[0] } @@ -124,7 +124,7 @@ func (e *executionManager) Create(ctx context.Context, vendorType string, vendor return id, nil } -func (e *executionManager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) error { +func (e *executionManager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) error { data, err := json.Marshal(extraAttrs) if err != nil { return err @@ -170,7 +170,7 @@ func (e *executionManager) Stop(ctx context.Context, id int64) error { // when an execution is in final status, if it contains task that is a periodic or retrying job it will // run again in the near future, so we must operate the stop action no matter the status is final or not tasks, err := e.taskDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": id, }, }) @@ -264,7 +264,7 @@ func (e *executionManager) StopAndWaitWithError(ctx context.Context, id int64, t func (e *executionManager) Delete(ctx context.Context, id int64) error { tasks, err := e.taskDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": id, }, }) @@ -294,7 +294,7 @@ func (e *executionManager) Delete(ctx context.Context, id int64) error { func (e *executionManager) DeleteByVendor(ctx context.Context, vendorType string, vendorID int64) error { executions, err := e.executionDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": vendorType, "VendorID": vendorID, }}) @@ -355,7 +355,7 @@ func (e *executionManager) populateExecution(ctx context.Context, execution *dao } if len(execution.ExtraAttrs) > 0 { - extras := map[string]interface{}{} + extras := map[string]any{} if err := json.Unmarshal([]byte(execution.ExtraAttrs), &extras); err != nil { log.Errorf("failed to unmarshal the extra attributes of execution %d: %v", execution.ID, err) } else { diff --git a/src/pkg/task/execution_test.go b/src/pkg/task/execution_test.go index 8ceaee9010c..e24e1d3b305 100644 --- a/src/pkg/task/execution_test.go +++ b/src/pkg/task/execution_test.go @@ -60,7 +60,7 @@ func (e *executionManagerTestSuite) TestCount() { func (e *executionManagerTestSuite) TestCreate() { e.execDAO.On("Create", mock.Anything, mock.Anything).Return(int64(1), nil) id, err := e.execMgr.Create(nil, "vendor", 0, ExecutionTriggerManual, - map[string]interface{}{"k": "v"}) + map[string]any{"k": "v"}) e.Require().Nil(err) e.Equal(int64(1), id) // sleep to make sure the function in the goroutine run @@ -70,7 +70,7 @@ func (e *executionManagerTestSuite) TestCreate() { func (e *executionManagerTestSuite) TestUpdateExtraAttrs() { e.execDAO.On("Update", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err := e.execMgr.UpdateExtraAttrs(nil, 1, map[string]interface{}{"key": "value"}) + err := e.execMgr.UpdateExtraAttrs(nil, 1, map[string]any{"key": "value"}) e.Require().Nil(err) e.execDAO.AssertExpectations(e.T()) } diff --git a/src/pkg/task/hook.go b/src/pkg/task/hook.go index 46ca8e91517..f71de6f6913 100644 --- a/src/pkg/task/hook.go +++ b/src/pkg/task/hook.go @@ -69,7 +69,7 @@ func (h *HookHandler) Handle(ctx context.Context, sc *job.StatusChange) error { jobID = sc.Metadata.UpstreamJobID } tasks, err := h.taskDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "JobID": jobID, }, }) diff --git a/src/pkg/task/model.go b/src/pkg/task/model.go index fcaf8c74d06..894cc29343a 100644 --- a/src/pkg/task/model.go +++ b/src/pkg/task/model.go @@ -47,10 +47,10 @@ type Execution struct { // trigger type: manual/schedule/event Trigger string `json:"trigger"` // the customized attributes for different kinds of consumers - ExtraAttrs map[string]interface{} `json:"extra_attrs"` - StartTime time.Time `json:"start_time"` - UpdateTime time.Time `json:"update_time"` - EndTime time.Time `json:"end_time"` + ExtraAttrs map[string]any `json:"extra_attrs"` + StartTime time.Time `json:"start_time"` + UpdateTime time.Time `json:"update_time"` + EndTime time.Time `json:"end_time"` } // IsOnGoing returns true when the execution is running @@ -78,7 +78,7 @@ type Task struct { // the ID of jobservice job JobID string `json:"job_id"` // the customized attributes for different kinds of consumers - ExtraAttrs map[string]interface{} `json:"extra_attrs"` + ExtraAttrs map[string]any `json:"extra_attrs"` // the time that the task record created CreationTime time.Time `json:"creation_time"` // the time that the underlying job starts @@ -103,7 +103,7 @@ func (t *Task) From(task *dao.Task) { t.EndTime = task.EndTime t.StatusRevision = task.StatusRevision if len(task.ExtraAttrs) > 0 { - extras := map[string]interface{}{} + extras := map[string]any{} if err := json.Unmarshal([]byte(task.ExtraAttrs), &extras); err != nil { log.Errorf("failed to unmarshal the extra attributes of task %d: %v", task.ID, err) return diff --git a/src/pkg/task/sweep_job_test.go b/src/pkg/task/sweep_job_test.go index 47fd5f97b6d..3871805b670 100644 --- a/src/pkg/task/sweep_job_test.go +++ b/src/pkg/task/sweep_job_test.go @@ -40,7 +40,7 @@ func TestSweepJob(t *testing.T) { } func (suite *sweepJobTestSuite) TestRun() { - params := map[string]interface{}{ + params := map[string]any{ "execution_retain_counts": map[string]int{ "WEBHOOK": 10, "REPLICATION": 20, diff --git a/src/pkg/task/sweep_manager.go b/src/pkg/task/sweep_manager.go index e82131fbc6f..02ffd7fdced 100644 --- a/src/pkg/task/sweep_manager.go +++ b/src/pkg/task/sweep_manager.go @@ -68,7 +68,7 @@ func (sm *sweepManager) listVendorIDs(ctx context.Context, vendorType string) ([ // getCandidateMaxStartTime returns the max start time for candidate executions, obtain the start time of the xth recent one. func (sm *sweepManager) getCandidateMaxStartTime(ctx context.Context, vendorType string, vendorID, retainCnt int64) (*time.Time, error) { query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": vendorType, "VendorID": vendorID, }, @@ -121,7 +121,7 @@ func (sm *sweepManager) ListCandidates(ctx context.Context, vendorType string, r // count the records for pagination sql := `SELECT COUNT(1) FROM execution WHERE vendor_type = ? AND vendor_id = ? AND start_time < ? AND status IN (?,?,?)` totalOfCandidate := 0 - params := []interface{}{ + params := []any{ vendorType, vendorID, maxStartTime.Format(timeFormat), @@ -145,7 +145,7 @@ func (sm *sweepManager) ListCandidates(ctx context.Context, vendorType string, r for i := n; i >= 1; i-- { q2.PageNumber = int64(i) // should copy params as pagination will append the slice - paginationParams := make([]interface{}, len(params)) + paginationParams := make([]any, len(params)) copy(paginationParams, params) paginationSQL, paginationParams := orm.PaginationOnRawSQL(q2, sql, paginationParams) ids := make([]int64, 0, defaultPageSize) @@ -165,7 +165,7 @@ func (sm *sweepManager) Clean(ctx context.Context, execIDs []int64) error { return err } // construct sql params - params := make([]interface{}, 0, len(execIDs)) + params := make([]any, 0, len(execIDs)) for _, eid := range execIDs { params = append(params, eid) } diff --git a/src/pkg/task/task.go b/src/pkg/task/task.go index fa82c14ed05..5ef8422a824 100644 --- a/src/pkg/task/task.go +++ b/src/pkg/task/task.go @@ -41,7 +41,7 @@ type Manager interface { // Create submits the job to jobservice and creates a corresponding task record. // An execution must be created first and the task will be linked to it. // The "extraAttrs" can be used to set the customized attributes - Create(ctx context.Context, executionID int64, job *Job, extraAttrs ...map[string]interface{}) (id int64, err error) + Create(ctx context.Context, executionID int64, job *Job, extraAttrs ...map[string]any) (id int64, err error) // Stop the specified task Stop(ctx context.Context, id int64) (err error) // Get the specified task @@ -50,7 +50,7 @@ type Manager interface { // Query the "ExtraAttrs" by setting 'query.Keywords["ExtraAttrs.key"]="value"' List(ctx context.Context, query *q.Query) (tasks []*Task, err error) // Update the extra attributes of the specified task - UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) (err error) + UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) (err error) // Get the log of the specified task GetLog(ctx context.Context, id int64) (log []byte, err error) // GetLogByJobID get the log of specified job id @@ -101,7 +101,7 @@ func (m *manager) Count(ctx context.Context, query *q.Query) (int64, error) { return m.dao.Count(ctx, query) } -func (m *manager) Create(ctx context.Context, executionID int64, jb *Job, extraAttrs ...map[string]interface{}) (int64, error) { +func (m *manager) Create(ctx context.Context, executionID int64, jb *Job, extraAttrs ...map[string]any) (int64, error) { // create task record in database id, err := m.createTaskRecord(ctx, executionID, extraAttrs...) if err != nil { @@ -137,12 +137,12 @@ func (m *manager) Create(ctx context.Context, executionID int64, jb *Job, extraA return id, nil } -func (m *manager) createTaskRecord(ctx context.Context, executionID int64, extraAttrs ...map[string]interface{}) (int64, error) { +func (m *manager) createTaskRecord(ctx context.Context, executionID int64, extraAttrs ...map[string]any) (int64, error) { exec, err := m.execDAO.Get(ctx, executionID) if err != nil { return 0, err } - extras := map[string]interface{}{} + extras := map[string]any{} if len(extraAttrs) > 0 && extraAttrs[0] != nil { extras = extraAttrs[0] } @@ -255,7 +255,7 @@ func (m *manager) ListScanTasksByReportUUID(ctx context.Context, uuid string) ([ return ts, nil } -func (m *manager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) error { +func (m *manager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) error { data, err := json.Marshal(extraAttrs) if err != nil { return err diff --git a/src/pkg/task/task_test.go b/src/pkg/task/task_test.go index 6cf243364f9..f259992b609 100644 --- a/src/pkg/task/task_test.go +++ b/src/pkg/task/task_test.go @@ -61,7 +61,7 @@ func (t *taskManagerTestSuite) TestCreate() { t.jsClient.On("SubmitJob", mock.Anything).Return("1", nil) t.dao.On("Update", mock.Anything, mock.Anything, mock.Anything).Return(nil) - id, err := t.mgr.Create(nil, 1, &Job{}, map[string]interface{}{"a": "b"}) + id, err := t.mgr.Create(nil, 1, &Job{}, map[string]any{"a": "b"}) t.Require().Nil(err) t.Equal(int64(1), id) t.dao.AssertExpectations(t.T()) @@ -77,7 +77,7 @@ func (t *taskManagerTestSuite) TestCreate() { t.jsClient.On("SubmitJob", mock.Anything).Return("", errors.New("error")) t.dao.On("Delete", mock.Anything, mock.Anything).Return(nil) - id, err = t.mgr.Create(nil, 1, &Job{}, map[string]interface{}{"a": "b"}) + id, err = t.mgr.Create(nil, 1, &Job{}, map[string]any{"a": "b"}) t.Require().NotNil(err) t.dao.AssertExpectations(t.T()) t.execDAO.AssertExpectations(t.T()) @@ -129,7 +129,7 @@ func (t *taskManagerTestSuite) TestGet() { func (t *taskManagerTestSuite) TestUpdateExtraAttrs() { t.dao.On("Update", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err := t.mgr.UpdateExtraAttrs(nil, 1, map[string]interface{}{}) + err := t.mgr.UpdateExtraAttrs(nil, 1, map[string]any{}) t.Require().Nil(err) t.dao.AssertExpectations(t.T()) } diff --git a/src/pkg/token/options.go b/src/pkg/token/options.go index 1e1cb28723d..6e771e7589e 100644 --- a/src/pkg/token/options.go +++ b/src/pkg/token/options.go @@ -39,7 +39,7 @@ type Options struct { } // GetKey ... -func (o *Options) GetKey() (interface{}, error) { +func (o *Options) GetKey() (any, error) { var err error var privateKey *rsa.PrivateKey var publicKey *rsa.PublicKey diff --git a/src/pkg/token/token.go b/src/pkg/token/token.go index d4e2fcbc5c1..03315e0dfca 100644 --- a/src/pkg/token/token.go +++ b/src/pkg/token/token.go @@ -66,7 +66,7 @@ func Parse(opt *Options, rawToken string, claims jwt.Claims) (*Token, error) { return nil, err } var parser = jwt.NewParser(jwt.WithLeeway(common.JwtLeeway), jwt.WithValidMethods([]string{opt.SignMethod.Alg()})) - token, err := parser.ParseWithClaims(rawToken, claims, func(_ *jwt.Token) (interface{}, error) { + token, err := parser.ParseWithClaims(rawToken, claims, func(_ *jwt.Token) (any, error) { switch k := key.(type) { case *rsa.PrivateKey: return &k.PublicKey, nil diff --git a/src/pkg/user/dao/user.go b/src/pkg/user/dao/user.go index 1e4fb6952ee..d4ba5f3417f 100644 --- a/src/pkg/user/dao/user.go +++ b/src/pkg/user/dao/user.go @@ -94,7 +94,7 @@ func toCommonUser(u *User) *commonmodels.User { } // FilterByUsernameOrEmail generates the query setter to match username or email column to the same value -func (u *User) FilterByUsernameOrEmail(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (u *User) FilterByUsernameOrEmail(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { usernameOrEmail, ok := value.(string) if !ok { return qs diff --git a/src/registryctl/api/base.go b/src/registryctl/api/base.go index d40711e1387..fa4aaefba5b 100644 --- a/src/registryctl/api/base.go +++ b/src/registryctl/api/base.go @@ -48,7 +48,7 @@ func HandleError(w http.ResponseWriter, err error) { } // WriteJSON response status code will be written automatically if there is an error -func WriteJSON(w http.ResponseWriter, v interface{}) error { +func WriteJSON(w http.ResponseWriter, v any) error { b, err := json.Marshal(v) if err != nil { HandleInternalServerError(w, err) diff --git a/src/server/middleware/cosign/cosign_test.go b/src/server/middleware/cosign/cosign_test.go index d50109e00b8..a37f8d7b328 100644 --- a/src/server/middleware/cosign/cosign_test.go +++ b/src/server/middleware/cosign/cosign_test.go @@ -143,7 +143,7 @@ func (suite *MiddlewareTestSuite) TestCosignSignature() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": subArtDigest, }, }) @@ -173,7 +173,7 @@ func (suite *MiddlewareTestSuite) TestCosignSignatureDup() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": accID, }, }) diff --git a/src/server/middleware/csrf/csrf_test.go b/src/server/middleware/csrf/csrf_test.go index 1b9e75512a0..acc1649d8ad 100644 --- a/src/server/middleware/csrf/csrf_test.go +++ b/src/server/middleware/csrf/csrf_test.go @@ -21,7 +21,7 @@ func resetMiddleware() { func TestMain(m *testing.M) { test.InitDatabaseFromEnv() - conf := map[string]interface{}{} + conf := map[string]any{} config.InitWithSettings(conf) result := m.Run() if result != 0 { @@ -94,12 +94,12 @@ func TestMiddlewareInvalidKey(t *testing.T) { func TestSecureCookie(t *testing.T) { assert.True(t, secureCookie()) - conf := map[string]interface{}{ + conf := map[string]any{ common.ExtEndpoint: "http://harbor.test", } config.InitWithSettings(conf) assert.False(t, secureCookie()) - conf = map[string]interface{}{} + conf = map[string]any{} config.InitWithSettings(conf) } diff --git a/src/server/middleware/log/log_test.go b/src/server/middleware/log/log_test.go index e40440ff912..83d3901a8b9 100644 --- a/src/server/middleware/log/log_test.go +++ b/src/server/middleware/log/log_test.go @@ -48,7 +48,7 @@ func (s *MiddlewareTestSuite) TestTableMiddleware() { type args struct { headers map[string]string - fields map[string]interface{} + fields map[string]any ctxTraceparent string } tests := []struct { diff --git a/src/server/middleware/security/auth_proxy_test.go b/src/server/middleware/security/auth_proxy_test.go index b4a65924432..22b93caf9af 100644 --- a/src/server/middleware/security/auth_proxy_test.go +++ b/src/server/middleware/security/auth_proxy_test.go @@ -45,7 +45,7 @@ func TestAuthProxy(t *testing.T) { require.Nil(t, err) defer server.Close() - c := map[string]interface{}{ + c := map[string]any{ common.HTTPAuthProxySkipSearch: "true", common.HTTPAuthProxyVerifyCert: "false", common.HTTPAuthProxyEndpoint: "https://auth.proxy/suffix", diff --git a/src/server/middleware/security/robot_test.go b/src/server/middleware/security/robot_test.go index 3976f3b2fda..890b609fbe1 100644 --- a/src/server/middleware/security/robot_test.go +++ b/src/server/middleware/security/robot_test.go @@ -26,7 +26,7 @@ import ( ) func TestRobot(t *testing.T) { - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotNamePrefix: "robot@", } config.InitWithSettings(conf) diff --git a/src/server/middleware/subject/subject_test.go b/src/server/middleware/subject/subject_test.go index 323b0c78bb7..a0c02114db7 100644 --- a/src/server/middleware/subject/subject_test.go +++ b/src/server/middleware/subject/subject_test.go @@ -177,7 +177,7 @@ func (suite *MiddlewareTestSuite) TestSubject() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": subArtDigest, }, }) @@ -213,7 +213,7 @@ func (suite *MiddlewareTestSuite) TestSubjectAfterAcc() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": subArtDigest, "SubjectArtifactRepo": name, }, @@ -242,7 +242,7 @@ func (suite *MiddlewareTestSuite) TestSubjectDup() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": accID, }, }) diff --git a/src/server/middleware/transaction/transaction_test.go b/src/server/middleware/transaction/transaction_test.go index 994947a6c61..0d3aae88262 100644 --- a/src/server/middleware/transaction/transaction_test.go +++ b/src/server/middleware/transaction/transaction_test.go @@ -47,10 +47,10 @@ func (m *mockOrmer) Reset() { type mockTxOrmer struct { o.TxOrmer commitErr error - records []interface{} + records []any } -func (m *mockTxOrmer) Insert(i interface{}) (int64, error) { +func (m *mockTxOrmer) Insert(i any) (int64, error) { m.records = append(m.records, i) return int64(len(m.records)), nil } diff --git a/src/server/middleware/v2auth/auth_test.go b/src/server/middleware/v2auth/auth_test.go index 6851cecfee2..c635ef76654 100644 --- a/src/server/middleware/v2auth/auth_test.go +++ b/src/server/middleware/v2auth/auth_test.go @@ -46,7 +46,7 @@ func TestMain(m *testing.M) { ctl := &projecttesting.Controller{} mockGet := func(ctx context.Context, - projectIDOrName interface{}, options ...project.Option) (*proModels.Project, error) { + projectIDOrName any, options ...project.Option) (*proModels.Project, error) { name := projectIDOrName.(string) id, _ := strconv.Atoi(strings.TrimPrefix(name, "project_")) if id == 0 { @@ -59,12 +59,12 @@ func TestMain(m *testing.M) { } mock.OnAnything(ctl, "Get").Return( func(ctx context.Context, - projectIDOrName interface{}, options ...project.Option) *proModels.Project { + projectIDOrName any, options ...project.Option) *proModels.Project { p, _ := mockGet(ctx, projectIDOrName, options...) return p }, func(ctx context.Context, - projectIDOrName interface{}, options ...project.Option) error { + projectIDOrName any, options ...project.Option) error { _, err := mockGet(ctx, projectIDOrName, options...) return err }, @@ -73,7 +73,7 @@ func TestMain(m *testing.M) { checker = reqChecker{ ctl: ctl, } - conf := map[string]interface{}{ + conf := map[string]any{ common.ExtEndpoint: "https://harbor.test", common.CoreURL: "https://harbor.core:8443", } diff --git a/src/server/registry/referrers.go b/src/server/registry/referrers.go index 00504dfd4ca..b7259a5f5da 100644 --- a/src/server/registry/referrers.go +++ b/src/server/registry/referrers.go @@ -180,7 +180,7 @@ type listReferrersOK struct { /* In: Body */ - Payload interface{} `json:"body,omitempty"` + Payload any `json:"body,omitempty"` } // newListReferrersOK creates newlistReferrersOK with default headers values @@ -207,7 +207,7 @@ func (o *listReferrersOK) WithXTotalCount(xTotalCount int64) *listReferrersOK { } // WithPayload adds the payload to the list accessories o k response -func (o *listReferrersOK) WithPayload(payload interface{}) *listReferrersOK { +func (o *listReferrersOK) WithPayload(payload any) *listReferrersOK { o.Payload = payload return o } diff --git a/src/server/registry/tag.go b/src/server/registry/tag.go index 3f0ddb66569..43d2abe37b3 100644 --- a/src/server/registry/tag.go +++ b/src/server/registry/tag.go @@ -69,7 +69,7 @@ func (t *tagHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { } tags, err := t.tagCtl.List(req.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": repository.RepositoryID, }}, nil) if err != nil { diff --git a/src/server/v2.0/handler/artifact.go b/src/server/v2.0/handler/artifact.go index e54e8f1179e..e05006be686 100644 --- a/src/server/v2.0/handler/artifact.go +++ b/src/server/v2.0/handler/artifact.go @@ -73,7 +73,7 @@ type artifactAPI struct { labelMgr label.Manager } -func (a *artifactAPI) Prepare(ctx context.Context, _ string, params interface{}) middleware.Responder { +func (a *artifactAPI) Prepare(ctx context.Context, _ string, params any) middleware.Responder { if err := unescapePathParams(params, "RepositoryName"); err != nil { a.SendError(ctx, err) } @@ -406,7 +406,7 @@ func (a *artifactAPI) GetVulnerabilitiesAddition(ctx context.Context, params ope return a.SendError(ctx, err) } - vulnerabilities := make(map[string]interface{}) + vulnerabilities := make(map[string]any) for _, mimeType := range parseScanReportMimeTypes(params.XAcceptVulnerabilities) { reports, err := a.scanCtl.GetReport(ctx, artifact, []string{mimeType}) diff --git a/src/server/v2.0/handler/artifact_test.go b/src/server/v2.0/handler/artifact_test.go index 68908cda333..9675d084ffa 100644 --- a/src/server/v2.0/handler/artifact_test.go +++ b/src/server/v2.0/handler/artifact_test.go @@ -116,7 +116,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // report not found for the default X-Accept-Vulnerabilities suite.onGetReport(v1.MimeTypeNativeReport) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -127,7 +127,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // report found for the default X-Accept-Vulnerabilities suite.onGetReport(v1.MimeTypeNativeReport, suite.report1) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -139,7 +139,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // report found for the X-Accept-Vulnerabilities of "application/vnd.security.vulnerability.report; version=1.1" suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport, suite.report2) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -152,7 +152,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // and the X-Accept-Vulnerabilities is "application/vnd.security.vulnerability.report; version=1.1, application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0" suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport, suite.report2) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport + "," + v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -167,7 +167,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport) suite.onGetReport(v1.MimeTypeNativeReport, suite.report1) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport + "," + v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -182,7 +182,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport) suite.onGetReport(v1.MimeTypeNativeReport) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport + "," + v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) diff --git a/src/server/v2.0/handler/assembler/report.go b/src/server/v2.0/handler/assembler/report.go index d5bc801c753..d503f28180b 100644 --- a/src/server/v2.0/handler/assembler/report.go +++ b/src/server/v2.0/handler/assembler/report.go @@ -118,7 +118,7 @@ func (assembler *ScanReportAssembler) Assemble(ctx context.Context) error { if len(execs) == 0 { continue } - artifact.SBOMOverView = map[string]interface{}{ + artifact.SBOMOverView = map[string]any{ sbomModel.ScanStatus: execs[0].Status, sbomModel.StartTime: execs[0].StartTime, sbomModel.EndTime: execs[0].EndTime, @@ -127,7 +127,7 @@ func (assembler *ScanReportAssembler) Assemble(ctx context.Context) error { continue } - artifact.SBOMOverView = map[string]interface{}{ + artifact.SBOMOverView = map[string]any{ sbomModel.StartTime: overview[sbomModel.StartTime], sbomModel.EndTime: overview[sbomModel.EndTime], sbomModel.ScanStatus: overview[sbomModel.ScanStatus], diff --git a/src/server/v2.0/handler/assembler/report_test.go b/src/server/v2.0/handler/assembler/report_test.go index b0dd8f9f037..6c509205ff3 100644 --- a/src/server/v2.0/handler/assembler/report_test.go +++ b/src/server/v2.0/handler/assembler/report_test.go @@ -45,7 +45,7 @@ func (suite *VulAssemblerTestSuite) TestScannable() { mock.OnAnything(checker, "IsScannable").Return(true, nil) - summary := map[string]interface{}{"key": "value"} + summary := map[string]any{"key": "value"} mock.OnAnything(scanCtl, "GetSummary").Return(summary, nil) var artifact model.Artifact @@ -67,7 +67,7 @@ func (suite *VulAssemblerTestSuite) TestNotScannable() { mock.OnAnything(checker, "IsScannable").Return(false, nil) - summary := map[string]interface{}{"key": "value"} + summary := map[string]any{"key": "value"} mock.OnAnything(scanCtl, "GetSummary").Return(summary, nil) var art model.Artifact @@ -89,7 +89,7 @@ func (suite *VulAssemblerTestSuite) TestAssembleSBOMOverview() { } mock.OnAnything(checker, "IsScannable").Return(true, nil) - overview := map[string]interface{}{ + overview := map[string]any{ "sbom_digest": "sha256:123456", "scan_status": "Success", } @@ -117,7 +117,7 @@ func (suite *VulAssemblerTestSuite) TestAssembleSBOMOverviewImageIndex() { } mock.OnAnything(checker, "IsScannable").Return(true, nil) - overview := map[string]interface{}{} + overview := map[string]any{} mock.OnAnything(scanCtl, "GetSummary").Return(overview, nil) execs := []*task.Execution{ {ID: 1, Status: "Error"}, diff --git a/src/server/v2.0/handler/base.go b/src/server/v2.0/handler/base.go index ed166392b5a..d7531733774 100644 --- a/src/server/v2.0/handler/base.go +++ b/src/server/v2.0/handler/base.go @@ -46,7 +46,7 @@ var ( type BaseAPI struct{} // Prepare default prepare for operation -func (*BaseAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (*BaseAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -75,7 +75,7 @@ func (b *BaseAPI) HasPermission(ctx context.Context, action rbac.Action, resourc } // HasProjectPermission returns true when the request has action permission on project subresource -func (b *BaseAPI) HasProjectPermission(ctx context.Context, projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) bool { +func (b *BaseAPI) HasProjectPermission(ctx context.Context, projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) bool { projectID, projectName, err := utils.ParseProjectIDOrName(projectIDOrName) if err != nil { return false @@ -105,7 +105,7 @@ func (b *BaseAPI) HasProjectPermission(ctx context.Context, projectIDOrName inte // RequireProjectAccess checks the permission against the resources according to the context // An error will be returned if it doesn't meet the requirement -func (b *BaseAPI) RequireProjectAccess(ctx context.Context, projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) error { +func (b *BaseAPI) RequireProjectAccess(ctx context.Context, projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) error { if b.HasProjectPermission(ctx, projectIDOrName, action, subresource...) { return nil } diff --git a/src/server/v2.0/handler/config.go b/src/server/v2.0/handler/config.go index b0e4e6958ab..5102212305a 100644 --- a/src/server/v2.0/handler/config.go +++ b/src/server/v2.0/handler/config.go @@ -91,8 +91,8 @@ func (c *configAPI) UpdateConfigurations(ctx context.Context, params configure.U return configure.NewUpdateConfigurationsOK() } -func toCfgMap(conf *models.Configurations) (map[string]interface{}, error) { - var cfgMap map[string]interface{} +func toCfgMap(conf *models.Configurations) (map[string]any, error) { + var cfgMap map[string]any buf, err := json.Marshal(conf) if err != nil { return cfgMap, err diff --git a/src/server/v2.0/handler/gc.go b/src/server/v2.0/handler/gc.go index c8e57b0363a..03ca356dada 100644 --- a/src/server/v2.0/handler/gc.go +++ b/src/server/v2.0/handler/gc.go @@ -47,7 +47,7 @@ func newGCAPI() *gcAPI { } } -func (g *gcAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (g *gcAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -79,9 +79,9 @@ func (g *gcAPI) UpdateGCSchedule(ctx context.Context, params operation.UpdateGCS return operation.NewUpdateGCScheduleOK() } -func (g *gcAPI) kick(ctx context.Context, scheType string, cron string, parameters map[string]interface{}) (int64, error) { +func (g *gcAPI) kick(ctx context.Context, scheType string, cron string, parameters map[string]any) (int64, error) { if parameters == nil { - parameters = make(map[string]interface{}) + parameters = make(map[string]any) } // set the required parameters for GC parameters["redis_url_reg"] = os.Getenv("_REDIS_URL_REG") diff --git a/src/server/v2.0/handler/handler.go b/src/server/v2.0/handler/handler.go index 2f770c696bb..10a22bb6c52 100644 --- a/src/server/v2.0/handler/handler.go +++ b/src/server/v2.0/handler/handler.go @@ -86,7 +86,7 @@ func New() http.Handler { } // function is called before the Prepare of the operation -func beforePrepare(ctx context.Context, operation string, _ interface{}) rmiddleware.Responder { +func beforePrepare(ctx context.Context, operation string, _ any) rmiddleware.Responder { metric.SetMetricOpID(ctx, operation) return nil } diff --git a/src/server/v2.0/handler/immutable.go b/src/server/v2.0/handler/immutable.go index 9f312e78cd9..d071c8f4719 100644 --- a/src/server/v2.0/handler/immutable.go +++ b/src/server/v2.0/handler/immutable.go @@ -163,7 +163,7 @@ func (ia *immutableAPI) ListImmuRules(ctx context.Context, params operation.List WithPayload(results) } -func (ia *immutableAPI) getProjectID(ctx context.Context, projectNameOrID interface{}) (int64, error) { +func (ia *immutableAPI) getProjectID(ctx context.Context, projectNameOrID any) (int64, error) { projectName, ok := projectNameOrID.(string) if ok { p, err := ia.projectCtr.Get(ctx, projectName, project.Metadata(false)) diff --git a/src/server/v2.0/handler/model/artifact.go b/src/server/v2.0/handler/model/artifact.go index 78d4d11bafc..d2db618198e 100644 --- a/src/server/v2.0/handler/model/artifact.go +++ b/src/server/v2.0/handler/model/artifact.go @@ -29,8 +29,8 @@ import ( type Artifact struct { artifact.Artifact // TODO: rename to VulOverview - ScanOverview map[string]interface{} `json:"scan_overview"` - SBOMOverView map[string]interface{} `json:"sbom_overview"` + ScanOverview map[string]any `json:"scan_overview"` + SBOMOverView map[string]any `json:"sbom_overview"` } // ToSwagger converts the artifact to the swagger model diff --git a/src/server/v2.0/handler/model/quota.go b/src/server/v2.0/handler/model/quota.go index 6f9b6d7de76..94bcf53f79a 100644 --- a/src/server/v2.0/handler/model/quota.go +++ b/src/server/v2.0/handler/model/quota.go @@ -75,7 +75,7 @@ type QuotaRefObject struct { // ToSwagger converts the QuotaRefObject to the swagger model func (rl *QuotaRefObject) ToSwagger() models.QuotaRefObject { - result := make(map[string]interface{}, len(rl.QuotaRefObject)) + result := make(map[string]any, len(rl.QuotaRefObject)) for name, value := range rl.QuotaRefObject { result[string(name)] = value diff --git a/src/server/v2.0/handler/preheat.go b/src/server/v2.0/handler/preheat.go index d084e08ba63..1222d303c19 100644 --- a/src/server/v2.0/handler/preheat.go +++ b/src/server/v2.0/handler/preheat.go @@ -65,7 +65,7 @@ type preheatAPI struct { taskCtl taskCtl.Controller } -func (api *preheatAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (api *preheatAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -332,7 +332,7 @@ func (api *preheatAPI) DeletePolicy(ctx context.Context, params operation.Delete } return nil } - executions, err := api.executionCtl.List(ctx, &q.Query{Keywords: map[string]interface{}{ + executions, err := api.executionCtl.List(ctx, &q.Query{Keywords: map[string]any{ "vendor_type": job.P2PPreheatVendorType, "vendor_id": policy.ID, }}) @@ -786,7 +786,7 @@ func (api *preheatAPI) GetPreheatLog(ctx context.Context, params operation.GetPr return operation.NewGetPreheatLogOK().WithPayload(string(l)) } -func (api *preheatAPI) requireTaskInProject(ctx context.Context, projectNameOrID interface{}, policyName string, executionID, taskID int64) error { +func (api *preheatAPI) requireTaskInProject(ctx context.Context, projectNameOrID any, policyName string, executionID, taskID int64) error { projectID, err := getProjectID(ctx, projectNameOrID) notFoundErr := fmt.Errorf("project id %d, task id %d not found", projectID, taskID) if err != nil { @@ -809,7 +809,7 @@ func (api *preheatAPI) requireTaskInProject(ctx context.Context, projectNameOrID return errors.NotFoundError(notFoundErr) } -func (api *preheatAPI) requireExecutionInProject(ctx context.Context, projectNameOrID interface{}, policyName string, executionID int64) error { +func (api *preheatAPI) requireExecutionInProject(ctx context.Context, projectNameOrID any, policyName string, executionID int64) error { projectID, err := getProjectID(ctx, projectNameOrID) notFoundErr := fmt.Errorf("project id %d, execution id %d not found", projectID, executionID) if err != nil { diff --git a/src/server/v2.0/handler/project.go b/src/server/v2.0/handler/project.go index 5faf77ce322..683a4827bed 100644 --- a/src/server/v2.0/handler/project.go +++ b/src/server/v2.0/handler/project.go @@ -187,7 +187,7 @@ func (a *projectAPI) CreateProject(ctx context.Context, params operation.CreateP // in most case, it's 1 if _, ok := secCtx.(*robotSec.SecurityContext); ok || secCtx.IsSolutionUser() { q := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "sysadmin_flag": true, }, Sorts: []*q.Sort{ @@ -753,7 +753,7 @@ func (a *projectAPI) ListArtifactsOfProject(ctx context.Context, params operatio WithPayload(artifacts) } -func (a *projectAPI) deletable(ctx context.Context, projectNameOrID interface{}) (*project.Project, *models.ProjectDeletable, error) { +func (a *projectAPI) deletable(ctx context.Context, projectNameOrID any) (*project.Project, *models.ProjectDeletable, error) { p, err := a.getProject(ctx, projectNameOrID) if err != nil { return nil, nil, err @@ -768,7 +768,7 @@ func (a *projectAPI) deletable(ctx context.Context, projectNameOrID interface{}) return p, result, nil } -func (a *projectAPI) getProject(ctx context.Context, projectNameOrID interface{}, options ...project.Option) (*project.Project, error) { +func (a *projectAPI) getProject(ctx context.Context, projectNameOrID any, options ...project.Option) (*project.Project, error) { p, err := a.projectCtl.Get(ctx, projectNameOrID, options...) if err != nil { return nil, err diff --git a/src/server/v2.0/handler/project_test.go b/src/server/v2.0/handler/project_test.go index eca7f09a3a2..275d404bdec 100644 --- a/src/server/v2.0/handler/project_test.go +++ b/src/server/v2.0/handler/project_test.go @@ -151,7 +151,7 @@ func (suite *ProjectTestSuite) TestListScannerCandidatesOfProject() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(0), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return(nil, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/projects/1/scanner/candidates", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -163,7 +163,7 @@ func (suite *ProjectTestSuite) TestListScannerCandidatesOfProject() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(3), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return([]*scanner.Registration{suite.reg}, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/projects/1/scanner/candidates?page_size=1&page=2&name=n&description=d&url=u&ex_name=n&ex_url=u", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -183,7 +183,7 @@ func (suite *ProjectTestSuite) TestSetScannerOfProject() { // get project failed mock.OnAnything(suite.projectCtl, "Get").Return(nil, fmt.Errorf("failed to get project")).Once() - res, err := suite.PutJSON("/projects/1/scanner", map[string]interface{}{"uuid": "uuid"}) + res, err := suite.PutJSON("/projects/1/scanner", map[string]any{"uuid": "uuid"}) suite.NoError(err) suite.Equal(500, res.StatusCode) } @@ -192,7 +192,7 @@ func (suite *ProjectTestSuite) TestSetScannerOfProject() { mock.OnAnything(suite.projectCtl, "Get").Return(suite.project, nil).Once() mock.OnAnything(suite.scannerCtl, "SetRegistrationByProject").Return(nil).Once() - res, err := suite.PutJSON("/projects/1/scanner", map[string]interface{}{"uuid": "uuid"}) + res, err := suite.PutJSON("/projects/1/scanner", map[string]any{"uuid": "uuid"}) suite.NoError(err) suite.Equal(200, res.StatusCode) } @@ -202,7 +202,7 @@ func (suite *ProjectTestSuite) TestSetScannerOfProject() { mock.OnAnything(suite.projectCtl, "Get").Return(suite.project, nil).Once() mock.OnAnything(suite.scannerCtl, "SetRegistrationByProject").Return(nil).Once() - res, err := suite.PutJSON("/projects/library/scanner", map[string]interface{}{"uuid": "uuid"}) + res, err := suite.PutJSON("/projects/library/scanner", map[string]any{"uuid": "uuid"}) suite.NoError(err) suite.Equal(200, res.StatusCode) } diff --git a/src/server/v2.0/handler/purge.go b/src/server/v2.0/handler/purge.go index dc8c77d5da4..2379ad12de3 100644 --- a/src/server/v2.0/handler/purge.go +++ b/src/server/v2.0/handler/purge.go @@ -90,7 +90,7 @@ func verifyCreateRequest(params purge.CreatePurgeScheduleParams) error { return nil } -func retentionHour(m map[string]interface{}) (int, error) { +func retentionHour(m map[string]any) (int, error) { if ret, ok := m[common.PurgeAuditRetentionHour]; ok { if rh, ok := ret.(json.Number); ok { ret, err := rh.Int64() @@ -106,9 +106,9 @@ func retentionHour(m map[string]interface{}) (int, error) { return 0, nil } -func (p *purgeAPI) kick(ctx context.Context, vendorType string, scheType string, cron string, parameters map[string]interface{}) (int64, error) { +func (p *purgeAPI) kick(ctx context.Context, vendorType string, scheType string, cron string, parameters map[string]any) (int64, error) { if parameters == nil { - parameters = make(map[string]interface{}) + parameters = make(map[string]any) } var err error var id int64 @@ -140,7 +140,7 @@ func (p *purgeAPI) kick(ctx context.Context, vendorType string, scheType string, return id, err } -func (p *purgeAPI) updateSchedule(ctx context.Context, vendorType, cronType, cron string, policy pg.JobPolicy, extraParams map[string]interface{}) error { +func (p *purgeAPI) updateSchedule(ctx context.Context, vendorType, cronType, cron string, policy pg.JobPolicy, extraParams map[string]any) error { if err := utils.ValidateCronString(cron); err != nil { return errors.New(nil).WithCode(errors.BadRequestCode). WithMessagef("invalid cron string for scheduled log rotation purge: %s, error: %v", cron, err) @@ -318,7 +318,7 @@ func verifyUpdateRequest(params purge.UpdatePurgeScheduleParams) error { return nil } -func (p *purgeAPI) createSchedule(ctx context.Context, vendorType string, cronType string, cron string, policy pg.JobPolicy, extraParam map[string]interface{}) error { +func (p *purgeAPI) createSchedule(ctx context.Context, vendorType string, cronType string, cron string, policy pg.JobPolicy, extraParam map[string]any) error { _, err := p.schedulerCtl.Create(ctx, vendorType, cronType, cron, pg.SchedulerCallback, policy, extraParam) if err != nil { return err diff --git a/src/server/v2.0/handler/purge_test.go b/src/server/v2.0/handler/purge_test.go index c25a824d7a9..bd07dd03a4c 100644 --- a/src/server/v2.0/handler/purge_test.go +++ b/src/server/v2.0/handler/purge_test.go @@ -34,10 +34,10 @@ func Test_verifyUpdateRequest(t *testing.T) { args args wantErr bool }{ - {"normal", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, - {"missing_schedule", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_retention_hour", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_operations", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168"}}}}, true}, + {"normal", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, + {"missing_schedule", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_retention_hour", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_operations", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168"}}}}, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -57,10 +57,10 @@ func Test_verifyCreateRequest(t *testing.T) { args args wantErr bool }{ - {"normal", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, - {"missing_schedule", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_retention_hour", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_event_types", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168"}}}}, true}, + {"normal", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, + {"missing_schedule", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_retention_hour", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_event_types", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168"}}}}, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -74,7 +74,7 @@ func Test_verifyCreateRequest(t *testing.T) { func Test_checkRetentionHour(t *testing.T) { type args struct { - m map[string]interface{} + m map[string]any } tests := []struct { name string @@ -82,10 +82,10 @@ func Test_checkRetentionHour(t *testing.T) { want int wantErr assert.ErrorAssertionFunc }{ - {"normal", args{map[string]interface{}{common.PurgeAuditRetentionHour: 24}}, 24, func(t assert.TestingT, err error, i ...interface{}) bool { return false }}, - {"overflow", args{map[string]interface{}{common.PurgeAuditRetentionHour: 250000}}, 0, func(t assert.TestingT, err error, i ...interface{}) bool { return true }}, - {"equal", args{map[string]interface{}{common.PurgeAuditRetentionHour: 240000}}, 240000, func(t assert.TestingT, err error, i ...interface{}) bool { return false }}, - {"wrong type", args{map[string]interface{}{common.PurgeAuditRetentionHour: "wrong type"}}, 0, func(t assert.TestingT, err error, i ...interface{}) bool { return true }}, + {"normal", args{map[string]any{common.PurgeAuditRetentionHour: 24}}, 24, func(t assert.TestingT, err error, i ...any) bool { return false }}, + {"overflow", args{map[string]any{common.PurgeAuditRetentionHour: 250000}}, 0, func(t assert.TestingT, err error, i ...any) bool { return true }}, + {"equal", args{map[string]any{common.PurgeAuditRetentionHour: 240000}}, 240000, func(t assert.TestingT, err error, i ...any) bool { return false }}, + {"wrong type", args{map[string]any{common.PurgeAuditRetentionHour: "wrong type"}}, 0, func(t assert.TestingT, err error, i ...any) bool { return true }}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/server/v2.0/handler/quota_test.go b/src/server/v2.0/handler/quota_test.go index b6cdd2e3554..66438a87d79 100644 --- a/src/server/v2.0/handler/quota_test.go +++ b/src/server/v2.0/handler/quota_test.go @@ -64,7 +64,7 @@ func (suite *QuotaTestSuite) SetupSuite() { } func (suite *QuotaTestSuite) TestAuthorization() { - newBody := func(body interface{}) io.Reader { + newBody := func(body any) io.Reader { if body == nil { return nil } @@ -81,7 +81,7 @@ func (suite *QuotaTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any }{ {http.MethodGet, "/quotas/1", nil}, {http.MethodGet, "/quotas", nil}, @@ -129,7 +129,7 @@ func (suite *QuotaTestSuite) TestGetQuota() { // quota not found mock.OnAnything(suite.quotaCtl, "Get").Return(nil, errors.NotFoundError(nil)).Once() - var quota map[string]interface{} + var quota map[string]any res, err := suite.GetJSON("/quotas/1", "a) suite.NoError(err) suite.Equal(404, res.StatusCode) @@ -139,7 +139,7 @@ func (suite *QuotaTestSuite) TestGetQuota() { // quota found mock.OnAnything(suite.quotaCtl, "Get").Return(suite.quota, nil).Once() - var quota map[string]interface{} + var quota map[string]any res, err := suite.GetJSON("/quotas/1", "a) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -176,7 +176,7 @@ func (suite *QuotaTestSuite) TestListQuotas() { mock.OnAnything(suite.quotaCtl, "Count").Return(int64(0), nil).Once() mock.OnAnything(suite.quotaCtl, "List").Return(nil, nil).Once() - var quotas []interface{} + var quotas []any res, err := suite.GetJSON("/quotas", "as) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -188,7 +188,7 @@ func (suite *QuotaTestSuite) TestListQuotas() { mock.OnAnything(suite.quotaCtl, "Count").Return(int64(3), nil).Once() mock.OnAnything(suite.quotaCtl, "List").Return([]*quota.Quota{suite.quota}, nil).Once() - var quotas []interface{} + var quotas []any res, err := suite.GetJSON("/quotas?page_size=1&page=2", "as) suite.NoError(err) suite.Equal(200, res.StatusCode) diff --git a/src/server/v2.0/handler/replication.go b/src/server/v2.0/handler/replication.go index c5c700f679b..e53157faaa1 100644 --- a/src/server/v2.0/handler/replication.go +++ b/src/server/v2.0/handler/replication.go @@ -46,7 +46,7 @@ type replicationAPI struct { ctl replication.Controller } -func (r *replicationAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (r *replicationAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -362,14 +362,14 @@ func (r *replicationAPI) ListReplicationTasks(ctx context.Context, params operat } query.Keywords["ExecutionID"] = params.ID if params.Status != nil { - var status interface{} = *params.Status + var status any = *params.Status // as we convert the status when responding requests to keep the backward compatibility, // here we need to reverse-convert the status // the status "pending" and "stopped" is same with jobservice, no need to convert switch status { case "InProgress": status = &q.OrList{ - Values: []interface{}{ + Values: []any{ job.ScheduledStatus.String(), job.RunningStatus.String(), }, diff --git a/src/server/v2.0/handler/repository.go b/src/server/v2.0/handler/repository.go index 64ce4b24140..2629c760ff5 100644 --- a/src/server/v2.0/handler/repository.go +++ b/src/server/v2.0/handler/repository.go @@ -56,7 +56,7 @@ type repositoryAPI struct { artCtl artifact.Controller } -func (r *repositoryAPI) Prepare(ctx context.Context, _ string, params interface{}) middleware.Responder { +func (r *repositoryAPI) Prepare(ctx context.Context, _ string, params any) middleware.Responder { if err := unescapePathParams(params, "RepositoryName"); err != nil { r.SendError(ctx, err) } @@ -117,7 +117,7 @@ func (r *repositoryAPI) listAuthorizedProjectIDs(ctx context.Context) ([]int64, return nil, errors.UnauthorizedError(errors.New("security context not found")) } query := &q.Query{ - Keywords: map[string]interface{}{}, + Keywords: map[string]any{}, } if secCtx.IsAuthenticated() { switch v := secCtx.(type) { @@ -213,7 +213,7 @@ func (r *repositoryAPI) GetRepository(ctx context.Context, params operation.GetR func (r *repositoryAPI) assembleRepository(ctx context.Context, repository *model.RepoRecord) *models.Repository { repo := repository.ToSwagger() total, err := r.artCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": repo.ID, }, }) diff --git a/src/server/v2.0/handler/retention.go b/src/server/v2.0/handler/retention.go index 033e085abb6..5e0478a851e 100644 --- a/src/server/v2.0/handler/retention.go +++ b/src/server/v2.0/handler/retention.go @@ -133,7 +133,7 @@ var ( } ) -func (r *retentionAPI) Prepare(ctx context.Context, _ string, _ interface{}) middleware.Responder { +func (r *retentionAPI) Prepare(ctx context.Context, _ string, _ any) middleware.Responder { if err := r.RequireAuthenticated(ctx); err != nil { return r.SendError(ctx, err) } diff --git a/src/server/v2.0/handler/robot.go b/src/server/v2.0/handler/robot.go index f8f4f10c1d8..221a0725779 100644 --- a/src/server/v2.0/handler/robot.go +++ b/src/server/v2.0/handler/robot.go @@ -318,7 +318,7 @@ func (rAPI *robotAPI) requireAccess(ctx context.Context, r *robot.Robot, action if r.Level == robot.LEVELSYSTEM { return rAPI.RequireSystemAccess(ctx, action, rbac.ResourceRobot) } else if r.Level == robot.LEVELPROJECT { - var ns interface{} + var ns any if r.ProjectNameOrID != nil { ns = r.ProjectNameOrID } else if r.ProjectID > 0 { diff --git a/src/server/v2.0/handler/scan.go b/src/server/v2.0/handler/scan.go index e3c74d6c2c4..f4e34f84161 100644 --- a/src/server/v2.0/handler/scan.go +++ b/src/server/v2.0/handler/scan.go @@ -42,7 +42,7 @@ type scanAPI struct { scanCtl scan.Controller } -func (s *scanAPI) Prepare(ctx context.Context, _ string, params interface{}) middleware.Responder { +func (s *scanAPI) Prepare(ctx context.Context, _ string, params any) middleware.Responder { if err := unescapePathParams(params, "RepositoryName"); err != nil { s.SendError(ctx, err) } diff --git a/src/server/v2.0/handler/scan_all.go b/src/server/v2.0/handler/scan_all.go index 469e3520b68..0e0d7388127 100644 --- a/src/server/v2.0/handler/scan_all.go +++ b/src/server/v2.0/handler/scan_all.go @@ -58,7 +58,7 @@ type scanAllAPI struct { makeCtx func() context.Context } -func (s *scanAllAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (s *scanAllAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -208,7 +208,7 @@ func (s *scanAllAPI) createOrUpdateScanAllSchedule(ctx context.Context, cronType } } - cbParams := map[string]interface{}{ + cbParams := map[string]any{ // the operator of schedule job is harbor-jobservice "operator": secret.JobserviceUser, } @@ -289,7 +289,7 @@ func (s *scanAllAPI) getLatestScanAllExecution(ctx context.Context, trigger ...s } func (s *scanAllAPI) requireScanEnabled(ctx context.Context) error { - kws := make(map[string]interface{}) + kws := make(map[string]any) kws["is_default"] = true query := &q.Query{ diff --git a/src/server/v2.0/handler/scan_all_test.go b/src/server/v2.0/handler/scan_all_test.go index 0a91ebed158..33bfa361f54 100644 --- a/src/server/v2.0/handler/scan_all_test.go +++ b/src/server/v2.0/handler/scan_all_test.go @@ -97,7 +97,7 @@ func (suite *ScanAllTestSuite) SetupSuite() { } func (suite *ScanAllTestSuite) TestAuthorization() { - newBody := func(body interface{}) io.Reader { + newBody := func(body any) io.Reader { if body == nil { return nil } @@ -114,7 +114,7 @@ func (suite *ScanAllTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any }{ {http.MethodGet, "/scans/all/metrics", nil}, {http.MethodGet, "/scans/schedule/metrics", nil}, @@ -185,7 +185,7 @@ func (suite *ScanAllTestSuite) TestGetLatestScanAllMetrics() { // scan all execution not found mock.OnAnything(suite.execMgr, "List").Return(nil, nil).Once() - var stats map[string]interface{} + var stats map[string]any res, err := suite.GetJSON("/scans/all/metrics", &stats) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -223,7 +223,7 @@ func (suite *ScanAllTestSuite) TestGetLatestScheduledScanAllMetrics() { // scan all execution not found mock.OnAnything(suite.execMgr, "List").Return(nil, nil).Once() - var stats map[string]interface{} + var stats map[string]any res, err := suite.GetJSON("/scans/schedule/metrics", &stats) suite.NoError(err) suite.Equal(200, res.StatusCode) diff --git a/src/server/v2.0/handler/scanexport.go b/src/server/v2.0/handler/scanexport.go index cc0d6dc5439..6a797aa1dda 100644 --- a/src/server/v2.0/handler/scanexport.go +++ b/src/server/v2.0/handler/scanexport.go @@ -58,7 +58,7 @@ type scanDataExportAPI struct { userMgr user.Manager } -func (se *scanDataExportAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (se *scanDataExportAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } diff --git a/src/server/v2.0/handler/scanexport_test.go b/src/server/v2.0/handler/scanexport_test.go index 76008c20b46..b2325210880 100644 --- a/src/server/v2.0/handler/scanexport_test.go +++ b/src/server/v2.0/handler/scanexport_test.go @@ -74,7 +74,7 @@ func (suite *ScanExportTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any headers map[string]string }{ {http.MethodPost, "/export/cve", criteria, map[string]string{"X-Scan-Data-Type": v1.MimeTypeGenericVulnerabilityReport}}, @@ -191,7 +191,7 @@ func (suite *ScanExportTestSuite) TestExportScanData() { suite.Equal(200, res.StatusCode) suite.Equal(nil, err) - respData := make(map[string]interface{}) + respData := make(map[string]any) json.NewDecoder(res.Body).Decode(&respData) suite.Equal(int64(100), int64(respData["id"].(float64))) diff --git a/src/server/v2.0/handler/scanner_test.go b/src/server/v2.0/handler/scanner_test.go index e18f9bdae6f..068ac5dfff9 100644 --- a/src/server/v2.0/handler/scanner_test.go +++ b/src/server/v2.0/handler/scanner_test.go @@ -66,7 +66,7 @@ func (suite *ScannerTestSuite) SetupSuite() { } func (suite *ScannerTestSuite) TestAuthorization() { - newBody := func(body interface{}) io.Reader { + newBody := func(body any) io.Reader { if body == nil { return nil } @@ -79,7 +79,7 @@ func (suite *ScannerTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any }{ {http.MethodGet, "/scanners", nil}, {http.MethodPost, "/scanners", suite.reg}, @@ -87,7 +87,7 @@ func (suite *ScannerTestSuite) TestAuthorization() { {http.MethodGet, "/scanners/uuid1", nil}, {http.MethodPut, "/scanners/uuid1", suite.reg}, {http.MethodDelete, "/scanners/uuid1", nil}, - {http.MethodPatch, "/scanners/uuid1", map[string]interface{}{"is_default": true}}, + {http.MethodPatch, "/scanners/uuid1", map[string]any{"is_default": true}}, {http.MethodGet, "/scanners/uuid1/metadata", nil}, } @@ -124,7 +124,7 @@ func (suite *ScannerTestSuite) TestCreateScannerWithInvalidBody() { { // name missing - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "url": "http://reg:8080", }) suite.NoError(err) @@ -133,7 +133,7 @@ func (suite *ScannerTestSuite) TestCreateScannerWithInvalidBody() { { // url missing - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", }) suite.NoError(err) @@ -142,7 +142,7 @@ func (suite *ScannerTestSuite) TestCreateScannerWithInvalidBody() { { // invalid url - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "invalid url", }) @@ -158,7 +158,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { mock.OnAnything(suite.scannerCtl, "CreateRegistration").Return("", fmt.Errorf("failed to create registration")).Once() - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -168,7 +168,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { mock.OnAnything(suite.scannerCtl, "CreateRegistration").Return("uuid", nil).Once() - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -179,7 +179,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { // access_credential missing - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -190,7 +190,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { mock.OnAnything(suite.scannerCtl, "CreateRegistration").Return("uuid", nil).Once() - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -268,7 +268,7 @@ func (suite *ScannerTestSuite) TestGetScanner() { // scanner not found mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(nil, nil).Once() - var scanner map[string]interface{} + var scanner map[string]any res, err := suite.GetJSON("/scanners/uuid", &scanner) suite.NoError(err) suite.Equal(404, res.StatusCode) @@ -278,7 +278,7 @@ func (suite *ScannerTestSuite) TestGetScanner() { // scanner found mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() - var scanner map[string]interface{} + var scanner map[string]any res, err := suite.GetJSON("/scanners/uuid", &scanner) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -340,7 +340,7 @@ func (suite *ScannerTestSuite) TestListScanners() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(0), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return(nil, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/scanners", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -352,7 +352,7 @@ func (suite *ScannerTestSuite) TestListScanners() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(3), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return([]*scanner.Registration{suite.reg}, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/scanners?page_size=1&page=2", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -370,7 +370,7 @@ func (suite *ScannerTestSuite) TestPingScanner() { { // bad req - res, err := suite.PostJSON("/scanners/ping", map[string]interface{}{ + res, err := suite.PostJSON("/scanners/ping", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -383,7 +383,7 @@ func (suite *ScannerTestSuite) TestPingScanner() { // ping failed mock.OnAnything(suite.scannerCtl, "Ping").Return(nil, fmt.Errorf("failed to ping scanner")).Once() - res, err := suite.PostJSON("/scanners/ping", map[string]interface{}{ + res, err := suite.PostJSON("/scanners/ping", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -395,7 +395,7 @@ func (suite *ScannerTestSuite) TestPingScanner() { // ping mock.OnAnything(suite.scannerCtl, "Ping").Return(&suite.metadata, nil).Once() - res, err := suite.PostJSON("/scanners/ping", map[string]interface{}{ + res, err := suite.PostJSON("/scanners/ping", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -410,7 +410,7 @@ func (suite *ScannerTestSuite) TestSetScannerAsDefault() { suite.Security.On("Can", mock.Anything, mock.Anything, mock.Anything).Return(true).Times(times) { - res, err := suite.PatchJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PatchJSON("/scanners/uuid", map[string]any{ "is_default": false, }) suite.NoError(err) @@ -421,7 +421,7 @@ func (suite *ScannerTestSuite) TestSetScannerAsDefault() { // set default failed mock.OnAnything(suite.scannerCtl, "SetDefaultRegistration").Return(fmt.Errorf("failed to set default")).Once() - res, err := suite.PatchJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PatchJSON("/scanners/uuid", map[string]any{ "is_default": true, }) suite.NoError(err) @@ -432,7 +432,7 @@ func (suite *ScannerTestSuite) TestSetScannerAsDefault() { // set default mock.OnAnything(suite.scannerCtl, "SetDefaultRegistration").Return(nil).Once() - res, err := suite.PatchJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PatchJSON("/scanners/uuid", map[string]any{ "is_default": true, }) suite.NoError(err) @@ -456,7 +456,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // get scanner failed mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(nil, fmt.Errorf("failed to get registration")).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -468,7 +468,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // scanner not found mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(nil, nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -480,7 +480,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // immutable scanner mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(&scanner.Registration{Immutable: true}, nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -492,7 +492,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // bad req mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -506,7 +506,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() mock.OnAnything(suite.scannerCtl, "UpdateRegistration").Return(fmt.Errorf("failed to update the scanner")).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -519,7 +519,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() mock.OnAnything(suite.scannerCtl, "UpdateRegistration").Return(nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) diff --git a/src/server/v2.0/handler/search.go b/src/server/v2.0/handler/search.go index ecae3f8f0cc..d519b4b4735 100644 --- a/src/server/v2.0/handler/search.go +++ b/src/server/v2.0/handler/search.go @@ -167,7 +167,7 @@ func (s *searchAPI) filterRepositories(ctx context.Context, projects []*project. // searchOK ... type searchOK struct { - Payload interface{} + Payload any } func (o *searchOK) WithPayload(payload *models.Search) *searchOK { diff --git a/src/server/v2.0/handler/statistic.go b/src/server/v2.0/handler/statistic.go index 382819c8042..4e20e309fda 100644 --- a/src/server/v2.0/handler/statistic.go +++ b/src/server/v2.0/handler/statistic.go @@ -61,12 +61,12 @@ func (s *statisticAPI) GetStatistic(ctx context.Context, _ operation.GetStatisti if len(pubProjs) == 0 { statistic.PublicRepoCount = 0 } else { - var ids []interface{} + var ids []any for _, p := range pubProjs { ids = append(ids, p.ProjectID) } n, err := s.repoCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": q.NewOrList(ids), }, }) @@ -108,7 +108,7 @@ func (s *statisticAPI) GetStatistic(ctx context.Context, _ operation.GetStatisti } statistic.TotalStorageConsumption = sum + sysArtifactStorageSize } else { - var privProjectIDs []interface{} + var privProjectIDs []any if sc, ok := securityCtx.(*local.SecurityContext); ok && sc.IsAuthenticated() { user := sc.User() member := &project.MemberQuery{ @@ -130,7 +130,7 @@ func (s *statisticAPI) GetStatistic(ctx context.Context, _ operation.GetStatisti statistic.PrivateRepoCount = 0 } else { n, err := s.repoCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": q.NewOrList(privProjectIDs), }, }) diff --git a/src/server/v2.0/handler/util.go b/src/server/v2.0/handler/util.go index ebff63b5cd4..f748fbbed90 100644 --- a/src/server/v2.0/handler/util.go +++ b/src/server/v2.0/handler/util.go @@ -64,7 +64,7 @@ func parseScanReportMimeTypes(header *string) []string { return mimeTypes } -func unescapePathParams(params interface{}, fieldNames ...string) error { +func unescapePathParams(params any, fieldNames ...string) error { val := reflect.ValueOf(params) if val.Kind() != reflect.Ptr { return fmt.Errorf("params must be ptr") @@ -102,7 +102,7 @@ func unescapePathParams(params interface{}, fieldNames ...string) error { return nil } -func parseProjectNameOrID(str string, isResourceName *bool) interface{} { +func parseProjectNameOrID(str string, isResourceName *bool) any { if lib.BoolValue(isResourceName) { // always as projectName return str @@ -117,7 +117,7 @@ func parseProjectNameOrID(str string, isResourceName *bool) interface{} { return v // projectID } -func getProjectID(ctx context.Context, projectNameOrID interface{}) (int64, error) { +func getProjectID(ctx context.Context, projectNameOrID any) (int64, error) { projectName, ok := projectNameOrID.(string) if ok { p, err := project.Ctl.Get(ctx, projectName, project.Metadata(false)) diff --git a/src/server/v2.0/handler/util_test.go b/src/server/v2.0/handler/util_test.go index 36998a2fdd7..613adc82bd0 100644 --- a/src/server/v2.0/handler/util_test.go +++ b/src/server/v2.0/handler/util_test.go @@ -28,7 +28,7 @@ func Test_unescapePathParams(t *testing.T) { str := "params" type args struct { - params interface{} + params any fieldNames []string } tests := []struct { diff --git a/src/server/v2.0/handler/webhook.go b/src/server/v2.0/handler/webhook.go index a77a30a0149..921a7f485f4 100644 --- a/src/server/v2.0/handler/webhook.go +++ b/src/server/v2.0/handler/webhook.go @@ -53,11 +53,11 @@ type webhookAPI struct { webhookCtl webhook_ctl.Controller } -func (n *webhookAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (n *webhookAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } -func (n *webhookAPI) requirePolicyInProject(ctx context.Context, projectIDOrName interface{}, policyID int64) error { +func (n *webhookAPI) requirePolicyInProject(ctx context.Context, projectIDOrName any, policyID int64) error { projectID, err := getProjectID(ctx, projectIDOrName) if err != nil { return err diff --git a/src/server/v2.0/handler/webhook_job.go b/src/server/v2.0/handler/webhook_job.go index ae14108c390..5ab4ab4e134 100644 --- a/src/server/v2.0/handler/webhook_job.go +++ b/src/server/v2.0/handler/webhook_job.go @@ -89,7 +89,7 @@ func (n *webhookJobAPI) ListWebhookJobs(ctx context.Context, params webhookjob.L } // requirePolicyAccess checks whether the project has the permission to the policy. -func (n *webhookJobAPI) requirePolicyAccess(ctx context.Context, projectNameIrID interface{}, policy *policyModel.Policy) error { +func (n *webhookJobAPI) requirePolicyAccess(ctx context.Context, projectNameIrID any, policy *policyModel.Policy) error { p, err := n.projectMgr.Get(ctx, projectNameIrID) if err != nil { return err diff --git a/src/testing/jobservice/context.go b/src/testing/jobservice/context.go index b6d01a9dddf..8c7fc0bf1fa 100644 --- a/src/testing/jobservice/context.go +++ b/src/testing/jobservice/context.go @@ -27,7 +27,7 @@ func (mjc *MockJobContext) Build(tracker job.Tracker) (job.Context, error) { } // Get ... -func (mjc *MockJobContext) Get(prop string) (interface{}, bool) { +func (mjc *MockJobContext) Get(prop string) (any, bool) { args := mjc.Called(prop) return args.Get(0), args.Bool(1) } @@ -71,51 +71,51 @@ type MockJobLogger struct { } // Debug ... -func (mjl *MockJobLogger) Debug(v ...interface{}) { +func (mjl *MockJobLogger) Debug(v ...any) { logger.Debug(v...) } // Debugf ... -func (mjl *MockJobLogger) Debugf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Debugf(format string, v ...any) { logger.Debugf(format, v...) } // Info ... -func (mjl *MockJobLogger) Info(v ...interface{}) { +func (mjl *MockJobLogger) Info(v ...any) { logger.Info(v...) } // Infof ... -func (mjl *MockJobLogger) Infof(format string, v ...interface{}) { +func (mjl *MockJobLogger) Infof(format string, v ...any) { logger.Infof(format, v...) } // Warning ... -func (mjl *MockJobLogger) Warning(v ...interface{}) { +func (mjl *MockJobLogger) Warning(v ...any) { logger.Warning(v...) } // Warningf ... -func (mjl *MockJobLogger) Warningf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Warningf(format string, v ...any) { logger.Warningf(format, v...) } // Error ... -func (mjl *MockJobLogger) Error(v ...interface{}) { +func (mjl *MockJobLogger) Error(v ...any) { logger.Error(v...) } // Errorf ... -func (mjl *MockJobLogger) Errorf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Errorf(format string, v ...any) { logger.Errorf(format, v...) } // Fatal ... -func (mjl *MockJobLogger) Fatal(v ...interface{}) { +func (mjl *MockJobLogger) Fatal(v ...any) { logger.Fatal(v...) } // Fatalf ... -func (mjl *MockJobLogger) Fatalf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Fatalf(format string, v ...any) { logger.Fatalf(format, v...) } diff --git a/src/testing/lib/orm/orm.go b/src/testing/lib/orm/orm.go index 34bec811d81..54588b8f560 100644 --- a/src/testing/lib/orm/orm.go +++ b/src/testing/lib/orm/orm.go @@ -26,39 +26,39 @@ import ( type FakeOrmer struct { } -func (f *FakeOrmer) LoadRelated(md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeOrmer) LoadRelated(md any, name string, args ...utils.KV) (int64, error) { return 0, nil } -func (f *FakeOrmer) QueryM2MWithCtx(ctx context.Context, md interface{}, name string) orm.QueryM2Mer { +func (f *FakeOrmer) QueryM2MWithCtx(ctx context.Context, md any, name string) orm.QueryM2Mer { return nil } -func (f *FakeOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName any) orm.QuerySeter { return nil } -func (f *FakeOrmer) InsertWithCtx(ctx context.Context, md interface{}) (int64, error) { +func (f *FakeOrmer) InsertWithCtx(ctx context.Context, md any) (int64, error) { return 0, nil } -func (f *FakeOrmer) InsertOrUpdateWithCtx(ctx context.Context, md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeOrmer) InsertOrUpdateWithCtx(ctx context.Context, md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } -func (f *FakeOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds interface{}) (int64, error) { +func (f *FakeOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds any) (int64, error) { return 0, nil } -func (f *FakeOrmer) UpdateWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) UpdateWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeOrmer) DeleteWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) DeleteWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeOrmer) RawWithCtx(ctx context.Context, query string, args ...interface{}) orm.RawSeter { +func (f *FakeOrmer) RawWithCtx(ctx context.Context, query string, args ...any) orm.RawSeter { return nil } @@ -95,68 +95,68 @@ func (f *FakeOrmer) DoTxWithCtxAndOpts(ctx context.Context, opts *sql.TxOptions, } // Read ... -func (f *FakeOrmer) Read(md interface{}, cols ...string) error { +func (f *FakeOrmer) Read(md any, cols ...string) error { return nil } -func (f *FakeOrmer) ReadWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeOrmer) ReadWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeOrmer) ReadForUpdateWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeOrmer) ReadForUpdateWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeOrmer) ReadOrCreateWithCtx(ctx context.Context, md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeOrmer) ReadOrCreateWithCtx(ctx context.Context, md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } -func (f *FakeOrmer) LoadRelatedWithCtx(_ context.Context, md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeOrmer) LoadRelatedWithCtx(_ context.Context, md any, name string, args ...utils.KV) (int64, error) { return 0, nil } // ReadForUpdate ... -func (f *FakeOrmer) ReadForUpdate(md interface{}, cols ...string) error { +func (f *FakeOrmer) ReadForUpdate(md any, cols ...string) error { return nil } // ReadOrCreate ... -func (f *FakeOrmer) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeOrmer) ReadOrCreate(md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } // Insert ... -func (f *FakeOrmer) Insert(interface{}) (int64, error) { +func (f *FakeOrmer) Insert(any) (int64, error) { return 0, nil } // InsertOrUpdate ... -func (f *FakeOrmer) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeOrmer) InsertOrUpdate(md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } // InsertMulti ... -func (f *FakeOrmer) InsertMulti(bulk int, mds interface{}) (int64, error) { +func (f *FakeOrmer) InsertMulti(bulk int, mds any) (int64, error) { return 0, nil } // Update ... -func (f *FakeOrmer) Update(md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) Update(md any, cols ...string) (int64, error) { return 0, nil } // Delete ... -func (f *FakeOrmer) Delete(md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) Delete(md any, cols ...string) (int64, error) { return 0, nil } // QueryM2M ... -func (f *FakeOrmer) QueryM2M(md interface{}, name string) orm.QueryM2Mer { +func (f *FakeOrmer) QueryM2M(md any, name string) orm.QueryM2Mer { return nil } // QueryTable ... -func (f *FakeOrmer) QueryTable(ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeOrmer) QueryTable(ptrStructOrTableName any) orm.QuerySeter { return nil } @@ -181,7 +181,7 @@ func (f *FakeOrmer) Rollback() error { } // Raw ... -func (f *FakeOrmer) Raw(query string, args ...interface{}) orm.RawSeter { +func (f *FakeOrmer) Raw(query string, args ...any) orm.RawSeter { return &FakeRawSeter{} } @@ -199,51 +199,51 @@ func (f *FakeOrmer) DBStats() *sql.DBStats { type FakeTxOrmer struct { } -func (f *FakeTxOrmer) Read(md interface{}, cols ...string) error { +func (f *FakeTxOrmer) Read(md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeTxOrmer) ReadWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadForUpdate(md interface{}, cols ...string) error { +func (f *FakeTxOrmer) ReadForUpdate(md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadForUpdateWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeTxOrmer) ReadForUpdateWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeTxOrmer) ReadOrCreate(md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } -func (f *FakeTxOrmer) ReadOrCreateWithCtx(ctx context.Context, md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeTxOrmer) ReadOrCreateWithCtx(ctx context.Context, md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } -func (f *FakeTxOrmer) LoadRelated(md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeTxOrmer) LoadRelated(md any, name string, args ...utils.KV) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) LoadRelatedWithCtx(ctx context.Context, md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeTxOrmer) LoadRelatedWithCtx(ctx context.Context, md any, name string, args ...utils.KV) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) QueryM2M(md interface{}, name string) orm.QueryM2Mer { +func (f *FakeTxOrmer) QueryM2M(md any, name string) orm.QueryM2Mer { return nil } -func (f *FakeTxOrmer) QueryM2MWithCtx(ctx context.Context, md interface{}, name string) orm.QueryM2Mer { +func (f *FakeTxOrmer) QueryM2MWithCtx(ctx context.Context, md any, name string) orm.QueryM2Mer { return nil } -func (f *FakeTxOrmer) QueryTable(ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeTxOrmer) QueryTable(ptrStructOrTableName any) orm.QuerySeter { return nil } -func (f *FakeTxOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeTxOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName any) orm.QuerySeter { return nil } @@ -251,51 +251,51 @@ func (f *FakeTxOrmer) DBStats() *sql.DBStats { return nil } -func (f *FakeTxOrmer) Insert(md interface{}) (int64, error) { +func (f *FakeTxOrmer) Insert(md any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertWithCtx(ctx context.Context, md interface{}) (int64, error) { +func (f *FakeTxOrmer) InsertWithCtx(ctx context.Context, md any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeTxOrmer) InsertOrUpdate(md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertOrUpdateWithCtx(ctx context.Context, md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeTxOrmer) InsertOrUpdateWithCtx(ctx context.Context, md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertMulti(bulk int, mds interface{}) (int64, error) { +func (f *FakeTxOrmer) InsertMulti(bulk int, mds any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds interface{}) (int64, error) { +func (f *FakeTxOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) Update(md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) Update(md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) UpdateWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) UpdateWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) Delete(md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) Delete(md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) DeleteWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) DeleteWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) Raw(query string, args ...interface{}) orm.RawSeter { +func (f *FakeTxOrmer) Raw(query string, args ...any) orm.RawSeter { return &FakeRawSeter{} } -func (f *FakeTxOrmer) RawWithCtx(ctx context.Context, query string, args ...interface{}) orm.RawSeter { +func (f *FakeTxOrmer) RawWithCtx(ctx context.Context, query string, args ...any) orm.RawSeter { return nil } @@ -323,15 +323,15 @@ func (f FakeRawSeter) Exec() (sql.Result, error) { return nil, nil } -func (f FakeRawSeter) QueryRow(containers ...interface{}) error { +func (f FakeRawSeter) QueryRow(containers ...any) error { return nil } -func (f FakeRawSeter) QueryRows(containers ...interface{}) (int64, error) { +func (f FakeRawSeter) QueryRows(containers ...any) (int64, error) { return 0, nil } -func (f FakeRawSeter) SetArgs(i ...interface{}) orm.RawSeter { +func (f FakeRawSeter) SetArgs(i ...any) orm.RawSeter { return nil } @@ -351,7 +351,7 @@ func (f FakeRawSeter) RowsToMap(result *orm.Params, keyCol, valueCol string) (in return 0, nil } -func (f FakeRawSeter) RowsToStruct(ptrStruct interface{}, keyCol, valueCol string) (int64, error) { +func (f FakeRawSeter) RowsToStruct(ptrStruct any, keyCol, valueCol string) (int64, error) { return 0, nil } diff --git a/src/testing/mock/mock.go b/src/testing/mock/mock.go index 3595cd657a8..3cad03f62c0 100644 --- a/src/testing/mock/mock.go +++ b/src/testing/mock/mock.go @@ -35,11 +35,11 @@ var ( type Arguments = mock.Arguments type mockable interface { - On(methodName string, arguments ...interface{}) *mock.Call + On(methodName string, arguments ...any) *mock.Call } // OnAnything mock method on obj which match any args -func OnAnything(obj interface{}, methodName string) *mock.Call { +func OnAnything(obj any, methodName string) *mock.Call { m, ok := obj.(mockable) if !ok { panic("obj not mockable") @@ -52,7 +52,7 @@ func OnAnything(obj interface{}, methodName string) *mock.Call { panic(fmt.Sprintf("assert: arguments: %s is not a func", v)) } - args := []interface{}{} + args := []any{} for i := 0; i < fnType.NumIn(); i++ { args = append(args, mock.Anything) } diff --git a/src/testing/server/v2.0/handler/handler.go b/src/testing/server/v2.0/handler/handler.go index a632f3968c8..b8b2f6983e1 100644 --- a/src/testing/server/v2.0/handler/handler.go +++ b/src/testing/server/v2.0/handler/handler.go @@ -94,7 +94,7 @@ func (suite *Suite) Get(url string, headers ...map[string]string) (*http.Respons } // GetJSON ... -func (suite *Suite) GetJSON(url string, js interface{}, headers ...map[string]string) (*http.Response, error) { +func (suite *Suite) GetJSON(url string, js any, headers ...map[string]string) (*http.Response, error) { res, err := suite.Get(url, headers...) if err != nil { return nil, err @@ -123,7 +123,7 @@ func (suite *Suite) Patch(url string, body io.Reader, headers ...map[string]stri } // PatchJSON ... -func (suite *Suite) PatchJSON(url string, js interface{}) (*http.Response, error) { +func (suite *Suite) PatchJSON(url string, js any) (*http.Response, error) { buf, err := json.Marshal(js) if err != nil { return nil, err @@ -138,7 +138,7 @@ func (suite *Suite) Post(url string, body io.Reader, headers ...map[string]strin } // PostJSON ... -func (suite *Suite) PostJSON(url string, js interface{}) (*http.Response, error) { +func (suite *Suite) PostJSON(url string, js any) (*http.Response, error) { buf, err := json.Marshal(js) if err != nil { return nil, err @@ -153,7 +153,7 @@ func (suite *Suite) Put(url string, body io.Reader, headers ...map[string]string } // PutJSON ... -func (suite *Suite) PutJSON(url string, js interface{}) (*http.Response, error) { +func (suite *Suite) PutJSON(url string, js any) (*http.Response, error) { buf, err := json.Marshal(js) if err != nil { return nil, err diff --git a/src/testing/suite.go b/src/testing/suite.go index 51fcb6e9fcd..1c693d21efa 100644 --- a/src/testing/suite.go +++ b/src/testing/suite.go @@ -152,7 +152,7 @@ func (suite *Suite) NextHandler(statusCode int, headers map[string]string) http. } // ExecSQL ... -func (suite *Suite) ExecSQL(query string, args ...interface{}) { +func (suite *Suite) ExecSQL(query string, args ...any) { o := o.NewOrm() _, err := o.Raw(query, args...).Exec() diff --git a/tools/swagger/templates/README.md b/tools/swagger/templates/README.md index 9ac75203bbe..94fc1e5e078 100644 --- a/tools/swagger/templates/README.md +++ b/tools/swagger/templates/README.md @@ -94,7 +94,7 @@ There is also a `restapi.Config`: type Config struct { PetAPI StoreAPI - Logger func(string, ...interface{}) + Logger func(string, ...any) // InnerMiddleware is for the handler executors. These do not apply to the swagger.json document. // The middleware executes after routing but before authentication, binding and validation InnerMiddleware func(http.Handler) http.Handler @@ -265,12 +265,12 @@ Once we created a security definition named "token", a function called "AuthToke type Config struct { ... // AuthToken Applies when the "Cookie" header is set - AuthToken func(token string) (interface{}, error) + AuthToken func(token string) (any, error) } ``` -This function gets the content of the Cookie header, and should return an `interface{}` and `error`. -The `interface{}` is the object that should represent the user that performed the request, it should +This function gets the content of the Cookie header, and should return an `any` and `error`. +The `any` is the object that should represent the user that performed the request, it should be nil to return an unauthorized 401 HTTP response. If the returned `error` is not nil, an HTTP 500, internal server error will be returned. diff --git a/tools/swagger/templates/server/builder.gotmpl b/tools/swagger/templates/server/builder.gotmpl index e83d39738ed..bb18b90460e 100644 --- a/tools/swagger/templates/server/builder.gotmpl +++ b/tools/swagger/templates/server/builder.gotmpl @@ -185,7 +185,7 @@ type {{ pascalize .Name }}API struct { PreServerShutdown func() // ServerShutdown is called when the HTTP(S) server is shut down and done - // handling all active connections and does not accept connections any more + // handling all active connections and does not accept connections interface{} more ServerShutdown func() // Custom command line argument groups with their descriptions From ada851b49ab6e96e5ffda79f3b87a599131438e9 Mon Sep 17 00:00:00 2001 From: Prasanth Baskar Date: Fri, 9 May 2025 11:08:01 +0530 Subject: [PATCH 22/55] Fix: Helm Chart Copy Button in UI (#21969) * fix: helm chart copy btn in UI Signed-off-by: bupd * add: tests for pull command component in UI Signed-off-by: bupd --------- Signed-off-by: bupd --- .../pull-command/pull-command.component.html | 5 +- .../pull-command.component.spec.ts | 76 +++++++++++++++++-- .../pull-command/pull-command.component.ts | 20 +++-- 3 files changed, 87 insertions(+), 14 deletions(-) diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html index 8884cacf4ae..2d9d98f6f7e 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html @@ -3,6 +3,7 @@ *ngIf="isImage(artifact)" [title]="getPullCommandForRuntimeByDigest(artifact)" [iconMode]="true" + id="pullCommandForDigest" (onCopySuccess)=" onCpSuccess(getPullCommandForRuntimeByDigest(artifact)) " @@ -12,6 +13,7 @@
{ let component: PullCommandComponent; @@ -29,11 +30,11 @@ describe('PullCommandComponent', () => { fixture = TestBed.createComponent(PullCommandComponent); component = fixture.componentInstance; - // Mock the artifact input with a valid value component.artifact = { - type: ArtifactType.IMAGE, - digest: 'sampleDigest', - tags: [{ name: 'latest' }], + type: ArtifactType.CHART, + tagNumber: 1, + digest: 'sha256@digest', + tags: [{ name: '1.0.0' }], }; fixture.detectChanges(); @@ -42,4 +43,69 @@ describe('PullCommandComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should not display pull command for chart', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.CHART, + tagNumber: 0, + digest: 'sha256@digest', + tags: [], + }; + component.getPullCommandForChart(component.artifact); + expect( + component.getPullCommandForChart(component.artifact).length + ).toBe(0); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = + fixture.nativeElement.querySelector(`#pullCommandForChart`); + expect(modal).toBeFalsy(); + }); + + it('should display when pull command for chart is available', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.CHART, + tagNumber: 1, + digest: 'sha256@digest', + tags: [{ name: '1.0.0' }], + }; + component.getPullCommandForChart(component.artifact); + expect( + component.getPullCommandForChart(component.artifact).length + ).toBeGreaterThan(0); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = + fixture.nativeElement.querySelector(`#pullCommandForChart`); + expect(modal).toBeTruthy(); + }); + + it('should display when pull command for digest is available', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.IMAGE, + }; + component.getPullCommandForRuntimeByDigest(component.artifact); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = fixture.nativeElement.querySelector( + `#pullCommandForDigest` + ); + expect(modal).toBeTruthy(); + }); + + it('should display when pull command for CNAB is available', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.CNAB, + }; + component.getPullCommandForCNAB(component.artifact); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = + fixture.nativeElement.querySelector(`#pullCommandForCNAB`); + expect(modal).toBeTruthy(); + }); }); diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts index 1fe4d790144..df0a8a7792c 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts @@ -100,14 +100,18 @@ export class PullCommandComponent { } getPullCommandForChart(artifact: Artifact): string { - return getPullCommandByTag( - artifact.type, - `${this.registryUrl ? this.registryUrl : location.hostname}/${ - this.projectName - }/${this.repoName}`, - artifact.tags[0].name, - Clients.CHART - ); + if (artifact.tagNumber > 0) { + return getPullCommandByTag( + artifact.type, + `${this.registryUrl ? this.registryUrl : location.hostname}/${ + this.projectName + }/${this.repoName}`, + artifact.tags[0].name, + Clients.CHART + ); + } else { + return ''; + } } // For tagMode From 073dab8a07be9e8a386df19b70a5cf56d6fdc63c Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Tue, 13 May 2025 13:11:55 +0800 Subject: [PATCH 23/55] add build flag for harbor exporter (#21988) As the harbor exporter is not a core component for installation, so like the trivy, add a flag to controller whether package it into the offline installer. Signed-off-by: wang yan --- .github/workflows/build-package.yml | 4 ++-- Makefile | 6 ++++-- tests/ci/api_common_install.sh | 2 +- tests/ci/distro_installer.sh | 4 ++-- tests/resources/Harbor-Util.robot | 8 ++++---- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index 5ea1aa50700..a3b92f4890c 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -89,8 +89,8 @@ jobs: else build_base_params=" BUILD_BASE=true PUSHBASEIMAGE=true REGISTRYUSER=\"${{ secrets.DOCKER_HUB_USERNAME }}\" REGISTRYPASSWORD=\"${{ secrets.DOCKER_HUB_PASSWORD }}\"" fi - sudo make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true HTTPPROXY= ${build_base_params} - sudo make package_online GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true HTTPPROXY= ${build_base_params} + sudo make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= ${build_base_params} + sudo make package_online GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= ${build_base_params} harbor_offline_build_bundle=$(basename harbor-offline-installer-*.tgz) harbor_online_build_bundle=$(basename harbor-online-installer-*.tgz) echo "Package name is: $harbor_offline_build_bundle" diff --git a/Makefile b/Makefile index f1bce4e073c..7c8bbcd79bf 100644 --- a/Makefile +++ b/Makefile @@ -78,6 +78,7 @@ REGISTRYSERVER= REGISTRYPROJECTNAME=goharbor DEVFLAG=true TRIVYFLAG=false +EXPORTERFLAG=false HTTPPROXY= BUILDREG=true BUILDTRIVYADP=true @@ -245,7 +246,6 @@ DOCKERSAVE_PARA=$(DOCKER_IMAGE_NAME_PREPARE):$(VERSIONTAG) \ $(DOCKERIMAGENAME_DB):$(VERSIONTAG) \ $(DOCKERIMAGENAME_JOBSERVICE):$(VERSIONTAG) \ $(DOCKERIMAGENAME_REGCTL):$(VERSIONTAG) \ - $(DOCKERIMAGENAME_EXPORTER):$(VERSIONTAG) \ $(IMAGENAMESPACE)/redis-photon:$(VERSIONTAG) \ $(IMAGENAMESPACE)/nginx-photon:$(VERSIONTAG) \ $(IMAGENAMESPACE)/registry-photon:$(VERSIONTAG) @@ -269,7 +269,9 @@ DOCKERCOMPOSE_FILE_OPT=-f $(DOCKERCOMPOSEFILEPATH)/$(DOCKERCOMPOSEFILENAME) ifeq ($(TRIVYFLAG), true) DOCKERSAVE_PARA+= $(IMAGENAMESPACE)/trivy-adapter-photon:$(VERSIONTAG) endif - +ifeq ($(EXPORTERFLAG), true) + DOCKERSAVE_PARA+= $(DOCKERIMAGENAME_EXPORTER):$(VERSIONTAG) +endif RUNCONTAINER=$(DOCKERCMD) run --rm -u $(shell id -u):$(shell id -g) -v $(BUILDPATH):$(BUILDPATH) -w $(BUILDPATH) diff --git a/tests/ci/api_common_install.sh b/tests/ci/api_common_install.sh index 470d58fa4cf..8e1bc9407da 100755 --- a/tests/ci/api_common_install.sh +++ b/tests/ci/api_common_install.sh @@ -58,7 +58,7 @@ then sed "s/# github_token: xxx/github_token: $GITHUB_TOKEN/" -i make/harbor.yml fi -sudo make compile build prepare COMPILETAG=compile_golangimage GOBUILDTAGS="include_oss include_gcs" TRIVYFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false +sudo make compile build prepare COMPILETAG=compile_golangimage GOBUILDTAGS="include_oss include_gcs" TRIVYFLAG=true EXPORTERFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false # set the debugging env echo "GC_TIME_WINDOW_HOURS=0" | sudo tee -a ./make/common/config/core/env diff --git a/tests/ci/distro_installer.sh b/tests/ci/distro_installer.sh index cbf2ddc81c2..f416fb40223 100755 --- a/tests/ci/distro_installer.sh +++ b/tests/ci/distro_installer.sh @@ -3,5 +3,5 @@ set -x set -e -sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false -sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false diff --git a/tests/resources/Harbor-Util.robot b/tests/resources/Harbor-Util.robot index 4d466255adc..550d55bd2a4 100644 --- a/tests/resources/Harbor-Util.robot +++ b/tests/resources/Harbor-Util.robot @@ -55,8 +55,8 @@ Package Harbor Offline [Arguments] ${with_trivy}=true Log To Console \nStart Docker Daemon Start Docker Daemon Locally - Log To Console make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= - ${rc} ${output}= Run And Return Rc And Output make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= + Log To Console make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= + ${rc} ${output}= Run And Return Rc And Output make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= Log To Console ${rc} Log To Console ${output} Should Be Equal As Integers ${rc} 0 @@ -65,8 +65,8 @@ Package Harbor Online [Arguments] ${with_trivy}=true Log To Console \nStart Docker Daemon Start Docker Daemon Locally - Log To Console \nmake package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= - ${rc} ${output}= Run And Return Rc And Output make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= + Log To Console \nmake package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= + ${rc} ${output}= Run And Return Rc And Output make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= Log ${rc} Log ${output} Should Be Equal As Integers ${rc} 0 From 85f3f792e41d513d82655a1c49eeca8e095455bb Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Tue, 13 May 2025 13:49:01 +0800 Subject: [PATCH 24/55] update robot permission table (#21989) fixes #21947 Signed-off-by: wang yan --- make/migrations/postgresql/0170_2.14.0_schema.up.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 make/migrations/postgresql/0170_2.14.0_schema.up.sql diff --git a/make/migrations/postgresql/0170_2.14.0_schema.up.sql b/make/migrations/postgresql/0170_2.14.0_schema.up.sql new file mode 100644 index 00000000000..b90164710f9 --- /dev/null +++ b/make/migrations/postgresql/0170_2.14.0_schema.up.sql @@ -0,0 +1,8 @@ +ALTER TABLE role_permission ALTER COLUMN id TYPE BIGINT; +ALTER SEQUENCE role_permission_id_seq AS BIGINT; + +ALTER TABLE permission_policy ALTER COLUMN id TYPE BIGINT; +ALTER SEQUENCE permission_policy_id_seq AS BIGINT; + +ALTER TABLE role_permission ALTER COLUMN permission_policy_id TYPE BIGINT; + From b4ba918118351aa84f7de70de9cf42df21f5044e Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Tue, 13 May 2025 17:09:35 +0800 Subject: [PATCH 25/55] bump up golang version to v1.24.3 (#21993) * bump up golang version to v1.24.3 Signed-off-by: wang yan * bump mockery version to support golang v2.14 Signed-off-by: wang yan --------- Signed-off-by: wang yan --- CONTRIBUTING.md | 1 + Makefile | 4 ++-- .../replication/flow/mock_adapter_factory_test.go | 2 +- src/controller/replication/flow/mock_adapter_test.go | 2 +- src/controller/replication/mock_flow_controller_test.go | 2 +- src/go.mod | 2 +- src/jobservice/mgt/mock_manager.go | 2 +- src/jobservice/period/mock_scheduler.go | 2 +- src/lib/cache/mock_cache_test.go | 2 +- src/lib/orm/error_test.go | 6 +++--- src/pkg/scheduler/mock_dao_test.go | 2 +- src/pkg/task/mock_execution_dao_test.go | 2 +- src/pkg/task/mock_jobservice_client_test.go | 2 +- src/pkg/task/mock_sweep_manager_test.go | 2 +- src/pkg/task/mock_task_dao_test.go | 2 +- src/pkg/task/mock_task_manager_test.go | 2 +- src/testing/common/security/context.go | 2 +- src/testing/controller/artifact/controller.go | 2 +- src/testing/controller/blob/controller.go | 2 +- src/testing/controller/config/controller.go | 2 +- src/testing/controller/jobservice/scheduler_controller.go | 2 +- src/testing/controller/project/controller.go | 2 +- src/testing/controller/proxy/remote_interface.go | 2 +- src/testing/controller/purge/controller.go | 2 +- src/testing/controller/quota/controller.go | 2 +- src/testing/controller/replication/controller.go | 2 +- src/testing/controller/repository/controller.go | 2 +- src/testing/controller/retention/controller.go | 2 +- src/testing/controller/robot/controller.go | 2 +- src/testing/controller/scan/checker.go | 2 +- src/testing/controller/scan/controller.go | 2 +- src/testing/controller/scandataexport/controller.go | 2 +- src/testing/controller/scanner/controller.go | 2 +- src/testing/controller/securityhub/controller.go | 2 +- src/testing/controller/systemartifact/controller.go | 2 +- src/testing/controller/task/controller.go | 2 +- src/testing/controller/task/execution_controller.go | 2 +- src/testing/controller/user/controller.go | 2 +- src/testing/controller/webhook/controller.go | 2 +- src/testing/lib/cache/cache.go | 2 +- src/testing/lib/cache/iterator.go | 2 +- src/testing/lib/config/manager.go | 2 +- src/testing/lib/orm/creator.go | 2 +- src/testing/pkg/accessory/dao/dao.go | 2 +- src/testing/pkg/accessory/manager.go | 2 +- src/testing/pkg/accessory/model/accessory.go | 2 +- src/testing/pkg/allowlist/dao/dao.go | 2 +- src/testing/pkg/allowlist/manager.go | 2 +- src/testing/pkg/artifact/manager.go | 2 +- src/testing/pkg/artifactrash/manager.go | 2 +- src/testing/pkg/audit/dao/dao.go | 2 +- src/testing/pkg/audit/manager.go | 2 +- src/testing/pkg/auditext/dao/dao.go | 2 +- src/testing/pkg/auditext/manager.go | 2 +- src/testing/pkg/blob/manager.go | 2 +- src/testing/pkg/cached/manifest/redis/cached_manager.go | 2 +- src/testing/pkg/chart/operator.go | 2 +- src/testing/pkg/distribution/manifest.go | 2 +- src/testing/pkg/immutable/dao/dao.go | 2 +- src/testing/pkg/immutable/matcher.go | 2 +- src/testing/pkg/joblog/dao/dao.go | 2 +- src/testing/pkg/joblog/manager.go | 2 +- src/testing/pkg/jobmonitor/job_service_monitor_client.go | 2 +- src/testing/pkg/jobmonitor/pool_manager.go | 2 +- src/testing/pkg/jobmonitor/queue_manager.go | 2 +- src/testing/pkg/jobmonitor/redis_client.go | 2 +- src/testing/pkg/jobmonitor/worker_manager.go | 2 +- src/testing/pkg/label/dao/dao.go | 2 +- src/testing/pkg/label/manager.go | 2 +- src/testing/pkg/ldap/manager.go | 2 +- src/testing/pkg/member/fake_member_manager.go | 2 +- src/testing/pkg/notification/policy/dao/dao.go | 2 +- src/testing/pkg/notification/policy/manager.go | 2 +- src/testing/pkg/oidc/dao/meta_dao.go | 2 +- src/testing/pkg/oidc/meta_manager.go | 2 +- src/testing/pkg/p2p/preheat/instance/manager.go | 2 +- src/testing/pkg/p2p/preheat/policy/manager.go | 2 +- src/testing/pkg/parser/parser.go | 2 +- src/testing/pkg/processor/processor.go | 2 +- src/testing/pkg/project/manager.go | 2 +- src/testing/pkg/project/metadata/manager.go | 2 +- src/testing/pkg/queuestatus/manager.go | 2 +- src/testing/pkg/quota/driver/driver.go | 2 +- src/testing/pkg/quota/manager.go | 2 +- src/testing/pkg/rbac/dao/dao.go | 2 +- src/testing/pkg/rbac/manager.go | 2 +- src/testing/pkg/reg/adapter/adapter.go | 2 +- src/testing/pkg/reg/dao/dao.go | 2 +- src/testing/pkg/reg/manager.go | 2 +- src/testing/pkg/registry/fake_registry_client.go | 2 +- src/testing/pkg/replication/dao/dao.go | 2 +- src/testing/pkg/replication/manager.go | 2 +- src/testing/pkg/repository/dao/dao.go | 2 +- src/testing/pkg/repository/manager.go | 2 +- src/testing/pkg/robot/dao/dao.go | 2 +- src/testing/pkg/robot/manager.go | 2 +- src/testing/pkg/scan/export/artifact_digest_calculator.go | 2 +- src/testing/pkg/scan/export/filter_processor.go | 2 +- src/testing/pkg/scan/export/manager.go | 2 +- src/testing/pkg/scan/handler.go | 2 +- .../pkg/scan/postprocessors/native_scan_report_converter.go | 2 +- src/testing/pkg/scan/report/manager.go | 2 +- src/testing/pkg/scan/rest/v1/client.go | 2 +- src/testing/pkg/scan/rest/v1/client_pool.go | 2 +- src/testing/pkg/scan/rest/v1/request_resolver.go | 2 +- src/testing/pkg/scan/rest/v1/response_handler.go | 2 +- src/testing/pkg/scan/sbom/manager.go | 2 +- src/testing/pkg/scan/scanner/manager.go | 2 +- src/testing/pkg/scheduler/scheduler.go | 2 +- src/testing/pkg/securityhub/manager.go | 2 +- src/testing/pkg/systemartifact/cleanup/selector.go | 2 +- src/testing/pkg/systemartifact/dao/dao.go | 2 +- src/testing/pkg/systemartifact/manager.go | 2 +- src/testing/pkg/tag/manager.go | 2 +- src/testing/pkg/task/execution_manager.go | 2 +- src/testing/pkg/task/manager.go | 2 +- src/testing/pkg/user/dao/dao.go | 2 +- src/testing/pkg/user/manager.go | 2 +- src/testing/pkg/usergroup/fake_usergroup_manager.go | 2 +- src/testing/registryctl/client.go | 2 +- tests/ci/distro_installer.sh | 4 ++-- 121 files changed, 125 insertions(+), 124 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6af3019b582..4b765558294 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -168,6 +168,7 @@ Harbor backend is written in [Go](http://golang.org/). If you don't have a Harbo | 2.11 | 1.22.3 | | 2.12 | 1.23.2 | | 2.13 | 1.23.8 | +| 2.14 | 1.24.3 | Ensure your GOPATH and PATH have been configured in accordance with the Go environment instructions. diff --git a/Makefile b/Makefile index 7c8bbcd79bf..a0b17eaae93 100644 --- a/Makefile +++ b/Makefile @@ -145,7 +145,7 @@ GOINSTALL=$(GOCMD) install GOTEST=$(GOCMD) test GODEP=$(GOTEST) -i GOFMT=gofmt -w -GOBUILDIMAGE=golang:1.23.8 +GOBUILDIMAGE=golang:1.24.3 GOBUILDPATHINCONTAINER=/harbor # go build @@ -316,7 +316,7 @@ gen_apis: MOCKERY_IMAGENAME=$(IMAGENAMESPACE)/mockery -MOCKERY_VERSION=v2.51.0 +MOCKERY_VERSION=v2.53.3 MOCKERY=$(RUNCONTAINER)/src ${MOCKERY_IMAGENAME}:${MOCKERY_VERSION} MOCKERY_IMAGE_BUILD_CMD=${DOCKERBUILD} -f ${TOOLSPATH}/mockery/Dockerfile --build-arg GOLANG=${GOBUILDIMAGE} --build-arg MOCKERY_VERSION=${MOCKERY_VERSION} -t ${MOCKERY_IMAGENAME}:$(MOCKERY_VERSION) . diff --git a/src/controller/replication/flow/mock_adapter_factory_test.go b/src/controller/replication/flow/mock_adapter_factory_test.go index fb8a6bfac3a..748d144047f 100644 --- a/src/controller/replication/flow/mock_adapter_factory_test.go +++ b/src/controller/replication/flow/mock_adapter_factory_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package flow diff --git a/src/controller/replication/flow/mock_adapter_test.go b/src/controller/replication/flow/mock_adapter_test.go index c619fec6010..cf070870373 100644 --- a/src/controller/replication/flow/mock_adapter_test.go +++ b/src/controller/replication/flow/mock_adapter_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package flow diff --git a/src/controller/replication/mock_flow_controller_test.go b/src/controller/replication/mock_flow_controller_test.go index c3c0b865272..bdf549a4535 100644 --- a/src/controller/replication/mock_flow_controller_test.go +++ b/src/controller/replication/mock_flow_controller_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package replication diff --git a/src/go.mod b/src/go.mod index f6adc39cf21..3e39ebf7084 100644 --- a/src/go.mod +++ b/src/go.mod @@ -1,6 +1,6 @@ module github.com/goharbor/harbor/src -go 1.23.8 +go 1.24.3 require ( github.com/CloudNativeAI/model-spec v0.0.3 diff --git a/src/jobservice/mgt/mock_manager.go b/src/jobservice/mgt/mock_manager.go index c8834f44d24..13774e57bf5 100644 --- a/src/jobservice/mgt/mock_manager.go +++ b/src/jobservice/mgt/mock_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package mgt diff --git a/src/jobservice/period/mock_scheduler.go b/src/jobservice/period/mock_scheduler.go index 4452ae43896..990c03d2313 100644 --- a/src/jobservice/period/mock_scheduler.go +++ b/src/jobservice/period/mock_scheduler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package period diff --git a/src/lib/cache/mock_cache_test.go b/src/lib/cache/mock_cache_test.go index 0d81418841e..32be255f6d4 100644 --- a/src/lib/cache/mock_cache_test.go +++ b/src/lib/cache/mock_cache_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cache diff --git a/src/lib/orm/error_test.go b/src/lib/orm/error_test.go index 826678ccf1d..17e274263ec 100644 --- a/src/lib/orm/error_test.go +++ b/src/lib/orm/error_test.go @@ -36,7 +36,7 @@ func TestIsNotFoundError(t *testing.T) { // pass message := "message" - err = AsNotFoundError(orm.ErrNoRows, message) + err = AsNotFoundError(orm.ErrNoRows, "%s", "message") require.NotNil(t, err) assert.Equal(t, errors.NotFoundCode, err.Code) assert.Equal(t, message, err.Message) @@ -55,7 +55,7 @@ func TestIsConflictError(t *testing.T) { message := "message" err = AsConflictError(&pgconn.PgError{ Code: "23505", - }, message) + }, "%s", message) require.NotNil(t, err) assert.Equal(t, errors.ConflictCode, err.Code) assert.Equal(t, message, err.Message) @@ -74,7 +74,7 @@ func TestIsForeignKeyError(t *testing.T) { message := "message" err = AsForeignKeyError(&pgconn.PgError{ Code: "23503", - }, message) + }, "%s", message) require.NotNil(t, err) assert.Equal(t, errors.ViolateForeignKeyConstraintCode, err.Code) assert.Equal(t, message, err.Message) diff --git a/src/pkg/scheduler/mock_dao_test.go b/src/pkg/scheduler/mock_dao_test.go index 251fafd3140..4760482911a 100644 --- a/src/pkg/scheduler/mock_dao_test.go +++ b/src/pkg/scheduler/mock_dao_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scheduler diff --git a/src/pkg/task/mock_execution_dao_test.go b/src/pkg/task/mock_execution_dao_test.go index c80caec8830..438ba3e7182 100644 --- a/src/pkg/task/mock_execution_dao_test.go +++ b/src/pkg/task/mock_execution_dao_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_jobservice_client_test.go b/src/pkg/task/mock_jobservice_client_test.go index d40942ec6c5..987ac42baad 100644 --- a/src/pkg/task/mock_jobservice_client_test.go +++ b/src/pkg/task/mock_jobservice_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_sweep_manager_test.go b/src/pkg/task/mock_sweep_manager_test.go index e29ec8ae042..28b73e0aebe 100644 --- a/src/pkg/task/mock_sweep_manager_test.go +++ b/src/pkg/task/mock_sweep_manager_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_task_dao_test.go b/src/pkg/task/mock_task_dao_test.go index 6cdfcc80327..22a1cafa0c3 100644 --- a/src/pkg/task/mock_task_dao_test.go +++ b/src/pkg/task/mock_task_dao_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_task_manager_test.go b/src/pkg/task/mock_task_manager_test.go index b4bbece809c..b8534e4c977 100644 --- a/src/pkg/task/mock_task_manager_test.go +++ b/src/pkg/task/mock_task_manager_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/common/security/context.go b/src/testing/common/security/context.go index df5e7299301..668d8490762 100644 --- a/src/testing/common/security/context.go +++ b/src/testing/common/security/context.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package security diff --git a/src/testing/controller/artifact/controller.go b/src/testing/controller/artifact/controller.go index 86f0a09ef15..9d5fa154c08 100644 --- a/src/testing/controller/artifact/controller.go +++ b/src/testing/controller/artifact/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package artifact diff --git a/src/testing/controller/blob/controller.go b/src/testing/controller/blob/controller.go index 540d1e65cda..f1940e7c13b 100644 --- a/src/testing/controller/blob/controller.go +++ b/src/testing/controller/blob/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package blob diff --git a/src/testing/controller/config/controller.go b/src/testing/controller/config/controller.go index 5813385deac..0fd1097e704 100644 --- a/src/testing/controller/config/controller.go +++ b/src/testing/controller/config/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package config diff --git a/src/testing/controller/jobservice/scheduler_controller.go b/src/testing/controller/jobservice/scheduler_controller.go index beff24babda..6f62c4f169a 100644 --- a/src/testing/controller/jobservice/scheduler_controller.go +++ b/src/testing/controller/jobservice/scheduler_controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobservice diff --git a/src/testing/controller/project/controller.go b/src/testing/controller/project/controller.go index 837255d00bc..c627a82dfbb 100644 --- a/src/testing/controller/project/controller.go +++ b/src/testing/controller/project/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package project diff --git a/src/testing/controller/proxy/remote_interface.go b/src/testing/controller/proxy/remote_interface.go index bc17a9ac695..701e28702d2 100644 --- a/src/testing/controller/proxy/remote_interface.go +++ b/src/testing/controller/proxy/remote_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package proxy diff --git a/src/testing/controller/purge/controller.go b/src/testing/controller/purge/controller.go index 25d26571e8d..4f61df63203 100644 --- a/src/testing/controller/purge/controller.go +++ b/src/testing/controller/purge/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package purge diff --git a/src/testing/controller/quota/controller.go b/src/testing/controller/quota/controller.go index f2b44ec6955..537005447c8 100644 --- a/src/testing/controller/quota/controller.go +++ b/src/testing/controller/quota/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package quota diff --git a/src/testing/controller/replication/controller.go b/src/testing/controller/replication/controller.go index 74de17c3d64..0674eae0a98 100644 --- a/src/testing/controller/replication/controller.go +++ b/src/testing/controller/replication/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package replication diff --git a/src/testing/controller/repository/controller.go b/src/testing/controller/repository/controller.go index 4e40ba447bf..9c96f3daf8b 100644 --- a/src/testing/controller/repository/controller.go +++ b/src/testing/controller/repository/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package repository diff --git a/src/testing/controller/retention/controller.go b/src/testing/controller/retention/controller.go index a1126e18ff4..795c6117e7f 100644 --- a/src/testing/controller/retention/controller.go +++ b/src/testing/controller/retention/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package retention diff --git a/src/testing/controller/robot/controller.go b/src/testing/controller/robot/controller.go index e3a634b1978..0d60be33fee 100644 --- a/src/testing/controller/robot/controller.go +++ b/src/testing/controller/robot/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package robot diff --git a/src/testing/controller/scan/checker.go b/src/testing/controller/scan/checker.go index 6c2d60c8bc8..b37e9088ad3 100644 --- a/src/testing/controller/scan/checker.go +++ b/src/testing/controller/scan/checker.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scan diff --git a/src/testing/controller/scan/controller.go b/src/testing/controller/scan/controller.go index bdf1de5eb87..6c952a9dcc6 100644 --- a/src/testing/controller/scan/controller.go +++ b/src/testing/controller/scan/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scan diff --git a/src/testing/controller/scandataexport/controller.go b/src/testing/controller/scandataexport/controller.go index 8eb625af768..89003e25613 100644 --- a/src/testing/controller/scandataexport/controller.go +++ b/src/testing/controller/scandataexport/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scandataexport diff --git a/src/testing/controller/scanner/controller.go b/src/testing/controller/scanner/controller.go index e536845b66e..6fb271c89ff 100644 --- a/src/testing/controller/scanner/controller.go +++ b/src/testing/controller/scanner/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scanner diff --git a/src/testing/controller/securityhub/controller.go b/src/testing/controller/securityhub/controller.go index 1e988b1f24e..9be40ec0e09 100644 --- a/src/testing/controller/securityhub/controller.go +++ b/src/testing/controller/securityhub/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package securityhub diff --git a/src/testing/controller/systemartifact/controller.go b/src/testing/controller/systemartifact/controller.go index 7edd59c62a9..6524590c591 100644 --- a/src/testing/controller/systemartifact/controller.go +++ b/src/testing/controller/systemartifact/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package systemartifact diff --git a/src/testing/controller/task/controller.go b/src/testing/controller/task/controller.go index 800bf6a6218..2f03f83d696 100644 --- a/src/testing/controller/task/controller.go +++ b/src/testing/controller/task/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/controller/task/execution_controller.go b/src/testing/controller/task/execution_controller.go index 5e187e53e2e..b5e8297d42f 100644 --- a/src/testing/controller/task/execution_controller.go +++ b/src/testing/controller/task/execution_controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/controller/user/controller.go b/src/testing/controller/user/controller.go index 12f4253e700..d7c3e553241 100644 --- a/src/testing/controller/user/controller.go +++ b/src/testing/controller/user/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package user diff --git a/src/testing/controller/webhook/controller.go b/src/testing/controller/webhook/controller.go index 27d06e71a8c..c80428ae16c 100644 --- a/src/testing/controller/webhook/controller.go +++ b/src/testing/controller/webhook/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package webhook diff --git a/src/testing/lib/cache/cache.go b/src/testing/lib/cache/cache.go index 036b34bbc1a..bdf7e9258ca 100644 --- a/src/testing/lib/cache/cache.go +++ b/src/testing/lib/cache/cache.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cache diff --git a/src/testing/lib/cache/iterator.go b/src/testing/lib/cache/iterator.go index d25f725da5e..5c7218462cf 100644 --- a/src/testing/lib/cache/iterator.go +++ b/src/testing/lib/cache/iterator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cache diff --git a/src/testing/lib/config/manager.go b/src/testing/lib/config/manager.go index 32e853e3865..276c80f0735 100644 --- a/src/testing/lib/config/manager.go +++ b/src/testing/lib/config/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package config diff --git a/src/testing/lib/orm/creator.go b/src/testing/lib/orm/creator.go index e1d58b116d8..cfba5e8b411 100644 --- a/src/testing/lib/orm/creator.go +++ b/src/testing/lib/orm/creator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package orm diff --git a/src/testing/pkg/accessory/dao/dao.go b/src/testing/pkg/accessory/dao/dao.go index 8ebfe552430..a91fba3e75d 100644 --- a/src/testing/pkg/accessory/dao/dao.go +++ b/src/testing/pkg/accessory/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/accessory/manager.go b/src/testing/pkg/accessory/manager.go index 443cf862261..f49d3ad7331 100644 --- a/src/testing/pkg/accessory/manager.go +++ b/src/testing/pkg/accessory/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package accessory diff --git a/src/testing/pkg/accessory/model/accessory.go b/src/testing/pkg/accessory/model/accessory.go index 06bfe78f732..fb5cbd7254e 100644 --- a/src/testing/pkg/accessory/model/accessory.go +++ b/src/testing/pkg/accessory/model/accessory.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package model diff --git a/src/testing/pkg/allowlist/dao/dao.go b/src/testing/pkg/allowlist/dao/dao.go index b16693704dd..e2d92ef5bab 100644 --- a/src/testing/pkg/allowlist/dao/dao.go +++ b/src/testing/pkg/allowlist/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/allowlist/manager.go b/src/testing/pkg/allowlist/manager.go index b684b0c8dfc..452b34322ff 100644 --- a/src/testing/pkg/allowlist/manager.go +++ b/src/testing/pkg/allowlist/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package allowlist diff --git a/src/testing/pkg/artifact/manager.go b/src/testing/pkg/artifact/manager.go index 225b5b96ddc..ffcaeeb6979 100644 --- a/src/testing/pkg/artifact/manager.go +++ b/src/testing/pkg/artifact/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package artifact diff --git a/src/testing/pkg/artifactrash/manager.go b/src/testing/pkg/artifactrash/manager.go index 19dec5d5d08..fbaff20f167 100644 --- a/src/testing/pkg/artifactrash/manager.go +++ b/src/testing/pkg/artifactrash/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package artifactrash diff --git a/src/testing/pkg/audit/dao/dao.go b/src/testing/pkg/audit/dao/dao.go index d6273686cb0..02ece9f79d3 100644 --- a/src/testing/pkg/audit/dao/dao.go +++ b/src/testing/pkg/audit/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/audit/manager.go b/src/testing/pkg/audit/manager.go index 6ca666b80c0..0bd35fef0c5 100644 --- a/src/testing/pkg/audit/manager.go +++ b/src/testing/pkg/audit/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package audit diff --git a/src/testing/pkg/auditext/dao/dao.go b/src/testing/pkg/auditext/dao/dao.go index 3b98c619667..a1322606b1a 100644 --- a/src/testing/pkg/auditext/dao/dao.go +++ b/src/testing/pkg/auditext/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/auditext/manager.go b/src/testing/pkg/auditext/manager.go index de6d8c57c77..d68cda8be28 100644 --- a/src/testing/pkg/auditext/manager.go +++ b/src/testing/pkg/auditext/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package auditext diff --git a/src/testing/pkg/blob/manager.go b/src/testing/pkg/blob/manager.go index 62ad23c841e..9a2985959db 100644 --- a/src/testing/pkg/blob/manager.go +++ b/src/testing/pkg/blob/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package blob diff --git a/src/testing/pkg/cached/manifest/redis/cached_manager.go b/src/testing/pkg/cached/manifest/redis/cached_manager.go index 4cc6ae7ef5e..7405d8ff067 100644 --- a/src/testing/pkg/cached/manifest/redis/cached_manager.go +++ b/src/testing/pkg/cached/manifest/redis/cached_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package redis diff --git a/src/testing/pkg/chart/operator.go b/src/testing/pkg/chart/operator.go index 1023f50ab20..9084f3041cd 100644 --- a/src/testing/pkg/chart/operator.go +++ b/src/testing/pkg/chart/operator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package chart diff --git a/src/testing/pkg/distribution/manifest.go b/src/testing/pkg/distribution/manifest.go index 2893d4d335f..24246f2e371 100644 --- a/src/testing/pkg/distribution/manifest.go +++ b/src/testing/pkg/distribution/manifest.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package distribution diff --git a/src/testing/pkg/immutable/dao/dao.go b/src/testing/pkg/immutable/dao/dao.go index e27357a7d5d..4ee31353f2a 100644 --- a/src/testing/pkg/immutable/dao/dao.go +++ b/src/testing/pkg/immutable/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/immutable/matcher.go b/src/testing/pkg/immutable/matcher.go index a961564cffc..8e9cb260851 100644 --- a/src/testing/pkg/immutable/matcher.go +++ b/src/testing/pkg/immutable/matcher.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package immutable diff --git a/src/testing/pkg/joblog/dao/dao.go b/src/testing/pkg/joblog/dao/dao.go index 0f7f16394d0..fa02f77b8a4 100644 --- a/src/testing/pkg/joblog/dao/dao.go +++ b/src/testing/pkg/joblog/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/joblog/manager.go b/src/testing/pkg/joblog/manager.go index 0daf9f4c263..809519163f8 100644 --- a/src/testing/pkg/joblog/manager.go +++ b/src/testing/pkg/joblog/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package joblog diff --git a/src/testing/pkg/jobmonitor/job_service_monitor_client.go b/src/testing/pkg/jobmonitor/job_service_monitor_client.go index 85d810d7c2d..32d0d3d9b2e 100644 --- a/src/testing/pkg/jobmonitor/job_service_monitor_client.go +++ b/src/testing/pkg/jobmonitor/job_service_monitor_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/pool_manager.go b/src/testing/pkg/jobmonitor/pool_manager.go index 9e1fe4f9786..b546606e21d 100644 --- a/src/testing/pkg/jobmonitor/pool_manager.go +++ b/src/testing/pkg/jobmonitor/pool_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/queue_manager.go b/src/testing/pkg/jobmonitor/queue_manager.go index e7ce33a2598..16e644bccfb 100644 --- a/src/testing/pkg/jobmonitor/queue_manager.go +++ b/src/testing/pkg/jobmonitor/queue_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/redis_client.go b/src/testing/pkg/jobmonitor/redis_client.go index c5bdb97e5e7..799ccdebe4c 100644 --- a/src/testing/pkg/jobmonitor/redis_client.go +++ b/src/testing/pkg/jobmonitor/redis_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/worker_manager.go b/src/testing/pkg/jobmonitor/worker_manager.go index b26ee6ffca1..8fa5a6b53ee 100644 --- a/src/testing/pkg/jobmonitor/worker_manager.go +++ b/src/testing/pkg/jobmonitor/worker_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/label/dao/dao.go b/src/testing/pkg/label/dao/dao.go index 7f353c07812..ca5a6bda261 100644 --- a/src/testing/pkg/label/dao/dao.go +++ b/src/testing/pkg/label/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/label/manager.go b/src/testing/pkg/label/manager.go index 7063bbd2e0a..6d3164761d6 100644 --- a/src/testing/pkg/label/manager.go +++ b/src/testing/pkg/label/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package label diff --git a/src/testing/pkg/ldap/manager.go b/src/testing/pkg/ldap/manager.go index a865391e320..3670a954796 100644 --- a/src/testing/pkg/ldap/manager.go +++ b/src/testing/pkg/ldap/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package ldap diff --git a/src/testing/pkg/member/fake_member_manager.go b/src/testing/pkg/member/fake_member_manager.go index 5252c2846df..4267f2b12e5 100644 --- a/src/testing/pkg/member/fake_member_manager.go +++ b/src/testing/pkg/member/fake_member_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package member diff --git a/src/testing/pkg/notification/policy/dao/dao.go b/src/testing/pkg/notification/policy/dao/dao.go index 9d7547ca465..d5c08afca14 100644 --- a/src/testing/pkg/notification/policy/dao/dao.go +++ b/src/testing/pkg/notification/policy/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/notification/policy/manager.go b/src/testing/pkg/notification/policy/manager.go index 07c406fff1d..fdb14ce714e 100644 --- a/src/testing/pkg/notification/policy/manager.go +++ b/src/testing/pkg/notification/policy/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package policy diff --git a/src/testing/pkg/oidc/dao/meta_dao.go b/src/testing/pkg/oidc/dao/meta_dao.go index 7492532742c..8a40225af93 100644 --- a/src/testing/pkg/oidc/dao/meta_dao.go +++ b/src/testing/pkg/oidc/dao/meta_dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/oidc/meta_manager.go b/src/testing/pkg/oidc/meta_manager.go index 54668823a43..3f3c4c42959 100644 --- a/src/testing/pkg/oidc/meta_manager.go +++ b/src/testing/pkg/oidc/meta_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package oidc diff --git a/src/testing/pkg/p2p/preheat/instance/manager.go b/src/testing/pkg/p2p/preheat/instance/manager.go index 5fe05fd8042..85475cf0f47 100644 --- a/src/testing/pkg/p2p/preheat/instance/manager.go +++ b/src/testing/pkg/p2p/preheat/instance/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package instance diff --git a/src/testing/pkg/p2p/preheat/policy/manager.go b/src/testing/pkg/p2p/preheat/policy/manager.go index 4f09455f93b..adb8d65a3f4 100644 --- a/src/testing/pkg/p2p/preheat/policy/manager.go +++ b/src/testing/pkg/p2p/preheat/policy/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package policy diff --git a/src/testing/pkg/parser/parser.go b/src/testing/pkg/parser/parser.go index 785347ec3c8..24acb57f8dc 100644 --- a/src/testing/pkg/parser/parser.go +++ b/src/testing/pkg/parser/parser.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package parser diff --git a/src/testing/pkg/processor/processor.go b/src/testing/pkg/processor/processor.go index e97d1320697..e3e8bed06f4 100644 --- a/src/testing/pkg/processor/processor.go +++ b/src/testing/pkg/processor/processor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package processor diff --git a/src/testing/pkg/project/manager.go b/src/testing/pkg/project/manager.go index ab159eb6700..23fd2bc7784 100644 --- a/src/testing/pkg/project/manager.go +++ b/src/testing/pkg/project/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package project diff --git a/src/testing/pkg/project/metadata/manager.go b/src/testing/pkg/project/metadata/manager.go index f93ebbcee24..76610d37acf 100644 --- a/src/testing/pkg/project/metadata/manager.go +++ b/src/testing/pkg/project/metadata/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package metadata diff --git a/src/testing/pkg/queuestatus/manager.go b/src/testing/pkg/queuestatus/manager.go index 59a85ebc725..2ce6a77cee6 100644 --- a/src/testing/pkg/queuestatus/manager.go +++ b/src/testing/pkg/queuestatus/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package queuestatus diff --git a/src/testing/pkg/quota/driver/driver.go b/src/testing/pkg/quota/driver/driver.go index 69f459aa7be..0ac1eb57cf2 100644 --- a/src/testing/pkg/quota/driver/driver.go +++ b/src/testing/pkg/quota/driver/driver.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package driver diff --git a/src/testing/pkg/quota/manager.go b/src/testing/pkg/quota/manager.go index 37a7ae4b7a0..6053360b74a 100644 --- a/src/testing/pkg/quota/manager.go +++ b/src/testing/pkg/quota/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package quota diff --git a/src/testing/pkg/rbac/dao/dao.go b/src/testing/pkg/rbac/dao/dao.go index 7e06417d2d3..78a08b6343e 100644 --- a/src/testing/pkg/rbac/dao/dao.go +++ b/src/testing/pkg/rbac/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/rbac/manager.go b/src/testing/pkg/rbac/manager.go index 828f1190402..66567ca81db 100644 --- a/src/testing/pkg/rbac/manager.go +++ b/src/testing/pkg/rbac/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package rbac diff --git a/src/testing/pkg/reg/adapter/adapter.go b/src/testing/pkg/reg/adapter/adapter.go index b19d5524217..183c0a6d337 100644 --- a/src/testing/pkg/reg/adapter/adapter.go +++ b/src/testing/pkg/reg/adapter/adapter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package adapter diff --git a/src/testing/pkg/reg/dao/dao.go b/src/testing/pkg/reg/dao/dao.go index 9477b9c16c1..f54d624aee1 100644 --- a/src/testing/pkg/reg/dao/dao.go +++ b/src/testing/pkg/reg/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/reg/manager.go b/src/testing/pkg/reg/manager.go index 8ed3b5fd1ac..8c67490f979 100644 --- a/src/testing/pkg/reg/manager.go +++ b/src/testing/pkg/reg/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package reg diff --git a/src/testing/pkg/registry/fake_registry_client.go b/src/testing/pkg/registry/fake_registry_client.go index 9dc8c3a7c3c..577eff9da1a 100644 --- a/src/testing/pkg/registry/fake_registry_client.go +++ b/src/testing/pkg/registry/fake_registry_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package registry diff --git a/src/testing/pkg/replication/dao/dao.go b/src/testing/pkg/replication/dao/dao.go index e39d0df5546..3b0626a65fe 100644 --- a/src/testing/pkg/replication/dao/dao.go +++ b/src/testing/pkg/replication/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/replication/manager.go b/src/testing/pkg/replication/manager.go index ba3f46cff1e..0c23fb4d90b 100644 --- a/src/testing/pkg/replication/manager.go +++ b/src/testing/pkg/replication/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package replication diff --git a/src/testing/pkg/repository/dao/dao.go b/src/testing/pkg/repository/dao/dao.go index 4c8a9fcd35a..247b86bb32e 100644 --- a/src/testing/pkg/repository/dao/dao.go +++ b/src/testing/pkg/repository/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/repository/manager.go b/src/testing/pkg/repository/manager.go index fc28d1fa423..a2210831a0a 100644 --- a/src/testing/pkg/repository/manager.go +++ b/src/testing/pkg/repository/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package repository diff --git a/src/testing/pkg/robot/dao/dao.go b/src/testing/pkg/robot/dao/dao.go index c080792662d..42020586081 100644 --- a/src/testing/pkg/robot/dao/dao.go +++ b/src/testing/pkg/robot/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/robot/manager.go b/src/testing/pkg/robot/manager.go index a0f397e2bdd..549ebef192c 100644 --- a/src/testing/pkg/robot/manager.go +++ b/src/testing/pkg/robot/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package robot diff --git a/src/testing/pkg/scan/export/artifact_digest_calculator.go b/src/testing/pkg/scan/export/artifact_digest_calculator.go index 2a1afd76086..48caf88e1df 100644 --- a/src/testing/pkg/scan/export/artifact_digest_calculator.go +++ b/src/testing/pkg/scan/export/artifact_digest_calculator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package export diff --git a/src/testing/pkg/scan/export/filter_processor.go b/src/testing/pkg/scan/export/filter_processor.go index 2ea32f4becd..65862f7beb6 100644 --- a/src/testing/pkg/scan/export/filter_processor.go +++ b/src/testing/pkg/scan/export/filter_processor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package export diff --git a/src/testing/pkg/scan/export/manager.go b/src/testing/pkg/scan/export/manager.go index 32d6e1cd666..d5ac34a21b7 100644 --- a/src/testing/pkg/scan/export/manager.go +++ b/src/testing/pkg/scan/export/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package export diff --git a/src/testing/pkg/scan/handler.go b/src/testing/pkg/scan/handler.go index 9d4e0ccdae1..3854e0337c8 100644 --- a/src/testing/pkg/scan/handler.go +++ b/src/testing/pkg/scan/handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scan diff --git a/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go b/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go index 8b5e3432de1..ee13ffc8e17 100644 --- a/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go +++ b/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package postprocessors diff --git a/src/testing/pkg/scan/report/manager.go b/src/testing/pkg/scan/report/manager.go index 7c499b79f57..c7500370b7d 100644 --- a/src/testing/pkg/scan/report/manager.go +++ b/src/testing/pkg/scan/report/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package report diff --git a/src/testing/pkg/scan/rest/v1/client.go b/src/testing/pkg/scan/rest/v1/client.go index e1172b02366..bb3cc17e24f 100644 --- a/src/testing/pkg/scan/rest/v1/client.go +++ b/src/testing/pkg/scan/rest/v1/client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/rest/v1/client_pool.go b/src/testing/pkg/scan/rest/v1/client_pool.go index 37f8e572d03..b8513132862 100644 --- a/src/testing/pkg/scan/rest/v1/client_pool.go +++ b/src/testing/pkg/scan/rest/v1/client_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/rest/v1/request_resolver.go b/src/testing/pkg/scan/rest/v1/request_resolver.go index 932f447abdf..a4cd95bba3b 100644 --- a/src/testing/pkg/scan/rest/v1/request_resolver.go +++ b/src/testing/pkg/scan/rest/v1/request_resolver.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/rest/v1/response_handler.go b/src/testing/pkg/scan/rest/v1/response_handler.go index bdb15b2c0ac..5445cc96d07 100644 --- a/src/testing/pkg/scan/rest/v1/response_handler.go +++ b/src/testing/pkg/scan/rest/v1/response_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/sbom/manager.go b/src/testing/pkg/scan/sbom/manager.go index 1751c90a384..b156a4cdb43 100644 --- a/src/testing/pkg/scan/sbom/manager.go +++ b/src/testing/pkg/scan/sbom/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package sbom diff --git a/src/testing/pkg/scan/scanner/manager.go b/src/testing/pkg/scan/scanner/manager.go index 6d562635090..68d79f6e4cf 100644 --- a/src/testing/pkg/scan/scanner/manager.go +++ b/src/testing/pkg/scan/scanner/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scanner diff --git a/src/testing/pkg/scheduler/scheduler.go b/src/testing/pkg/scheduler/scheduler.go index 601b7face7e..d02f76ad9ea 100644 --- a/src/testing/pkg/scheduler/scheduler.go +++ b/src/testing/pkg/scheduler/scheduler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scheduler diff --git a/src/testing/pkg/securityhub/manager.go b/src/testing/pkg/securityhub/manager.go index e686cb6d144..91c11e5b864 100644 --- a/src/testing/pkg/securityhub/manager.go +++ b/src/testing/pkg/securityhub/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package securityhub diff --git a/src/testing/pkg/systemartifact/cleanup/selector.go b/src/testing/pkg/systemartifact/cleanup/selector.go index 2027a222d9a..44dc06c2627 100644 --- a/src/testing/pkg/systemartifact/cleanup/selector.go +++ b/src/testing/pkg/systemartifact/cleanup/selector.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cleanup diff --git a/src/testing/pkg/systemartifact/dao/dao.go b/src/testing/pkg/systemartifact/dao/dao.go index 43480e3b59a..13a2d62d351 100644 --- a/src/testing/pkg/systemartifact/dao/dao.go +++ b/src/testing/pkg/systemartifact/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/systemartifact/manager.go b/src/testing/pkg/systemartifact/manager.go index f5e014f7154..e8e6e499632 100644 --- a/src/testing/pkg/systemartifact/manager.go +++ b/src/testing/pkg/systemartifact/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package systemartifact diff --git a/src/testing/pkg/tag/manager.go b/src/testing/pkg/tag/manager.go index e5acff10414..518725e1e42 100644 --- a/src/testing/pkg/tag/manager.go +++ b/src/testing/pkg/tag/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package tag diff --git a/src/testing/pkg/task/execution_manager.go b/src/testing/pkg/task/execution_manager.go index 4c28f9eb183..524eab54ca7 100644 --- a/src/testing/pkg/task/execution_manager.go +++ b/src/testing/pkg/task/execution_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/pkg/task/manager.go b/src/testing/pkg/task/manager.go index 2de7636ed18..506ecce8bff 100644 --- a/src/testing/pkg/task/manager.go +++ b/src/testing/pkg/task/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/pkg/user/dao/dao.go b/src/testing/pkg/user/dao/dao.go index 10304cdf307..c40af3c2ccf 100644 --- a/src/testing/pkg/user/dao/dao.go +++ b/src/testing/pkg/user/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/user/manager.go b/src/testing/pkg/user/manager.go index 8f0826b8f57..4d3228dcc59 100644 --- a/src/testing/pkg/user/manager.go +++ b/src/testing/pkg/user/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package user diff --git a/src/testing/pkg/usergroup/fake_usergroup_manager.go b/src/testing/pkg/usergroup/fake_usergroup_manager.go index 40439bb6dab..2ab429d469a 100644 --- a/src/testing/pkg/usergroup/fake_usergroup_manager.go +++ b/src/testing/pkg/usergroup/fake_usergroup_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package usergroup diff --git a/src/testing/registryctl/client.go b/src/testing/registryctl/client.go index eda6ed061a9..9b1284236d6 100644 --- a/src/testing/registryctl/client.go +++ b/src/testing/registryctl/client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package registryctl diff --git a/tests/ci/distro_installer.sh b/tests/ci/distro_installer.sh index f416fb40223..d93a8fe33b3 100755 --- a/tests/ci/distro_installer.sh +++ b/tests/ci/distro_installer.sh @@ -3,5 +3,5 @@ set -x set -e -sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false -sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.24.3 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.24.3 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false From 3df34c57350fe9fb6a0fc145fc7f265dc9c2c971 Mon Sep 17 00:00:00 2001 From: miner Date: Tue, 13 May 2025 19:45:09 +0800 Subject: [PATCH 26/55] increase docker client timeout for robot case (#21994) * increase docker client timeout for robot case Signed-off-by: my036811 Signed-off-by: miner --- tests/apitests/python/library/docker_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/apitests/python/library/docker_api.py b/tests/apitests/python/library/docker_api.py index e18b18173e7..0f36a6c7fc5 100644 --- a/tests/apitests/python/library/docker_api.py +++ b/tests/apitests/python/library/docker_api.py @@ -92,7 +92,8 @@ def list_image_tags(harbor_host, repository, username, password, n = None, last class DockerAPI(object): def __init__(self): - self.DCLIENT = docker.APIClient(base_url='unix://var/run/docker.sock',version='auto',timeout=30) + # The 120-second timeout is set to support robot test cases that may require extended durations. + self.DCLIENT = docker.APIClient(base_url='unix://var/run/docker.sock',version='auto',timeout=120) self.DCLIENT2 = docker.from_env() def docker_login(self, registry, username, password, expected_error_message = None): From 424cdd882811d97ed857a3432e6b2539d96160b4 Mon Sep 17 00:00:00 2001 From: Mile Druzijanic <153705375+miledxz@users.noreply.github.com> Date: Thu, 15 May 2025 08:28:49 +0200 Subject: [PATCH 27/55] Test update for adding nil value to list (#21990) test list update Signed-off-by: miledxz Co-authored-by: Wang Yan --- src/jobservice/common/list/list_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/jobservice/common/list/list_test.go b/src/jobservice/common/list/list_test.go index ee13f52165a..5d1b7940cb5 100644 --- a/src/jobservice/common/list/list_test.go +++ b/src/jobservice/common/list/list_test.go @@ -55,3 +55,9 @@ func (suite *ListSuite) TestIterate() { suite.Equal(3, suite.l.l.Len()) } + +func (suite *ListSuite) TestPushNil() { + initialLen := suite.l.l.Len() + suite.l.Push(nil) + suite.Equal(initialLen, suite.l.l.Len(), "pushing nil should not increase the length") +} From 2faff8e6af98730c32d5f82f1dcdece472ac73f4 Mon Sep 17 00:00:00 2001 From: Wang Yan Date: Fri, 16 May 2025 18:23:32 +0800 Subject: [PATCH 28/55] udpate storage to s3 (#21999) move the build storage from google storage to the CNCF S3 storage Currently, we use the internal GCR to store all dev builds for nightly testing, development, and as candidates for RC and GA releases. However, this internal Google storage will no longer be available, this pull request it to move to the CNCF-hosted S3 storage. Signed-off-by: wang yan --- .github/workflows/build-package.yml | 12 +++++----- .github/workflows/conformance_test.yml | 15 +++++-------- .github/workflows/publish_release.yml | 14 ++++++------ tests/ci/api_run.sh | 31 +++++++++++++------------- tests/ci/build_util.sh | 3 +-- tests/integration.sh | 18 +++------------ tools/release/release_utils.sh | 4 ++-- 7 files changed, 39 insertions(+), 58 deletions(-) diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index a3b92f4890c..da95dbae67a 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -15,14 +15,12 @@ jobs: runs-on: - ubuntu-22.04 steps: - - uses: actions/checkout@v3 - - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_CREDENTIALS }}' - - uses: google-github-actions/setup-gcloud@v2 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4.1.0 with: - version: '430.0.0' - - run: gcloud info + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 - name: Set up Go 1.22 uses: actions/setup-go@v5 with: diff --git a/.github/workflows/conformance_test.yml b/.github/workflows/conformance_test.yml index db6725c2c21..1e882c78ae8 100644 --- a/.github/workflows/conformance_test.yml +++ b/.github/workflows/conformance_test.yml @@ -17,14 +17,12 @@ jobs: #- self-hosted - ubuntu-latest steps: - - uses: actions/checkout@v3 - - id: 'auth' - name: 'Authenticate to Google Cloud' - uses: google-github-actions/auth@v2 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4.1.0 with: - credentials_json: '${{ secrets.GCP_CREDENTIALS }}' - - uses: google-github-actions/setup-gcloud@v2 - - run: gcloud info + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 - name: Set up Go 1.21 uses: actions/setup-go@v5 with: @@ -65,6 +63,5 @@ jobs: - name: upload test result to gs run: | cd src/github.com/goharbor/harbor - gsutil cp ./distribution-spec/conformance/report.html gs://harbor-conformance-test/report.html - gsutil acl ch -u AllUsers:R gs://harbor-conformance-test/report.html + aws s3 cp ./distribution-spec/conformance/report.html s3://harbor-conformance-test/report.html if: always() diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 0c9f2b545a1..d2ad0ae9faf 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -19,12 +19,12 @@ jobs: echo "PRE_TAG=$(echo $release | jq -r '.body' | jq -r '.preTag')" >> $GITHUB_ENV echo "BRANCH=$(echo $release | jq -r '.target_commitish')" >> $GITHUB_ENV echo "PRERELEASE=$(echo $release | jq -r '.prerelease')" >> $GITHUB_ENV - - uses: 'google-github-actions/auth@v2' + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4.1.0 with: - credentials_json: '${{ secrets.GCP_CREDENTIALS }}' - - uses: google-github-actions/setup-gcloud@v2 - with: - version: '430.0.0' + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 - name: Prepare Assets run: | if [ ! ${{ env.BUILD_NO }} -o ${{ env.BUILD_NO }} = "null" ] @@ -39,8 +39,8 @@ jobs: src_online_package=harbor-online-installer-${{ env.BASE_TAG }}-${{ env.BUILD_NO }}.tgz dst_offline_package=harbor-offline-installer-${{ env.CUR_TAG }}.tgz dst_online_package=harbor-online-installer-${{ env.CUR_TAG }}.tgz - gsutil cp gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_offline_package} gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_offline_package} - gsutil cp gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_online_package} gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_online_package} + aws s3 cp s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_offline_package} s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_offline_package} + aws s3 cp s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_online_package} s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_online_package} assets_path=$(pwd)/assets source tools/release/release_utils.sh && getAssets ${{ secrets.HARBOR_RELEASE_BUILD }} ${{ env.BRANCH }} $dst_offline_package $dst_online_package ${{ env.PRERELEASE }} $assets_path diff --git a/tests/ci/api_run.sh b/tests/ci/api_run.sh index 83f60ffd8bd..b348ea2ac6d 100755 --- a/tests/ci/api_run.sh +++ b/tests/ci/api_run.sh @@ -3,7 +3,7 @@ set -x #source gskey.sh -sudo gsutil version -l +sudo aws --version harbor_logs_bucket="harbor-ci-logs" @@ -12,8 +12,7 @@ E2E_IMAGE="goharbor/harbor-e2e-engine:latest-api" # GS util function uploader { - sudo gsutil cp $1 gs://$2/$1 - sudo gsutil acl ch -u AllUsers:R gs://$2/$1 + sudo aws s3 cp $1 s3://$2/$1 } set +e @@ -38,18 +37,18 @@ else fi rc=$? ## --------------------------------------------- Upload Harbor CI Logs ------------------------------------------- -timestamp=$(date +%s) -GIT_COMMIT=$(git rev-parse --short "$GITHUB_SHA") -outfile="integration_logs_$timestamp$GIT_COMMIT.tar.gz" -sudo tar -zcvf $outfile output.xml log.html /var/log/harbor/* -if [ -f "$outfile" ]; then - uploader $outfile $harbor_logs_bucket - echo "----------------------------------------------" - echo "Download test logs:" - echo "https://storage.googleapis.com/harbor-ci-logs/$outfile" - echo "----------------------------------------------" -else - echo "No log output file to upload" -fi +#timestamp=$(date +%s) +#GIT_COMMIT=$(git rev-parse --short "$GITHUB_SHA") +#outfile="integration_logs_$timestamp$GIT_COMMIT.tar.gz" +#sudo tar -zcvf $outfile output.xml log.html /var/log/harbor/* +#if [ -f "$outfile" ]; then +# uploader $outfile $harbor_logs_bucket +# echo "----------------------------------------------" +# echo "Download test logs:" +# echo "https://storage.googleapis.com/harbor-ci-logs/$outfile" +# echo "----------------------------------------------" +#else +# echo "No log output file to upload" +#fi exit $rc diff --git a/tests/ci/build_util.sh b/tests/ci/build_util.sh index 4d5a521f09a..27585cdc646 100644 --- a/tests/ci/build_util.sh +++ b/tests/ci/build_util.sh @@ -4,8 +4,7 @@ set -x set -e function uploader { - gsutil cp $1 gs://$2/$1 - gsutil -D setacl public-read gs://$2/$1 &> /dev/null + aws s3 cp $1 s3://$2/$1 } function publishImage { diff --git a/tests/integration.sh b/tests/integration.sh index 4a608f01c83..1eb69f82bee 100755 --- a/tests/integration.sh +++ b/tests/integration.sh @@ -14,7 +14,7 @@ # limitations under the License. # set -x -gsutil version -l +aws --version set +x docker-compose version @@ -58,17 +58,6 @@ else harbor_target_bucket=$harbor_releases_bucket/$DRONE_BRANCH fi -# GC credentials -keyfile="/root/harbor-ci-logs.key" -botofile="/root/.boto" -echo -n $GS_PRIVATE_KEY > $keyfile -chmod 400 $keyfile -echo "[Credentials]" >> $botofile -echo "gs_service_key_file = $keyfile" >> $botofile -echo "gs_service_client_id = $GS_CLIENT_EMAIL" >> $botofile -echo "[GSUtil]" >> $botofile -echo "content_language = en" >> $botofile -echo "default_project_id = $GS_PROJECT_ID" >> $botofile container_ip=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` echo $container_ip @@ -106,10 +95,9 @@ echo "Harbor Assets version: $Harbor_Assets_Version" echo "Harbor Build Base tag: $Harbor_Build_Base_Tag" echo "--------------------------------------------------" -# GS util +# AWS S3 util function uploader { - gsutil cp $1 gs://$2/$1 - gsutil -D setacl public-read gs://$2/$1 &> /dev/null + aws s3 cp $1 s3://$2/$1 } function package_installer { diff --git a/tools/release/release_utils.sh b/tools/release/release_utils.sh index 637e57579f4..3aa15399f32 100644 --- a/tools/release/release_utils.sh +++ b/tools/release/release_utils.sh @@ -9,12 +9,12 @@ function getAssets { local prerelease=$5 local assetsPath=$6 mkdir $assetsPath && pushd $assetsPath - gsutil cp gs://$bucket/$branch/$offlinePackage . + aws s3 cp s3://$bucket/$branch/$offlinePackage . md5sum $offlinePackage > md5sum # Pre-release does not handle online installer packages if [ $prerelease = "false" ] then - gsutil cp gs://$bucket/$branch/$onlinePackage . + aws s3 cp s3://$bucket/$branch/$onlinePackage . md5sum $onlinePackage >> md5sum fi popd From 6f856cd6b10d6f79a4b0a16c3bddd606780880c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 13:56:35 +0800 Subject: [PATCH 29/55] chore(deps): bump aws-actions/configure-aws-credentials from 4.1.0 to 4.2.1 (#22003) chore(deps): bump aws-actions/configure-aws-credentials Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 4.1.0 to 4.2.1. - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/v4.1.0...v4.2.1) --- updated-dependencies: - dependency-name: aws-actions/configure-aws-credentials dependency-version: 4.2.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-package.yml | 2 +- .github/workflows/conformance_test.yml | 2 +- .github/workflows/publish_release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index da95dbae67a..9091965e81b 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -16,7 +16,7 @@ jobs: - ubuntu-22.04 steps: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4.1.0 + uses: aws-actions/configure-aws-credentials@v4.2.1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/conformance_test.yml b/.github/workflows/conformance_test.yml index 1e882c78ae8..7923fc19111 100644 --- a/.github/workflows/conformance_test.yml +++ b/.github/workflows/conformance_test.yml @@ -18,7 +18,7 @@ jobs: - ubuntu-latest steps: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4.1.0 + uses: aws-actions/configure-aws-credentials@v4.2.1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index d2ad0ae9faf..8967322ea44 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -20,7 +20,7 @@ jobs: echo "BRANCH=$(echo $release | jq -r '.target_commitish')" >> $GITHUB_ENV echo "PRERELEASE=$(echo $release | jq -r '.prerelease')" >> $GITHUB_ENV - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4.1.0 + uses: aws-actions/configure-aws-credentials@v4.2.1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} From 111fc1c03eb361ec1f6c8bf384449891fa304ded Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 06:39:52 +0000 Subject: [PATCH 30/55] chore(deps): bump github.com/aliyun/alibaba-cloud-sdk-go from 1.63.84 to 1.63.107 in /src (#21943) chore(deps): bump github.com/aliyun/alibaba-cloud-sdk-go in /src Bumps [github.com/aliyun/alibaba-cloud-sdk-go](https://github.com/aliyun/alibaba-cloud-sdk-go) from 1.63.84 to 1.63.107. - [Release notes](https://github.com/aliyun/alibaba-cloud-sdk-go/releases) - [Changelog](https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/ChangeLog.txt) - [Commits](https://github.com/aliyun/alibaba-cloud-sdk-go/compare/v1.63.84...v1.63.107) --- updated-dependencies: - dependency-name: github.com/aliyun/alibaba-cloud-sdk-go dependency-version: 1.63.107 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Orlix <7236111+OrlinVasilev@users.noreply.github.com> --- src/go.mod | 8 ++++---- src/go.sum | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/go.mod b/src/go.mod index 3e39ebf7084..a7199e35605 100644 --- a/src/go.mod +++ b/src/go.mod @@ -6,7 +6,7 @@ require ( github.com/CloudNativeAI/model-spec v0.0.3 github.com/FZambia/sentinel v1.1.0 github.com/Masterminds/semver v1.5.0 - github.com/aliyun/alibaba-cloud-sdk-go v1.63.84 + github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/aws/aws-sdk-go v1.55.6 github.com/beego/beego/v2 v2.3.6 @@ -22,12 +22,12 @@ require ( github.com/go-asn1-ber/asn1-ber v1.5.7 github.com/go-ldap/ldap/v3 v3.4.10 github.com/go-openapi/errors v0.22.0 - github.com/go-openapi/loads v0.22.0 + github.com/go-openapi/loads v0.22.0 // indirect github.com/go-openapi/runtime v0.28.0 - github.com/go-openapi/spec v0.21.0 + github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/strfmt v0.23.0 github.com/go-openapi/swag v0.23.0 - github.com/go-openapi/validate v0.24.0 + github.com/go-openapi/validate v0.24.0 // indirect github.com/go-redis/redis/v8 v8.11.4 github.com/gocarina/gocsv v0.0.0-20210516172204-ca9e8a8ddea8 github.com/gocraft/work v0.5.1 diff --git a/src/go.sum b/src/go.sum index 3834e7601f4..b93c6319480 100644 --- a/src/go.sum +++ b/src/go.sum @@ -61,8 +61,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.84 h1:8IpC2i1mtsuUt13cbZtVCtQRSjzuMvLiDrbOJcaS+Z4= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.84/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 h1:qagvUyrgOnBIlVRQWOyCZGVKUIYbMBdGdJ104vBpRFU= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.107/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= From a546f99974fdddc2da8d3f61b0c48960d6da6c8d Mon Sep 17 00:00:00 2001 From: Jim Chen Date: Tue, 27 May 2025 16:18:58 +0800 Subject: [PATCH 31/55] feat: add rate limiter for alibaba cloud acr adapter (#21953) Signed-off-by: njucjc --- .../rate_limiter_transport.go} | 17 ++----- src/lib/rate_limiter_transport_test.go | 45 +++++++++++++++++++ src/pkg/reg/adapter/aliacr/adapter.go | 18 +++++++- src/pkg/reg/adapter/aliacr/openapi.go | 23 ++++++++-- src/pkg/reg/adapter/tencentcr/adapter.go | 14 +++--- .../adapter/tencentcr/artifact_registry.go | 2 +- .../reg/adapter/tencentcr/ratelimiter_test.go | 31 ------------- 7 files changed, 91 insertions(+), 59 deletions(-) rename src/{pkg/reg/adapter/tencentcr/ratelimiter.go => lib/rate_limiter_transport.go} (76%) create mode 100644 src/lib/rate_limiter_transport_test.go delete mode 100644 src/pkg/reg/adapter/tencentcr/ratelimiter_test.go diff --git a/src/pkg/reg/adapter/tencentcr/ratelimiter.go b/src/lib/rate_limiter_transport.go similarity index 76% rename from src/pkg/reg/adapter/tencentcr/ratelimiter.go rename to src/lib/rate_limiter_transport.go index 23e35ddfae0..adb454e709d 100644 --- a/src/pkg/reg/adapter/tencentcr/ratelimiter.go +++ b/src/lib/rate_limiter_transport.go @@ -12,11 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tencentcr +package lib import ( "net/http" - "sync" "go.uber.org/ratelimit" ) @@ -33,19 +32,9 @@ func (t limitTransport) RoundTrip(req *http.Request) (*http.Response, error) { return t.RoundTripper.RoundTrip(req) } -var limiterOnce sync.Once -var limiter ratelimit.Limiter - -func newLimiter(rate int) ratelimit.Limiter { - limiterOnce.Do(func() { - limiter = ratelimit.New(rate) - }) - return limiter -} - -func newRateLimitedTransport(rate int, transport http.RoundTripper) http.RoundTripper { +func NewRateLimitedTransport(rate int, transport http.RoundTripper) http.RoundTripper { return &limitTransport{ RoundTripper: transport, - limiter: newLimiter(rate), + limiter: ratelimit.New(rate), } } diff --git a/src/lib/rate_limiter_transport_test.go b/src/lib/rate_limiter_transport_test.go new file mode 100644 index 00000000000..386ff4500ed --- /dev/null +++ b/src/lib/rate_limiter_transport_test.go @@ -0,0 +1,45 @@ +// Copyright Project Harbor Authors +// +// 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. + +package lib + +import ( + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func Test_newRateLimitedTransport(t *testing.T) { + tests := []struct { + name string + rate int + transport http.RoundTripper + }{ + {"1qps", 1, http.DefaultTransport}, + } + var req = &http.Request{} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewRateLimitedTransport(tt.rate, tt.transport) + start := time.Now() + for i := 0; i <= tt.rate; i++ { + got.RoundTrip(req) + } + used := int64(time.Since(start).Milliseconds()) / int64(tt.rate) + assert.GreaterOrEqualf(t, used/int64(tt.rate), int64(1e3/tt.rate), "used %d ms per req", used/int64(tt.rate)) + }) + } +} diff --git a/src/pkg/reg/adapter/aliacr/adapter.go b/src/pkg/reg/adapter/aliacr/adapter.go index 94e366de986..7ed17b84972 100644 --- a/src/pkg/reg/adapter/aliacr/adapter.go +++ b/src/pkg/reg/adapter/aliacr/adapter.go @@ -17,12 +17,16 @@ package aliacr import ( "errors" "fmt" + "net/http" + "os" "path/filepath" "regexp" + "strconv" "strings" commonhttp "github.com/goharbor/harbor/src/common/http" "github.com/goharbor/harbor/src/common/utils" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/log" adp "github.com/goharbor/harbor/src/pkg/reg/adapter" "github.com/goharbor/harbor/src/pkg/reg/adapter/native" @@ -32,7 +36,17 @@ import ( "github.com/goharbor/harbor/src/pkg/registry/auth/bearer" ) +var rateLimiterTransport http.RoundTripper + +const acrQPSLimit = 15 + func init() { + var envAcrQPSLimit, _ = strconv.Atoi(os.Getenv("REG_ADAPTER_ACR_QPS_LIMIT")) + if envAcrQPSLimit > acrQPSLimit || envAcrQPSLimit < 1 { + envAcrQPSLimit = acrQPSLimit + } + rateLimiterTransport = lib.NewRateLimitedTransport(envAcrQPSLimit, commonhttp.NewTransport()) + if err := adp.RegisterFactory(model.RegistryTypeAliAcr, new(factory)); err != nil { log.Errorf("failed to register factory for %s: %v", model.RegistryTypeAliAcr, err) return @@ -101,12 +115,12 @@ func newAdapter(registry *model.Registry) (*adapter, error) { var acrAPI openapi if !info.IsACREE { - acrAPI, err = newAcrOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID) + acrAPI, err = newAcrOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID, rateLimiterTransport) if err != nil { return nil, err } } else { - acrAPI, err = newAcreeOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID, info.InstanceID) + acrAPI, err = newAcreeOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID, info.InstanceID, rateLimiterTransport) if err != nil { return nil, err } diff --git a/src/pkg/reg/adapter/aliacr/openapi.go b/src/pkg/reg/adapter/aliacr/openapi.go index 4a46c8fa087..3599d992581 100644 --- a/src/pkg/reg/adapter/aliacr/openapi.go +++ b/src/pkg/reg/adapter/aliacr/openapi.go @@ -17,12 +17,17 @@ package aliacr import ( "encoding/json" "fmt" + "net/http" "strconv" "time" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cr" "github.com/aliyun/alibaba-cloud-sdk-go/services/cr_ee" + + "github.com/goharbor/harbor/src/pkg/registry" ) type repository struct { @@ -57,8 +62,13 @@ type acrOpenapi struct { var _ openapi = &acrOpenapi{} // newAcrOpenapi creates a new acrOpenapi instance. -func newAcrOpenapi(accessKeyID string, accessKeySecret string, regionID string) (openapi, error) { - client, err := cr.NewClientWithAccessKey(regionID, accessKeyID, accessKeySecret) +func newAcrOpenapi(accessKeyID string, accessKeySecret string, regionID string, rateLimiter http.RoundTripper) (openapi, error) { + config := sdk.NewConfig(). + WithUserAgent(registry.UserAgent). + WithAutoRetry(true) + config.Transport = rateLimiter + + client, err := cr.NewClientWithOptions(regionID, config, credentials.NewAccessKeyCredential(accessKeyID, accessKeySecret)) if err != nil { return nil, err } @@ -182,8 +192,13 @@ type acreeOpenapi struct { var _ openapi = &acreeOpenapi{} // newAcreeOpenapi creates a new acreeOpenapi instance. -func newAcreeOpenapi(accessKeyID string, accessKeySecret string, regionID string, instanceID string) (openapi, error) { - client, err := cr_ee.NewClientWithAccessKey(regionID, accessKeyID, accessKeySecret) +func newAcreeOpenapi(accessKeyID string, accessKeySecret string, regionID string, instanceID string, rateLimiter http.RoundTripper) (openapi, error) { + config := sdk.NewConfig(). + WithUserAgent(registry.UserAgent). + WithAutoRetry(true) + config.Transport = rateLimiter + + client, err := cr_ee.NewClientWithOptions(regionID, config, credentials.NewAccessKeyCredential(accessKeyID, accessKeySecret)) if err != nil { return nil, err } diff --git a/src/pkg/reg/adapter/tencentcr/adapter.go b/src/pkg/reg/adapter/tencentcr/adapter.go index ba0207d3962..4e251f61ae7 100644 --- a/src/pkg/reg/adapter/tencentcr/adapter.go +++ b/src/pkg/reg/adapter/tencentcr/adapter.go @@ -30,6 +30,7 @@ import ( tcr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr/v20190924" commonhttp "github.com/goharbor/harbor/src/common/http" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/log" adp "github.com/goharbor/harbor/src/pkg/reg/adapter" "github.com/goharbor/harbor/src/pkg/reg/adapter/native" @@ -40,13 +41,15 @@ import ( var ( errInvalidTcrEndpoint = errors.New("[tencent-tcr.newAdapter] Invalid TCR instance endpoint") + rateLimiterTransport http.RoundTripper ) func init() { - var envTcrQPSLimit, _ = strconv.Atoi(os.Getenv("TCR_QPS_LIMIT")) - if envTcrQPSLimit > 1 && envTcrQPSLimit < tcrQPSLimit { - tcrQPSLimit = envTcrQPSLimit + var envTcrQPSLimit, _ = strconv.Atoi(os.Getenv("REG_ADAPTER_TCR_QPS_LIMIT")) + if envTcrQPSLimit > tcrQPSLimit || envTcrQPSLimit < 1 { + envTcrQPSLimit = tcrQPSLimit } + rateLimiterTransport = lib.NewRateLimitedTransport(envTcrQPSLimit, commonhttp.NewTransport()) if err := adp.RegisterFactory(model.RegistryTypeTencentTcr, new(factory)); err != nil { log.Errorf("failed to register factory for %s: %v", model.RegistryTypeTencentTcr, err) @@ -154,10 +157,7 @@ func newAdapter(registry *model.Registry) (a *adapter, err error) { client.Init(*instanceInfo.RegionName). WithCredential(tcrCredential). WithProfile(cfp). - WithHttpTransport(newRateLimitedTransport(tcrQPSLimit, http.DefaultTransport)) - if err != nil { - return - } + WithHttpTransport(rateLimiterTransport) var credential = NewAuth(instanceInfo.RegistryId, client) var transport = commonhttp.GetHTTPTransport(commonhttp.WithInsecure(registry.Insecure)) diff --git a/src/pkg/reg/adapter/tencentcr/artifact_registry.go b/src/pkg/reg/adapter/tencentcr/artifact_registry.go index 23b9e141a09..10b423b30fe 100644 --- a/src/pkg/reg/adapter/tencentcr/artifact_registry.go +++ b/src/pkg/reg/adapter/tencentcr/artifact_registry.go @@ -26,7 +26,7 @@ import ( "github.com/goharbor/harbor/src/pkg/reg/util" ) -var ( +const ( tcrQPSLimit = 10 ) diff --git a/src/pkg/reg/adapter/tencentcr/ratelimiter_test.go b/src/pkg/reg/adapter/tencentcr/ratelimiter_test.go deleted file mode 100644 index 743e6737ef8..00000000000 --- a/src/pkg/reg/adapter/tencentcr/ratelimiter_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package tencentcr - -import ( - "net/http" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func Test_newRateLimitedTransport(t *testing.T) { - tests := []struct { - name string - rate int - transport http.RoundTripper - }{ - {"1qps", 1, http.DefaultTransport}, - } - var req = &http.Request{} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got := newRateLimitedTransport(tt.rate, tt.transport) - start := time.Now() - for i := 0; i <= tt.rate; i++ { - got.RoundTrip(req) - } - used := int64(time.Since(start).Milliseconds()) / int64(tt.rate) - assert.GreaterOrEqualf(t, used/int64(tt.rate), int64(1e3/tt.rate), "used %d ms per req", used/int64(tt.rate)) - }) - } -} From 3dee318a2ef665690366c222851dc1807dddc744 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 10:54:24 +0000 Subject: [PATCH 32/55] chore(deps): bump k8s.io/client-go from 0.32.2 to 0.33.1 in /src (#22011) Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.32.2 to 0.33.1. - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes/client-go/compare/v0.32.2...v0.33.1) --- updated-dependencies: - dependency-name: k8s.io/client-go dependency-version: 0.33.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/go.mod | 14 +++++++------- src/go.sum | 31 +++++++++++++++++-------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/go.mod b/src/go.mod index a7199e35605..1ca6dc1a5e0 100644 --- a/src/go.mod +++ b/src/go.mod @@ -67,7 +67,7 @@ require ( go.pinniped.dev v0.37.0 go.uber.org/ratelimit v0.3.1 golang.org/x/crypto v0.36.0 - golang.org/x/net v0.37.0 + golang.org/x/net v0.38.0 golang.org/x/oauth2 v0.27.0 golang.org/x/sync v0.12.0 golang.org/x/text v0.23.0 @@ -75,9 +75,9 @@ require ( gopkg.in/h2non/gock.v1 v1.1.2 gopkg.in/yaml.v2 v2.4.0 helm.sh/helm/v3 v3.17.2 - k8s.io/api v0.32.2 - k8s.io/apimachinery v0.32.2 - k8s.io/client-go v0.32.2 + k8s.io/api v0.33.1 + k8s.io/apimachinery v0.33.1 + k8s.io/client-go v0.33.1 sigs.k8s.io/yaml v1.4.0 ) @@ -118,7 +118,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect @@ -186,14 +185,15 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect google.golang.org/grpc v1.69.4 // indirect - google.golang.org/protobuf v1.36.3 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect ) replace ( diff --git a/src/go.sum b/src/go.sum index b93c6319480..88b91ffc2e3 100644 --- a/src/go.sum +++ b/src/go.sum @@ -693,8 +693,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= @@ -839,8 +839,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -879,22 +879,25 @@ helm.sh/helm/v3 v3.17.2/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= -k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= -k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= -k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= -k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= From 7dcdec94e2a686b4d3608b581c92efc2b41b9ba0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 16:56:48 +0800 Subject: [PATCH 33/55] chore(deps): bump github.com/volcengine/volcengine-go-sdk from 1.0.185 to 1.1.10 in /src (#22035) chore(deps): bump github.com/volcengine/volcengine-go-sdk in /src Bumps [github.com/volcengine/volcengine-go-sdk](https://github.com/volcengine/volcengine-go-sdk) from 1.0.185 to 1.1.10. - [Release notes](https://github.com/volcengine/volcengine-go-sdk/releases) - [Commits](https://github.com/volcengine/volcengine-go-sdk/compare/v1.0.185...v1.1.10) --- updated-dependencies: - dependency-name: github.com/volcengine/volcengine-go-sdk dependency-version: 1.1.10 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/go.mod | 2 +- src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/go.mod b/src/go.mod index 1ca6dc1a5e0..6e82d3a8aef 100644 --- a/src/go.mod +++ b/src/go.mod @@ -56,7 +56,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible github.com/vmihailenco/msgpack/v5 v5.4.1 - github.com/volcengine/volcengine-go-sdk v1.0.185 + github.com/volcengine/volcengine-go-sdk v1.1.11 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.59.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 go.opentelemetry.io/otel v1.35.0 diff --git a/src/go.sum b/src/go.sum index 88b91ffc2e3..73a7b77e9d6 100644 --- a/src/go.sum +++ b/src/go.sum @@ -564,8 +564,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/volcengine/volc-sdk-golang v1.0.23 h1:anOslb2Qp6ywnsbyq9jqR0ljuO63kg9PY+4OehIk5R8= github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU= -github.com/volcengine/volcengine-go-sdk v1.0.185 h1:MIH+YgdWZhO1fNg/vxLohl8ad7hlklaf46wpaTS1TN0= -github.com/volcengine/volcengine-go-sdk v1.0.185/go.mod h1:gfEDc1s7SYaGoY+WH2dRrS3qiuDJMkwqyfXWCa7+7oA= +github.com/volcengine/volcengine-go-sdk v1.1.11 h1:TZk2klExlL1hrLp02whgKQ9UTsFjaI+srl3ItjG6ZSY= +github.com/volcengine/volcengine-go-sdk v1.1.11/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From e049fcd9850613c8804f086cab8b8ae573c3a7da Mon Sep 17 00:00:00 2001 From: Mohamed Awnallah Date: Thu, 5 Jun 2025 14:13:34 +0300 Subject: [PATCH 34/55] README.md: add artifact hub badge (#20736) In this commit, we add the artifact hub badge for the harbor project to improve their discoverability and the best practices index on [clomonitor.io](https://clomonitor.io/projects/cncf/harbor) Signed-off-by: Mohamed Awnallah Co-authored-by: Vadim Bauer --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6a8bc988490..6cfac0901d4 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![Nightly Status](https://us-central1-eminent-nation-87317.cloudfunctions.net/harbor-nightly-result)](https://www.googleapis.com/storage/v1/b/harbor-nightly/o) ![CONFORMANCE_TEST](https://github.com/goharbor/harbor/workflows/CONFORMANCE_TEST/badge.svg) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fgoharbor%2Fharbor.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fgoharbor%2Fharbor?ref=badge_shield) +[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/harbor)](https://artifacthub.io/packages/helm/harbor/harbor)
|![notification](https://raw.githubusercontent.com/goharbor/website/master/docs/img/readme/bell-outline-badged.svg)Community Meeting| From f46295aadba41932bcb89d969582bca2594b4f9f Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Sat, 7 Jun 2025 10:56:47 +0800 Subject: [PATCH 35/55] chore: fix the arguments for codecov v5 (#22050) --- .github/workflows/CI.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index a4de814af53..3dba1f98c71 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -91,7 +91,7 @@ jobs: - name: Codecov For BackEnd uses: codecov/codecov-action@v5 with: - file: ./src/github.com/goharbor/harbor/profile.cov + files: ./src/github.com/goharbor/harbor/profile.cov flags: unittests APITEST_DB: @@ -333,5 +333,5 @@ jobs: - name: Codecov For UI uses: codecov/codecov-action@v5 with: - file: ./src/github.com/goharbor/harbor/src/portal/coverage/lcov.info + files: ./src/github.com/goharbor/harbor/src/portal/coverage/lcov.info flags: unittests From 145a10a8b91ea62244bd2a25f207e82c8ac7f3fe Mon Sep 17 00:00:00 2001 From: Prasanth Baskar Date: Tue, 10 Jun 2025 12:06:06 +0530 Subject: [PATCH 36/55] Refactor: Simplify SearchAndOnBoardGroup Logic (#22058) refactor: simplify SearchAndOnBoardGroup logic Signed-off-by: bupd --- src/core/auth/authenticator.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/auth/authenticator.go b/src/core/auth/authenticator.go index 6d00d4d3d6f..7134edc69e6 100644 --- a/src/core/auth/authenticator.go +++ b/src/core/auth/authenticator.go @@ -240,10 +240,10 @@ func SearchAndOnBoardGroup(ctx context.Context, groupKey, altGroupName string) ( if userGroup == nil { return 0, ErrorGroupNotExist } - if userGroup != nil { - err = OnBoardGroup(ctx, userGroup, altGroupName) + if err := OnBoardGroup(ctx, userGroup, altGroupName); err != nil { + return 0, err } - return userGroup.ID, err + return userGroup.ID, nil } // PostAuthenticate - From 780a2171227b312776272f021bc555167c8595a2 Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Thu, 12 Jun 2025 15:35:56 +0800 Subject: [PATCH 37/55] Remove document link from Image Scanner (#22064) fixes #22001 Signed-off-by: stonezdj --- .../scanner/config-scanner.component.html | 11 ----------- .../scanner/config-scanner.component.ts | 3 +-- .../interrogation-services/scanner/scanner.ts | 3 --- .../app-level-alerts/app-level-alerts.component.ts | 2 -- src/portal/src/i18n/lang/de-de-lang.json | 1 - src/portal/src/i18n/lang/en-us-lang.json | 1 - src/portal/src/i18n/lang/es-es-lang.json | 1 - src/portal/src/i18n/lang/fr-fr-lang.json | 1 - src/portal/src/i18n/lang/ko-kr-lang.json | 1 - src/portal/src/i18n/lang/pt-br-lang.json | 1 - src/portal/src/i18n/lang/tr-tr-lang.json | 1 - src/portal/src/i18n/lang/zh-cn-lang.json | 1 - src/portal/src/i18n/lang/zh-tw-lang.json | 1 - 13 files changed, 1 insertion(+), 27 deletions(-) diff --git a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html index d5b243a6eef..091aa9754f8 100644 --- a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html @@ -2,17 +2,6 @@

{{ 'SCANNER.IMAGE_SCANNERS' | translate }} - - - {{ 'SCANNER.VIEW_DOC' | translate }} - -

Date: Fri, 13 Jun 2025 03:25:35 +0000 Subject: [PATCH 38/55] chore(deps): bump helm.sh/helm/v3 from 3.17.2 to 3.18.2 in /src (#22060) Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.17.2 to 3.18.2. - [Release notes](https://github.com/helm/helm/releases) - [Commits](https://github.com/helm/helm/compare/v3.17.2...v3.18.2) --- updated-dependencies: - dependency-name: helm.sh/helm/v3 dependency-version: 3.18.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/go.mod | 26 +++++++++++------------ src/go.sum | 60 +++++++++++++++++++++++++++--------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/go.mod b/src/go.mod index 6e82d3a8aef..37f3181477a 100644 --- a/src/go.mod +++ b/src/go.mod @@ -47,9 +47,9 @@ require ( github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.1.0 + github.com/opencontainers/image-spec v1.1.1 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_golang v1.22.0 github.com/prometheus/client_model v0.6.1 github.com/robfig/cron/v3 v3.0.1 github.com/spf13/viper v1.19.0 @@ -66,15 +66,15 @@ require ( go.opentelemetry.io/otel/trace v1.35.0 go.pinniped.dev v0.37.0 go.uber.org/ratelimit v0.3.1 - golang.org/x/crypto v0.36.0 + golang.org/x/crypto v0.37.0 golang.org/x/net v0.38.0 - golang.org/x/oauth2 v0.27.0 - golang.org/x/sync v0.12.0 - golang.org/x/text v0.23.0 + golang.org/x/oauth2 v0.28.0 + golang.org/x/sync v0.14.0 + golang.org/x/text v0.24.0 golang.org/x/time v0.11.0 gopkg.in/h2non/gock.v1 v1.1.2 gopkg.in/yaml.v2 v2.4.0 - helm.sh/helm/v3 v3.17.2 + helm.sh/helm/v3 v3.18.2 k8s.io/api v0.33.1 k8s.io/apimachinery v0.33.1 k8s.io/client-go v0.33.1 @@ -104,7 +104,7 @@ require ( github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dnaeon/go-vcr v1.2.0 // indirect github.com/docker/cli v27.1.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.7.0 // indirect + github.com/docker/docker-credential-helpers v0.8.2 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect @@ -135,7 +135,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -149,7 +149,7 @@ require ( github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/robfig/cron v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -161,7 +161,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.7.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -178,8 +178,8 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/term v0.30.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/term v0.31.0 // indirect google.golang.org/api v0.171.0 // indirect google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect diff --git a/src/go.sum b/src/go.sum index 73a7b77e9d6..e1c02ab971c 100644 --- a/src/go.sum +++ b/src/go.sum @@ -8,8 +8,8 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-sdk-for-go v37.2.0+incompatible h1:LTdcd2GK+cv+e7yhWCN8S7yf3eblBypKFZsPfKjCQ7E= github.com/Azure/azure-sdk-for-go v37.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= @@ -125,8 +125,8 @@ github.com/docker/cli v27.1.1+incompatible h1:goaZxOqs4QKxznZjjBWKONQci/MywhtRv2 github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= +github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= @@ -369,8 +369,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -411,8 +411,8 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -451,8 +451,8 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= @@ -467,8 +467,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -476,8 +476,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= @@ -522,8 +522,8 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -638,8 +638,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -696,8 +696,8 @@ golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -710,8 +710,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -746,8 +746,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -758,8 +758,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -772,8 +772,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -874,8 +874,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.17.2 h1:agYQ5ew2jq5vdx2K7q5W44KyKQrnSubUMCQsjkiv3/o= -helm.sh/helm/v3 v3.17.2/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8= +helm.sh/helm/v3 v3.18.2 h1:mPQP/HHYjNEDAztAK50dD6uxTCNV1zSVU38WwSVdw9M= +helm.sh/helm/v3 v3.18.2/go.mod h1:43QHS1W97RcoFJRk36ZBhHdTfykqBlJdsWp3yhzdq8w= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From f46ef3b38dbf7fcc085ba231082d62d172124141 Mon Sep 17 00:00:00 2001 From: Chethan Date: Mon, 16 Jun 2025 14:32:45 +0530 Subject: [PATCH 39/55] Update contributing.md (#22082) Fix minor errors in CONTRIBUTING.md Signed-off-by: chethanm99 --- CONTRIBUTING.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4b765558294..712ba720417 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Contributors are encouraged to collaborate using the following resources in addi * Chat with us on the CNCF Slack ([get an invitation here][cncf-slack] ) * [#harbor][users-slack] for end-user discussions * [#harbor-dev][dev-slack] for development of Harbor -* Want long-form communication instead of Slack? We have two distributions lists: +* Want long-form communication instead of Slack? We have two distribution lists: * [harbor-users][users-dl] for end-user discussions * [harbor-dev][dev-dl] for development of Harbor @@ -49,7 +49,7 @@ To build the project, please refer the [build](https://goharbor.io/docs/edge/bui ### Repository Structure -Here is the basic structure of the harbor code base. Some key folders / files are commented for your references. +Here is the basic structure of the Harbor code base. Some key folders / files are commented for your reference. ``` . ... @@ -175,7 +175,7 @@ Ensure your GOPATH and PATH have been configured in accordance with the Go envir #### Web -Harbor web UI is built based on [Clarity](https://vmware.github.io/clarity/) and [Angular](https://angular.io/) web framework. To setup web UI development environment, please make sure the [npm](https://www.npmjs.com/get-npm) tool is installed first. +Harbor web UI is built based on [Clarity](https://vmware.github.io/clarity/) and [Angular](https://angular.io/) web framework. To setup a web UI development environment, please make sure that the [npm](https://www.npmjs.com/get-npm) tool is installed first. | Harbor | Requires Angular | Requires Clarity | |----------|--------------------|--------------------| @@ -205,7 +205,7 @@ PR are always welcome, even if they only contain small fixes like typos or a few Please submit a PR broken down into small changes bit by bit. A PR consisting of a lot of features and code changes may be hard to review. It is recommended to submit PRs in an incremental fashion. -Note: If you split your pull request to small changes, please make sure any of the changes goes to `main` will not break anything. Otherwise, it can not be merged until this feature complete. +Note: If you split your pull request to small changes, please make sure any of the changes goes to `main` will not break anything. Otherwise, it can not be merged until this feature completed. ### Fork and clone @@ -279,7 +279,7 @@ To build the code, please refer to [build](https://goharbor.io/docs/edge/build-c **Note**: from v2.0, Harbor uses [go-swagger](https://github.com/go-swagger/go-swagger) to generate API server from Swagger 2.0 (aka [OpenAPI 2.0](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md)). To add or change the APIs, first update the `api/v2.0/swagger.yaml` file, then run `make gen_apis` to generate the API server, finally, implement or update the API handlers in `src/server/v2.0/handler` package. -As now Harbor uses `controller/manager/dao` programming model, we suggest to use [testify mock](https://github.com/stretchr/testify/blob/master/mock/doc.go) to test `controller` and `manager`. Harbor integrates [mockery](https://github.com/vektra/mockery) to generate mocks for golang interfaces using the testify mock package. To generate mocks for the interface, first add mock config in the `src/.mockery.yaml`, then run `make gen_mocks` to generate mocks. +As Harbor now uses `controller/manager/dao` programming model, we suggest using [testify mock](https://github.com/stretchr/testify/blob/master/mock/doc.go) to test `controller` and `manager`. Harbor integrates [mockery](https://github.com/vektra/mockery) to generate mocks for golang interfaces using the testify mock package. To generate mocks for the interface, first add mock config in the `src/.mockery.yaml`, then run `make gen_mocks` to generate mocks. ### Keep sync with upstream @@ -318,15 +318,15 @@ curl https://cdn.jsdelivr.net/gh/tommarshall/git-good-commit@v0.6.1/hook.sh > .g ``` ### Automated Testing -Once your pull request has been opened, harbor will run two CI pipelines against it. +Once your pull request has been opened, Harbor will run two CI pipelines against it. 1. In the travis CI, your source code will be checked via `golint`, `go vet` and `go race` that makes sure the code is readable, safe and correct. Also, all of unit tests will be triggered via `go test` against the pull request. What you need to pay attention to is the travis result and the coverage report. * If any failure in travis, you need to figure out whether it is introduced by your commits. -* If the coverage dramatic decline, you need to commit unit test to coverage your code. -2. In the drone CI, the E2E test will be triggered against the pull request. Also, the source code will be checked via `gosec`, and the result is stored in google storage for later analysis. The pipeline is about to build and install harbor from source code, then to run four very basic E2E tests to validate the basic functionalities of harbor, like: -* Registry Basic Verification, to validate the image can be pulled and pushed successful. -* Trivy Basic Verification, to validate the image can be scanned successful. -* Notary Basic Verification, to validate the image can be signed successful. -* Ldap Basic Verification, to validate harbor can work in LDAP environment. +* If the coverage dramatically declines, then you need to commit a unit test to cover your code. +2. In the drone CI, the E2E test will be triggered against the pull request. Also, the source code will be checked via `gosec`, and the result is stored in google storage for later analysis. The pipeline is about to build and install harbor from source code, then to run four very basic E2E tests to validate the basic functionalities of Harbor, like: +* Registry Basic Verification, to validate that the image can be pulled and pushed successfully. +* Trivy Basic Verification, to validate that the image can be scanned successfully. +* Notary Basic Verification, to validate that the image can be signed successfully. +* Ldap Basic Verification, to validate that Harbor can work in LDAP environment. ### Push and Create PR When ready for review, push your branch to your fork repository on `github.com`: @@ -345,7 +345,7 @@ Commit changes made in response to review comments to the same branch on your fo It is a great way to contribute to Harbor by reporting an issue. Well-written and complete bug reports are always welcome! Please open an issue on GitHub and follow the template to fill in required information. -Before opening any issue, please look up the existing [issues](https://github.com/goharbor/harbor/issues) to avoid submitting a duplication. +Before opening any issue, please look up the existing [issues](https://github.com/goharbor/harbor/issues) to avoid submitting a duplicate. If you find a match, you can "subscribe" to it to get notified on updates. If you have additional helpful information about the issue, please leave a comment. When reporting issues, always include: From ec9d13d107010d756ef8f8d2f0989d4703ba25eb Mon Sep 17 00:00:00 2001 From: Prasanth Baskar Date: Tue, 17 Jun 2025 13:23:00 +0530 Subject: [PATCH 40/55] fix: CVE Allowlist Validation (#22077) fix: empty cve allowlist validation - fixes empty and cves with only spaces fix: cve allowlist validation add: tests for cve allowlist validation fix: types for projectCVEAllowlist Signed-off-by: bupd --- src/pkg/allowlist/validator.go | 8 ++++ src/pkg/allowlist/validator_test.go | 16 ++++++++ .../security/security.component.spec.ts | 34 ++++++++++++++++ .../config/security/security.component.ts | 7 +++- .../project-policy-config.component.spec.ts | 40 +++++++++++++++++++ .../project-policy-config.component.ts | 16 ++++++-- .../src/app/shared/services/interface.ts | 5 +++ 7 files changed, 121 insertions(+), 5 deletions(-) diff --git a/src/pkg/allowlist/validator.go b/src/pkg/allowlist/validator.go index e7171242311..f4f81fec101 100644 --- a/src/pkg/allowlist/validator.go +++ b/src/pkg/allowlist/validator.go @@ -16,6 +16,7 @@ package allowlist import ( "fmt" + "strings" models2 "github.com/goharbor/harbor/src/pkg/allowlist/models" ) @@ -45,6 +46,13 @@ func IsInvalidErr(err error) bool { func Validate(wl models2.CVEAllowlist) error { m := map[string]struct{}{} for _, it := range wl.Items { + cveID := strings.TrimSpace(it.CVEID) + // Check for empty or whitespace-only CVE IDs + if cveID == "" { + return &invalidErr{fmt.Sprintf("empty or whitespace-only CVE ID in allowlist")} + } + + // Check for duplicates if _, ok := m[it.CVEID]; ok { return &invalidErr{fmt.Sprintf("duplicate CVE ID in allowlist: %s", it.CVEID)} } diff --git a/src/pkg/allowlist/validator_test.go b/src/pkg/allowlist/validator_test.go index 747de740a79..834fe6722d4 100644 --- a/src/pkg/allowlist/validator_test.go +++ b/src/pkg/allowlist/validator_test.go @@ -53,6 +53,22 @@ func TestValidate(t *testing.T) { l models2.CVEAllowlist noError bool }{ + { + l: models2.CVEAllowlist{ + Items: []models2.CVEAllowlistItem{ + {CVEID: ""}, + }, + }, + noError: false, + }, + { + l: models2.CVEAllowlist{ + Items: []models2.CVEAllowlistItem{ + {CVEID: " "}, + }, + }, + noError: false, + }, { l: models2.CVEAllowlist{ Items: nil, diff --git a/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts b/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts index 73469b090c8..181f4b7069c 100644 --- a/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts @@ -99,4 +99,38 @@ describe('SecurityComponent', () => { 'CVE-2019-789' ); }); + it('should not allow empty and whitespace CVEs', async () => { + // set cveIds with mix empty and whitespace + component.cveIds = ` + + , , \n , \t, , + `; + component.addToSystemAllowlist(); + const finalIds = component.systemAllowlist.items.map(i => i.cve_id); + expect(finalIds).not.toContain(' '); + expect(finalIds).not.toContain('\n'); + expect(finalIds).not.toContain(''); // no empty CVEs + + // modal should be closed + expect(component.cveIds).toBeNull(); + expect(component.showAddModal).toBeFalse(); + }); + it('should add only unique CVEs to the allowlist', () => { + // set cveIds with duplicates and valid + component.cveIds = ` + CVE-2024-0002, + CVE-2024-0002, + CVE-2024-0004 + `; + + component.addToSystemAllowlist(); + const finalIds = component.systemAllowlist.items.map(i => i.cve_id); + expect(finalIds).toContain('CVE-2024-0004'); + expect(finalIds).not.toContain(''); // no empty CVEs + expect(finalIds.filter(id => id === 'CVE-2024-0002').length).toBe(1); // no duplicates + + // modal should be closed + expect(component.cveIds).toBeNull(); + expect(component.showAddModal).toBeFalse(); + }); }); diff --git a/src/portal/src/app/base/left-side-nav/config/security/security.component.ts b/src/portal/src/app/base/left-side-nav/config/security/security.component.ts index 6ad5d9b9ec5..50715ecf67e 100644 --- a/src/portal/src/app/base/left-side-nav/config/security/security.component.ts +++ b/src/portal/src/app/base/left-side-nav/config/security/security.component.ts @@ -174,7 +174,12 @@ export class SecurityComponent implements OnInit, OnDestroy { this.systemAllowlist.items.forEach(item => { map[item.cve_id] = true; }); - this.cveIds.split(/[\n,]+/).forEach(id => { + const newCveIds = this.cveIds + .split(/[\n,]+/) + .map(id => id.trim()) // remove leading/trailing whitespace + .filter(id => id.length > 0); // skip empty or whitespace-only strings + + newCveIds.forEach(id => { let cveObj: any = {}; cveObj.cve_id = id.trim(); if (!map[cveObj.cve_id]) { diff --git a/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.spec.ts b/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.spec.ts index df03eda61f1..e5cd8b7b100 100644 --- a/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.spec.ts +++ b/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.spec.ts @@ -169,6 +169,46 @@ describe('ProjectPolicyConfigComponent', () => { .GenerateSbomOnPush ).toBeTruthy(); }); + it('should not allow empty and whitespace CVEs', async () => { + // set cveIds with mix of empty and whitespace + component.projectPolicyConfigComponent.cveIds = ` + , , \n , \t, , + `; + + component.projectPolicyConfigComponent.addToProjectAllowlist(); + + const finalIds = + component.projectPolicyConfigComponent.projectAllowlist.items.map( + i => i.cve_id + ); + expect(finalIds).not.toContain(' '); + expect(finalIds).not.toContain('\n'); + expect(finalIds).not.toContain(''); // no empty CVEs + + // modal should be closed + expect(component.projectPolicyConfigComponent.cveIds).toBeNull(); + expect(component.projectPolicyConfigComponent.showAddModal).toBeFalse(); + }); + it('should add only unique CVEs to the allowlist', () => { + // set cveIds with duplicates and valid + component.projectPolicyConfigComponent.cveIds = ` + CVE-2024-0002, + CVE-2024-0002, + CVE-2024-0004 + `; + component.projectPolicyConfigComponent.addToProjectAllowlist(); + const finalIds = + component.projectPolicyConfigComponent.projectAllowlist.items.map( + i => i.cve_id + ); + expect(finalIds).toContain('CVE-2024-0004'); + expect(finalIds).not.toContain(''); // no empty CVEs + expect(finalIds.filter(id => id === 'CVE-2024-0002').length).toBe(1); // no duplicates + + // modal should be closed + expect(component.projectPolicyConfigComponent.cveIds).toBeNull(); + expect(component.projectPolicyConfigComponent.showAddModal).toBeFalse(); + }); it('should get hasChangeConfigRole', () => { expect( component.projectPolicyConfigComponent.hasChangeConfigRole diff --git a/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts b/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts index 0e3c55e3913..b35e3992dbe 100644 --- a/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts +++ b/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts @@ -13,7 +13,10 @@ // limitations under the License. import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; import { compareValue, clone } from '../../../../shared/units/utils'; -import { ProjectService } from '../../../../shared/services'; +import { + ProjectCVEAllowlist, + ProjectService, +} from '../../../../shared/services'; import { ErrorHandler } from '../../../../shared/units/error-handler'; import { State, SystemCVEAllowlist } from '../../../../shared/services'; import { @@ -133,8 +136,8 @@ export class ProjectPolicyConfigComponent implements OnInit { userProjectAllowlist = false; systemAllowlistOrProjectAllowlist: string; systemAllowlistOrProjectAllowlistOrigin: string; - projectAllowlist; - projectAllowlistOrigin; + projectAllowlist: ProjectCVEAllowlist; + projectAllowlistOrigin: ProjectCVEAllowlist; speedUnit = BandwidthUnit.KB; speedUnits = [ { @@ -454,7 +457,12 @@ export class ProjectPolicyConfigComponent implements OnInit { this.projectAllowlist.items.forEach(item => { map[item.cve_id] = true; }); - this.cveIds.split(/[\n,]+/).forEach(id => { + const newCveIds = this.cveIds + .split(/[\n,]+/) + .map(id => id.trim()) // remove leading/trailing whitespace + .filter(id => id.length > 0); // skip empty or whitespace-only strings + + newCveIds.forEach(id => { let cveObj: any = {}; cveObj.cve_id = id.trim(); if (!map[cveObj.cve_id]) { diff --git a/src/portal/src/app/shared/services/interface.ts b/src/portal/src/app/shared/services/interface.ts index 7f7bb3f0032..3b73f7253cc 100644 --- a/src/portal/src/app/shared/services/interface.ts +++ b/src/portal/src/app/shared/services/interface.ts @@ -433,6 +433,11 @@ export interface ProjectRootInterface { VALUE: number; LABEL: string; } +export interface ProjectCVEAllowlist { + id?: number; + expires_at?: number; + items?: Array<{ cve_id: string }>; +} export interface SystemCVEAllowlist { id?: number; project_id?: number; From b64703274706928ed1ec18cbc7833bddab14e1d2 Mon Sep 17 00:00:00 2001 From: Chethan Date: Tue, 17 Jun 2025 16:15:28 +0530 Subject: [PATCH 41/55] Update Swagger 's readme.md (#22087) Enhance readability of swagger Readme.md file by fixing minor errors Signed-off-by: chethanm99 --- tools/swagger/templates/README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/swagger/templates/README.md b/tools/swagger/templates/README.md index 94fc1e5e078..cc7a34d2310 100644 --- a/tools/swagger/templates/README.md +++ b/tools/swagger/templates/README.md @@ -4,16 +4,16 @@ In Stratoscale, we really like the idea of API-first services, and we also reall We saw the go-swagger library, and thought that most of it can really help us. Generating code from swagger files is a big problem with a lot of corner cases, and go-swagger is doing great job. -The one thing that we felt missing, is customization of the server to run with our design principles: +The one thing that we felt missing was customization of the server to run with our design principles: * Custom `main` function * Dependency injection -* Limited scopes with unit testing. +* Limited scope with unit testing. Also: -* Adding you functions to the generated `configure_swagger_*.go` seems to be a burden. -* Lack of Interface that the service implement. +* Adding your functions to the generated `configure_swagger_*.go` seems to be a burden. +* Lack of Interface that the service implements. * Complicated and custom http clients and runtime. Those are the changes that this contributor templates are providing: @@ -22,7 +22,7 @@ Those are the changes that this contributor templates are providing: ### The new `restapi` package exposes interfaces -* Those interfaces can implemented by the developer and are the business logic of the service. +* Those interfaces can be implemented by the developer and are the business logic of the service. * The implementation of those is extensible. * The implementation is separated from the generated code. @@ -32,8 +32,8 @@ The `restapi.Handler` (see [example](./example/restapi/configure_swagger_petstor a standard `http.Handler` * Given objects that implements the business logic, we can create a simple http handler. -* This handler is standard go http.Handler, so we can now use any other middleware, library, or framework - that support it. +* This handler is a standard go http.Handler, so we can now use any other middleware, library, or framework +that supports it. * This handler is standard, so we understand it better. ## Client @@ -57,7 +57,7 @@ In the [example package](https://github.com/Stratoscale/swagger/tree/master/exam ### [restapi](https://github.com/Stratoscale/swagger/tree/master/example/restapi) -This package is autogenerated and contains the server routing and parameters parsing. +This package is autogenerated and contains the server routing and parameter parsing. The modified version contains `restapi.PetAPI` and `restapi.StoreAPI` which were auto generated. @@ -116,7 +116,7 @@ Let's look how we use this generated code to build our server. ### [internal](https://github.com/Stratoscale/swagger/tree/master/example/internal) The `internal` package is **not** auto generated and contains the business logic of our server. -We can see two structs that implements the `restapi.PetAPI` and `restapi.StoreAPI` interfaces, +We can see two structs that implement the `restapi.PetAPI` and `restapi.StoreAPI` interfaces, needed to make our server work. When adding or removing functions from our REST API, we can just add or remove functions to those @@ -189,7 +189,7 @@ type SwaggerPetstore { } ``` -Those fields are objects, which implements interfaces declared in the [pet](./example/client/pet) and +Those fields are objects, which implement interfaces declared in the [pet](./example/client/pet) and [store](./example/client/store) packages: For example: @@ -234,7 +234,7 @@ security: The securityDefinitions section defines different security types that your application can handle. The supported types by go-swagger are: -* `apiKey` - token that should be able to processed. +* `apiKey` - token that should be able to be processed. * `oauth2` - token and scopes that should be processed. * and `basic` - user/password that should be processed. @@ -253,7 +253,7 @@ paths: - token: [admin] ``` -Here we overridden the scope of token in the POST /pets URL so that only admin can use this API. +Here we have overridden the scope of the token in the POST /pets URL so that only admin can use this API. Let's see how we can use this functionality. @@ -289,14 +289,14 @@ type Config struct { This one is a custom defined function that gets the request and can return an error. If the returned error is not nil, and 403 HTTP error will be returned to the client - here the policy -enforcement comes to place. +enforcement comes into play. There are two things that this function should be aware of: 1. The user - it can retrieve the user information from the context: `ctx.Value(restapi.AuthKey).(MyUserType)`. Usually, a server will have a function for extracting this user information and returns a concrete type which could be used by all the routes. 2. The route - it can retrieve the route using the go-swagger function: `middleware.MatchedRouteFrom(*http.Request)`. - So no need to parse URL and test the request method. + So no need to parse the URL and test the request method. This route struct contains the route information. If for example, we want to check the scopes that were defined for the current route in the swagger.yaml we can use the code below: From 59c3de10a65890517fced56b1923e98e9ab9e002 Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Wed, 18 Jun 2025 18:22:22 +0800 Subject: [PATCH 42/55] refactor: simplify some implementations by modern go features (#21998) Signed-off-by: chlins --- src/common/dao/pgsql_test.go | 2 +- src/common/dao/testutils.go | 2 +- src/common/rbac/project/evaluator_test.go | 2 +- src/common/utils/utils.go | 12 +---- .../artifact/annotation/v1alpha1.go | 3 +- .../processor/cnai/parser/util_test.go | 2 +- src/controller/blob/controller_test.go | 2 +- src/controller/config/controller.go | 2 +- .../event/handler/webhook/scan/scan.go | 2 +- src/controller/health/controller.go | 2 +- src/controller/jobmonitor/monitor.go | 8 +--- src/controller/proxy/manifestcache.go | 4 +- src/controller/quota/util_test.go | 4 +- .../replication/transfer/image/transfer.go | 5 +-- src/controller/scan/checker.go | 7 ++- src/controller/scanner/base_controller.go | 9 +--- src/core/auth/ldap/ldap.go | 2 +- src/core/service/token/token_test.go | 7 ++- src/core/session/codec.go | 9 ++-- src/jobservice/job/impl/context.go | 14 ++---- src/jobservice/job/impl/default_context.go | 5 +-- .../job/impl/gc/garbage_collection.go | 5 +-- src/jobservice/job/impl/gc/util_test.go | 2 +- .../impl/scandataexport/scan_data_export.go | 6 +-- src/jobservice/logger/base_test.go | 7 +-- src/jobservice/logger/getter/file_getter.go | 6 +-- src/jobservice/logger/known_loggers.go | 9 +--- src/jobservice/period/enqueuer.go | 5 +-- src/lib/cache/codec_test.go | 4 +- src/lib/cache/helper_test.go | 2 +- src/lib/cache/memory/memory_test.go | 4 +- src/lib/cache/redis/redis_test.go | 4 +- src/lib/cache/util_test.go | 2 +- src/lib/config/userconfig.go | 5 +-- src/lib/gtask/pool_test.go | 5 +-- src/lib/link.go | 4 +- src/lib/log/logger.go | 9 ++-- src/lib/orm/metadata.go | 10 ++--- src/lib/orm/orm.go | 2 +- src/lib/orm/test/orm_test.go | 2 +- src/lib/q/builder.go | 10 ++--- src/lib/q/query.go | 7 +-- src/lib/redis/client_test.go | 4 +- src/lib/selector/selectors/index/index.go | 9 ++-- src/pkg/allowlist/dao/dao_test.go | 2 +- src/pkg/auditext/dao/dao.go | 4 +- src/pkg/cached/manager.go | 2 +- src/pkg/config/inmemory/manager.go | 9 ++-- src/pkg/config/rest/rest_test.go | 5 +-- src/pkg/jobmonitor/redis.go | 5 +-- src/pkg/jobmonitor/redis_test.go | 6 +-- src/pkg/notifier/notifier_test.go | 2 +- src/pkg/oidc/helper.go | 8 ++-- src/pkg/proxy/secret/manager_test.go | 4 +- src/pkg/reg/adapter/awsecr/adapter_test.go | 4 +- src/pkg/reg/adapter/googlegcr/adapter.go | 7 ++- src/pkg/reg/util/pattern.go | 5 +-- .../policy/rule/latestk/evaluator.go | 6 +-- .../policy/rule/latestpl/evaluator.go | 6 +-- .../policy/rule/latestps/evaluator.go | 6 +-- src/pkg/scan/dao/scanner/model.go | 25 ++++------- src/pkg/scan/export/filter_processor.go | 7 ++- src/pkg/scan/report/summary.go | 5 +-- src/pkg/scan/rest/v1/models.go | 45 +++++-------------- src/pkg/systemartifact/manager.go | 5 +-- src/pkg/task/dao/execution.go | 2 +- src/pkg/task/dao/task_test.go | 4 +- src/pkg/task/sweep_job.go | 6 +-- src/server/middleware/repoproxy/proxy.go | 2 +- .../middleware/vulnerable/vulnerable.go | 11 +++-- src/server/registry/util/util.go | 7 +-- src/server/v2.0/handler/project.go | 10 ++--- src/server/v2.0/handler/util.go | 2 +- src/testing/job/mock_client.go | 8 +--- src/testing/mock/mock.go | 2 +- 75 files changed, 161 insertions(+), 289 deletions(-) diff --git a/src/common/dao/pgsql_test.go b/src/common/dao/pgsql_test.go index 2e046115175..f0615262e55 100644 --- a/src/common/dao/pgsql_test.go +++ b/src/common/dao/pgsql_test.go @@ -27,7 +27,7 @@ func TestMaxOpenConns(t *testing.T) { queryNum := 200 results := make([]bool, queryNum) - for i := 0; i < queryNum; i++ { + for i := range queryNum { wg.Add(1) go func(i int) { defer wg.Done() diff --git a/src/common/dao/testutils.go b/src/common/dao/testutils.go index fab162ef08c..cf2c777ba74 100644 --- a/src/common/dao/testutils.go +++ b/src/common/dao/testutils.go @@ -142,7 +142,7 @@ func ArrayEqual(arrayA, arrayB []int) bool { return false } size := len(arrayA) - for i := 0; i < size; i++ { + for i := range size { if arrayA[i] != arrayB[i] { return false } diff --git a/src/common/rbac/project/evaluator_test.go b/src/common/rbac/project/evaluator_test.go index 5a995fa8e0c..ff2e147f983 100644 --- a/src/common/rbac/project/evaluator_test.go +++ b/src/common/rbac/project/evaluator_test.go @@ -119,7 +119,7 @@ func BenchmarkProjectEvaluator(b *testing.B) { resource := NewNamespace(public.ProjectID).Resource(rbac.ResourceRepository) b.ResetTimer() - for i := 0; i < b.N; i++ { + for b.Loop() { evaluator.HasPermission(context.TODO(), resource, rbac.ActionPull) } } diff --git a/src/common/utils/utils.go b/src/common/utils/utils.go index 03560200e34..1df798f93cc 100644 --- a/src/common/utils/utils.go +++ b/src/common/utils/utils.go @@ -75,7 +75,7 @@ func GenerateRandomStringWithLen(length int) string { if err != nil { log.Warningf("Error reading random bytes: %v", err) } - for i := 0; i < length; i++ { + for i := range length { result[i] = chars[int(result[i])%l] } return string(result) @@ -337,13 +337,3 @@ func MostMatchSorter(a, b string, matchWord string) bool { func IsLocalPath(path string) bool { return len(path) == 0 || (strings.HasPrefix(path, "/") && !strings.HasPrefix(path, "//")) } - -// StringInSlice check if the string is in the slice -func StringInSlice(str string, slice []string) bool { - for _, s := range slice { - if s == str { - return true - } - } - return false -} diff --git a/src/controller/artifact/annotation/v1alpha1.go b/src/controller/artifact/annotation/v1alpha1.go index df88e42ee1e..f6abfdd8a8e 100644 --- a/src/controller/artifact/annotation/v1alpha1.go +++ b/src/controller/artifact/annotation/v1alpha1.go @@ -66,8 +66,7 @@ func parseV1alpha1SkipList(artifact *artifact.Artifact, manifest *v1.Manifest) { skipListAnnotationKey := fmt.Sprintf("%s.%s.%s", AnnotationPrefix, V1alpha1, SkipList) skipList, ok := manifest.Config.Annotations[skipListAnnotationKey] if ok { - skipKeyList := strings.Split(skipList, ",") - for _, skipKey := range skipKeyList { + for skipKey := range strings.SplitSeq(skipList, ",") { delete(metadata, skipKey) } artifact.ExtraAttrs = metadata diff --git a/src/controller/artifact/processor/cnai/parser/util_test.go b/src/controller/artifact/processor/cnai/parser/util_test.go index 1ebc9ad3060..f6c1b7f6b6a 100644 --- a/src/controller/artifact/processor/cnai/parser/util_test.go +++ b/src/controller/artifact/processor/cnai/parser/util_test.go @@ -156,7 +156,7 @@ func TestAddNode(t *testing.T) { // Verify the path exists. current := root parts := filepath.Clean(tt.path) - for _, part := range strings.Split(parts, string(filepath.Separator)) { + for part := range strings.SplitSeq(parts, string(filepath.Separator)) { if part == "" { continue } diff --git a/src/controller/blob/controller_test.go b/src/controller/blob/controller_test.go index 51a38c5ebb1..649dfab1982 100644 --- a/src/controller/blob/controller_test.go +++ b/src/controller/blob/controller_test.go @@ -232,7 +232,7 @@ func (suite *ControllerTestSuite) TestGet() { func (suite *ControllerTestSuite) TestSync() { var references []distribution.Descriptor - for i := 0; i < 5; i++ { + for i := range 5 { references = append(references, distribution.Descriptor{ MediaType: fmt.Sprintf("media type %d", i), Digest: suite.Digest(), diff --git a/src/controller/config/controller.go b/src/controller/config/controller.go index 5380d7634e2..083d97fe406 100644 --- a/src/controller/config/controller.go +++ b/src/controller/config/controller.go @@ -206,7 +206,7 @@ func maxValueLimitedByLength(length int) int64 { var value int64 // the times for multiple, should *10 for every time times := 1 - for i := 0; i < length; i++ { + for range length { value = value + int64(9*times) times = times * 10 } diff --git a/src/controller/event/handler/webhook/scan/scan.go b/src/controller/event/handler/webhook/scan/scan.go index 2057aa04d50..15491c11496 100644 --- a/src/controller/event/handler/webhook/scan/scan.go +++ b/src/controller/event/handler/webhook/scan/scan.go @@ -129,7 +129,7 @@ func constructScanImagePayload(ctx context.Context, event *event.ScanImageEvent, // Wait for reasonable time to make sure the report is ready // Interval=500ms and total time = 5s // If the report is still not ready in the total time, then failed at then - for i := 0; i < 10; i++ { + for range 10 { // First check in case it is ready if re, err := scan.DefaultController.GetReport(ctx, art, []string{v1.MimeTypeNativeReport, v1.MimeTypeGenericVulnerabilityReport}); err == nil { if len(re) > 0 && len(re[0].Report) > 0 { diff --git a/src/controller/health/controller.go b/src/controller/health/controller.go index c6c2bdc458e..4c56a653736 100644 --- a/src/controller/health/controller.go +++ b/src/controller/health/controller.go @@ -48,7 +48,7 @@ func (c *controller) GetHealth(_ context.Context) *OverallHealthStatus { for name, checker := range registry { go check(name, checker, timeout, ch) } - for i := 0; i < len(registry); i++ { + for range len(registry) { componentStatus := <-ch if len(componentStatus.Error) != 0 { isHealthy = false diff --git a/src/controller/jobmonitor/monitor.go b/src/controller/jobmonitor/monitor.go index 04ca93b553c..505f9d46e7c 100644 --- a/src/controller/jobmonitor/monitor.go +++ b/src/controller/jobmonitor/monitor.go @@ -17,6 +17,7 @@ package jobmonitor import ( "context" "fmt" + "slices" "strings" "time" @@ -278,12 +279,7 @@ func (w *monitorController) ListQueues(ctx context.Context) ([]*jm.Queue, error) } func skippedUnusedJobType(jobType string) bool { - for _, t := range skippedJobTypes { - if jobType == t { - return true - } - } - return false + return slices.Contains(skippedJobTypes, jobType) } func (w *monitorController) PauseJobQueues(ctx context.Context, jobType string) error { diff --git a/src/controller/proxy/manifestcache.go b/src/controller/proxy/manifestcache.go index 4cbe9c03499..c763c80b2d3 100644 --- a/src/controller/proxy/manifestcache.go +++ b/src/controller/proxy/manifestcache.go @@ -131,7 +131,7 @@ func (m *ManifestListCache) push(ctx context.Context, repo, reference string, ma // if time exceed, then push a updated manifest list which contains existing manifest var newMan distribution.Manifest var err error - for n := 0; n < maxManifestListWait; n++ { + for range maxManifestListWait { log.Debugf("waiting for the manifest ready, repo %v, tag:%v", repo, reference) time.Sleep(sleepIntervalSec * time.Second) newMan, err = m.updateManifestList(ctx, repo, man) @@ -177,7 +177,7 @@ type ManifestCache struct { // CacheContent ... func (m *ManifestCache) CacheContent(ctx context.Context, remoteRepo string, man distribution.Manifest, art lib.ArtifactInfo, r RemoteInterface, _ string) { var waitBlobs []distribution.Descriptor - for n := 0; n < maxManifestWait; n++ { + for n := range maxManifestWait { time.Sleep(sleepIntervalSec * time.Second) waitBlobs = m.local.CheckDependencies(ctx, art.Repository, man) if len(waitBlobs) == 0 { diff --git a/src/controller/quota/util_test.go b/src/controller/quota/util_test.go index 153aa3d9206..bbc4515eb6f 100644 --- a/src/controller/quota/util_test.go +++ b/src/controller/quota/util_test.go @@ -78,13 +78,13 @@ func (suite *RefreshForProjectsTestSuite) TestRefreshForProjects() { startProjectID := rand.Int63() var firstPageProjects, secondPageProjects []*models.Project - for i := 0; i < 50; i++ { + for i := range 50 { firstPageProjects = append(firstPageProjects, &models.Project{ ProjectID: startProjectID + int64(i), }) } - for i := 0; i < 10; i++ { + for i := range 10 { secondPageProjects = append(secondPageProjects, &models.Project{ ProjectID: startProjectID + 50 + int64(i), }) diff --git a/src/controller/replication/transfer/image/transfer.go b/src/controller/replication/transfer/image/transfer.go index bf76eee9559..d8982202668 100644 --- a/src/controller/replication/transfer/image/transfer.go +++ b/src/controller/replication/transfer/image/transfer.go @@ -423,10 +423,7 @@ func (t *transfer) copyBlobByChunk(srcRepo, dstRepo, digest string, sizeFromDesc // update the start and end for upload *start = *end + 1 // since both ends are closed intervals, it is necessary to subtract one byte - *end = *start + replicationChunkSize - 1 - if *end >= endRange { - *end = endRange - } + *end = min(*start+replicationChunkSize-1, endRange) t.logger.Infof("copying the blob chunk: %d-%d/%d", *start, *end, sizeFromDescriptor) _, data, err := t.src.PullBlobChunk(srcRepo, digest, sizeFromDescriptor, *start, *end) diff --git a/src/controller/scan/checker.go b/src/controller/scan/checker.go index 4b429b2bc30..2d3326b4590 100644 --- a/src/controller/scan/checker.go +++ b/src/controller/scan/checker.go @@ -16,6 +16,7 @@ package scan import ( "context" + "slices" "github.com/goharbor/harbor/src/controller/artifact" "github.com/goharbor/harbor/src/controller/artifact/processor/image" @@ -125,10 +126,8 @@ func hasCapability(r *models.Registration, a *artifact.Artifact) bool { // use allowlist here because currently only docker image is supported by the scanner // https://github.com/goharbor/pluggable-scanner-spec/issues/2 allowlist := []string{image.ArtifactTypeImage} - for _, t := range allowlist { - if a.Type == t { - return r.HasCapability(a.ManifestMediaType) - } + if slices.Contains(allowlist, a.Type) { + return r.HasCapability(a.ManifestMediaType) } return false diff --git a/src/controller/scanner/base_controller.go b/src/controller/scanner/base_controller.go index 623dd4b2865..f421df828a2 100644 --- a/src/controller/scanner/base_controller.go +++ b/src/controller/scanner/base_controller.go @@ -17,6 +17,7 @@ package scanner import ( "context" "fmt" + "slices" "sync" "time" @@ -383,13 +384,7 @@ var ( ) func isReservedName(name string) bool { - for _, reservedName := range reservedNames { - if name == reservedName { - return true - } - } - - return false + return slices.Contains(reservedNames, name) } // MetadataResult metadata or error saved in cache diff --git a/src/core/auth/ldap/ldap.go b/src/core/auth/ldap/ldap.go index 60d31f2b462..796eae9837c 100644 --- a/src/core/auth/ldap/ldap.go +++ b/src/core/auth/ldap/ldap.go @@ -150,7 +150,7 @@ func (l *Auth) attachGroupParallel(ctx context.Context, ldapUsers []model.User, g := new(errgroup.Group) g.SetLimit(workerCount) - for i := 0; i < workerCount; i++ { + for i := range workerCount { curIndex := i g.Go(func() error { userGroups := make([]ugModel.UserGroup, 0) diff --git a/src/core/service/token/token_test.go b/src/core/service/token/token_test.go index 2ea6a8f7106..29307011a4a 100644 --- a/src/core/service/token/token_test.go +++ b/src/core/service/token/token_test.go @@ -24,6 +24,7 @@ import ( "os" "path" "runtime" + "slices" "testing" "github.com/docker/distribution/registry/auth/token" @@ -239,10 +240,8 @@ func (f *fakeSecurityContext) IsSolutionUser() bool { } func (f *fakeSecurityContext) Can(ctx context.Context, action rbac.Action, resource rbac.Resource) bool { if actions, ok := f.rcActions[resource]; ok { - for _, a := range actions { - if a == action { - return true - } + if slices.Contains(actions, action) { + return true } } return false diff --git a/src/core/session/codec.go b/src/core/session/codec.go index d964055da88..408fa95cdb0 100644 --- a/src/core/session/codec.go +++ b/src/core/session/codec.go @@ -16,6 +16,7 @@ package session import ( "encoding/gob" + "maps" "github.com/beego/beego/v2/server/web/session" @@ -51,14 +52,10 @@ func (*gobCodec) Decode(data []byte, v any) error { switch in := v.(type) { case map[any]any: - for k, v := range vm { - in[k] = v - } + maps.Copy(in, vm) case *map[any]any: m := *in - for k, v := range vm { - m[k] = v - } + maps.Copy(m, vm) default: return errors.Errorf("object type invalid, %#v", v) } diff --git a/src/jobservice/job/impl/context.go b/src/jobservice/job/impl/context.go index 8bbe80fd0ee..7cd38b00443 100644 --- a/src/jobservice/job/impl/context.go +++ b/src/jobservice/job/impl/context.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "maps" "math" "sync" "time" @@ -116,9 +117,7 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { // Copy properties if len(c.properties) > 0 { - for k, v := range c.properties { - jContext.properties[k] = v - } + maps.Copy(jContext.properties, c.properties) } // Refresh config properties @@ -128,9 +127,7 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { } props := c.cfgMgr.GetAll(c.sysContext) - for k, v := range props { - jContext.properties[k] = v - } + maps.Copy(jContext.properties, props) // Set loggers for job c.lock.Lock() @@ -199,10 +196,7 @@ func createLoggers(jobID string) (logger.Interface, error) { if lc.Name == logger.NameFile || lc.Name == logger.NameDB { // Need extra param fSettings := map[string]any{} - for k, v := range lc.Settings { - // Copy settings - fSettings[k] = v - } + maps.Copy(fSettings, lc.Settings) if lc.Name == logger.NameFile { // Append file name param fSettings["filename"] = fmt.Sprintf("%s.log", jobID) diff --git a/src/jobservice/job/impl/default_context.go b/src/jobservice/job/impl/default_context.go index 47c1eb625d2..9381d4a4a5b 100644 --- a/src/jobservice/job/impl/default_context.go +++ b/src/jobservice/job/impl/default_context.go @@ -17,6 +17,7 @@ package impl import ( "context" "errors" + "maps" o "github.com/beego/beego/v2/client/orm" @@ -61,9 +62,7 @@ func (dc *DefaultContext) Build(t job.Tracker) (job.Context, error) { // Copy properties if len(dc.properties) > 0 { - for k, v := range dc.properties { - jContext.properties[k] = v - } + maps.Copy(jContext.properties, dc.properties) } // Set loggers for job diff --git a/src/jobservice/job/impl/gc/garbage_collection.go b/src/jobservice/job/impl/gc/garbage_collection.go index 9b6cfd3cc5f..b63fff7da59 100644 --- a/src/jobservice/job/impl/gc/garbage_collection.go +++ b/src/jobservice/job/impl/gc/garbage_collection.go @@ -299,10 +299,7 @@ func (gc *GarbageCollector) sweep(ctx job.Context) error { blobChunkCount := (total + blobChunkSize - 1) / blobChunkSize blobChunks := make([][]*blobModels.Blob, blobChunkCount) for i, start := 0, 0; i < blobChunkCount; i, start = i+1, start+blobChunkSize { - end := start + blobChunkSize - if end > total { - end = total - } + end := min(start+blobChunkSize, total) blobChunks[i] = gc.deleteSet[start:end] } diff --git a/src/jobservice/job/impl/gc/util_test.go b/src/jobservice/job/impl/gc/util_test.go index b290aac2ebd..5077a42eb85 100644 --- a/src/jobservice/job/impl/gc/util_test.go +++ b/src/jobservice/job/impl/gc/util_test.go @@ -59,7 +59,7 @@ func TestDelKeys(t *testing.T) { // helper function // mock the data in the redis mock := func(count int, prefix string) { - for i := 0; i < count; i++ { + for i := range count { err = c.Save(context.TODO(), fmt.Sprintf("%s-%d", prefix, i), "", 0) assert.NoError(t, err) } diff --git a/src/jobservice/job/impl/scandataexport/scan_data_export.go b/src/jobservice/job/impl/scandataexport/scan_data_export.go index 14b1e7c901d..040593c411e 100644 --- a/src/jobservice/job/impl/scandataexport/scan_data_export.go +++ b/src/jobservice/job/impl/scandataexport/scan_data_export.go @@ -17,6 +17,7 @@ package scandataexport import ( "encoding/json" "fmt" + "maps" "os" "path/filepath" "strconv" @@ -173,9 +174,8 @@ func (sde *ScanDataExport) updateExecAttributes(ctx job.Context, params job.Para } // copy old extra attrsToUpdate := exec.ExtraAttrs - for k, v := range attrs { - attrsToUpdate[k] = v - } + maps.Copy(attrsToUpdate, attrs) + return sde.execMgr.UpdateExtraAttrs(ctx.SystemContext(), execID, attrsToUpdate) } diff --git a/src/jobservice/logger/base_test.go b/src/jobservice/logger/base_test.go index 52813a51d08..6dfea69779b 100644 --- a/src/jobservice/logger/base_test.go +++ b/src/jobservice/logger/base_test.go @@ -1,7 +1,6 @@ package logger import ( - "context" "fmt" "os" "path" @@ -97,8 +96,7 @@ func TestGetLoggersMulti(t *testing.T) { // Test getting sweepers func TestGetSweeper(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() _, err := GetSweeper(ctx) if err == nil { @@ -170,8 +168,7 @@ func TestGetGetter(t *testing.T) { // Test init func TestLoggerInit(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() oldJobLoggerCfg := config.DefaultConfig.JobLoggerConfigs oldLoggerCfg := config.DefaultConfig.LoggerConfigs diff --git a/src/jobservice/logger/getter/file_getter.go b/src/jobservice/logger/getter/file_getter.go index 1c224de7f26..35763f22890 100644 --- a/src/jobservice/logger/getter/file_getter.go +++ b/src/jobservice/logger/getter/file_getter.go @@ -99,10 +99,8 @@ func tailLogFile(filename string, limit int64) ([]byte, error) { } defer fi.Close() - pos := size - sizeToRead - if pos < 0 { - pos = 0 - } + pos := max(size-sizeToRead, 0) + if pos != 0 { _, err = fi.Seek(pos, 0) if err != nil { diff --git a/src/jobservice/logger/known_loggers.go b/src/jobservice/logger/known_loggers.go index 78e0d575d20..c4d1f57084b 100644 --- a/src/jobservice/logger/known_loggers.go +++ b/src/jobservice/logger/known_loggers.go @@ -16,6 +16,7 @@ package logger import ( "reflect" + "slices" "strings" "github.com/goharbor/harbor/src/jobservice/logger/backend" @@ -89,13 +90,7 @@ func IsKnownLevel(level string) bool { return false } - for _, lvl := range debugLevels { - if lvl == strings.ToUpper(level) { - return true - } - } - - return false + return slices.Contains(debugLevels, strings.ToUpper(level)) } // GetLoggerName return a logger name by Interface diff --git a/src/jobservice/period/enqueuer.go b/src/jobservice/period/enqueuer.go index ff53f017fb6..ee2f9f87533 100644 --- a/src/jobservice/period/enqueuer.go +++ b/src/jobservice/period/enqueuer.go @@ -17,6 +17,7 @@ package period import ( "context" "fmt" + "maps" "math/rand" "time" @@ -303,9 +304,7 @@ func cloneParameters(params job.Parameters, epoch int64) job.Parameters { p := make(job.Parameters) // Clone parameters to a new param map - for k, v := range params { - p[k] = v - } + maps.Copy(p, params) p[PeriodicExecutionMark] = fmt.Sprintf("%d", epoch) diff --git a/src/lib/cache/codec_test.go b/src/lib/cache/codec_test.go index 3d2fae29df9..37fc07bcc76 100644 --- a/src/lib/cache/codec_test.go +++ b/src/lib/cache/codec_test.go @@ -19,7 +19,7 @@ import ( ) func BenchmarkDefaultCodecEncode(b *testing.B) { - for i := 0; i < b.N; i++ { + for b.Loop() { codec.Encode("abcdefghigklmopqrztuvwxyz") } } @@ -27,7 +27,7 @@ func BenchmarkDefaultCodecEncode(b *testing.B) { func BenchmarkDefaultCodecDecode(b *testing.B) { data := []byte("abcdefghigklmopqrztuvwxyz") - for i := 0; i < b.N; i++ { + for b.Loop() { var str string codec.Decode(data, &str) } diff --git a/src/lib/cache/helper_test.go b/src/lib/cache/helper_test.go index 5d6b68e0fa7..bc903c75608 100644 --- a/src/lib/cache/helper_test.go +++ b/src/lib/cache/helper_test.go @@ -103,7 +103,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { var wg sync.WaitGroup - for i := 0; i < 1000; i++ { + for range 1000 { wg.Add(1) go func() { diff --git a/src/lib/cache/memory/memory_test.go b/src/lib/cache/memory/memory_test.go index 218546fa2ad..1d665293b7b 100644 --- a/src/lib/cache/memory/memory_test.go +++ b/src/lib/cache/memory/memory_test.go @@ -112,14 +112,14 @@ func (suite *CacheTestSuite) TestPing() { func (suite *CacheTestSuite) TestScan() { seed := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Save(suite.ctx, key, "") suite.NoError(err) } } clean := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Delete(suite.ctx, key) suite.NoError(err) diff --git a/src/lib/cache/redis/redis_test.go b/src/lib/cache/redis/redis_test.go index b9749e7ce3d..c4e35befb9a 100644 --- a/src/lib/cache/redis/redis_test.go +++ b/src/lib/cache/redis/redis_test.go @@ -112,14 +112,14 @@ func (suite *CacheTestSuite) TestPing() { func (suite *CacheTestSuite) TestScan() { seed := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Save(suite.ctx, key, "") suite.NoError(err) } } clean := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Delete(suite.ctx, key) suite.NoError(err) diff --git a/src/lib/cache/util_test.go b/src/lib/cache/util_test.go index f3e046b99aa..aa09582d4da 100644 --- a/src/lib/cache/util_test.go +++ b/src/lib/cache/util_test.go @@ -26,7 +26,7 @@ func TestKeyMutex(t *testing.T) { key := "key" var wg sync.WaitGroup - for i := 0; i < 100; i++ { + for range 100 { wg.Add(1) go func() { diff --git a/src/lib/config/userconfig.go b/src/lib/config/userconfig.go index 8c3d9fc1d93..99f41658ef9 100644 --- a/src/lib/config/userconfig.go +++ b/src/lib/config/userconfig.go @@ -220,7 +220,7 @@ func RobotPrefix(ctx context.Context) string { // SplitAndTrim ... func SplitAndTrim(s, sep string) []string { res := make([]string, 0) - for _, s := range strings.Split(s, sep) { + for s := range strings.SplitSeq(s, sep) { if e := strings.TrimSpace(s); len(e) > 0 { res = append(res, e) } @@ -269,8 +269,7 @@ func AuditLogEventEnabled(ctx context.Context, eventType string) bool { return true } disableListStr := DefaultMgr().Get(ctx, common.AuditLogEventsDisabled).GetString() - disableList := strings.Split(disableListStr, ",") - for _, t := range disableList { + for t := range strings.SplitSeq(disableListStr, ",") { tName := strings.TrimSpace(t) if strings.EqualFold(tName, eventType) { return false diff --git a/src/lib/gtask/pool_test.go b/src/lib/gtask/pool_test.go index be9b857c22c..7f8944499ed 100644 --- a/src/lib/gtask/pool_test.go +++ b/src/lib/gtask/pool_test.go @@ -27,7 +27,7 @@ func TestAddTask(t *testing.T) { taskNum := 3 taskInterval := time.Duration(0) - for i := 0; i < taskNum; i++ { + for i := range taskNum { fn := func(ctx context.Context) { t.Logf("Task %d is running...", i) } @@ -64,8 +64,7 @@ func TestStartAndStop(t *testing.T) { pool.tasks = []*task{t1, t2} - ctx1, cancel1 := context.WithCancel(context.Background()) - defer cancel1() + ctx1 := t.Context() pool.Start(ctx1) // Let it run for a bit diff --git a/src/lib/link.go b/src/lib/link.go index 450f2e6683b..b97b2081574 100644 --- a/src/lib/link.go +++ b/src/lib/link.go @@ -54,11 +54,11 @@ func (l Links) String() string { // e.g. ; rel="previous"; title="previous chapter" , ; rel="next"; title="next chapter" func ParseLinks(str string) Links { var links Links - for _, lk := range strings.Split(str, ",") { + for lk := range strings.SplitSeq(str, ",") { link := &Link{ Attrs: map[string]string{}, } - for _, attr := range strings.Split(lk, ";") { + for attr := range strings.SplitSeq(lk, ";") { attr = strings.TrimSpace(attr) if len(attr) == 0 { continue diff --git a/src/lib/log/logger.go b/src/lib/log/logger.go index 66e5fecd24d..b36c47a16e7 100644 --- a/src/lib/log/logger.go +++ b/src/lib/log/logger.go @@ -17,6 +17,7 @@ package log import ( "fmt" "io" + "maps" "os" "runtime" "sort" @@ -122,12 +123,8 @@ func (l *Logger) WithFields(fields Fields) *Logger { if len(fields) > 0 { copyFields := make(map[string]any, len(l.fields)+len(fields)) - for key, value := range l.fields { - copyFields[key] = value - } - for key, value := range fields { - copyFields[key] = value - } + maps.Copy(copyFields, l.fields) + maps.Copy(copyFields, fields) sortedKeys := make([]string, 0, len(copyFields)) for key := range copyFields { diff --git a/src/lib/orm/metadata.go b/src/lib/orm/metadata.go index fc648b4b69d..f0523e9c85f 100644 --- a/src/lib/orm/metadata.go +++ b/src/lib/orm/metadata.go @@ -79,7 +79,7 @@ func parseModel(model any) *metadata { Keys: map[string]*key{}, } // parse fields of the provided model - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { field := t.Field(i) orm := field.Tag.Get("orm") // isn't the database column, skip @@ -107,7 +107,7 @@ func parseModel(model any) *metadata { } // parse filter methods of the provided model - for i := 0; i < ptr.NumMethod(); i++ { + for i := range ptr.NumMethod() { methodName := ptr.Method(i).Name if !strings.HasPrefix(methodName, "FilterBy") { continue @@ -173,7 +173,7 @@ func parseFilterable(field reflect.StructField) bool { // } func parseSortable(field reflect.StructField) (*q.Sort, bool) { var defaultSort *q.Sort - for _, item := range strings.Split(field.Tag.Get("sort"), ";") { + for item := range strings.SplitSeq(field.Tag.Get("sort"), ";") { // isn't sortable, return directly if item == "false" { return nil, false @@ -202,7 +202,7 @@ func parseSortable(field reflect.StructField) (*q.Sort, bool) { // It returns "customized_field1" for "Field1" and returns "field2" for "Field2" func parseColumn(field reflect.StructField) string { column := "" - for _, item := range strings.Split(field.Tag.Get("orm"), ";") { + for item := range strings.SplitSeq(field.Tag.Get("orm"), ";") { if !strings.HasPrefix(item, "column") { continue } @@ -224,7 +224,7 @@ func snakeCase(str string) string { runes := []rune(str) var out []rune - for i := 0; i < len(runes); i++ { + for i := range len(runes) { if i > 0 && (unicode.IsUpper(runes[i])) && ((i+1 < len(runes) && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) { diff --git a/src/lib/orm/orm.go b/src/lib/orm/orm.go index 03a4edf445f..a7c95ea6531 100644 --- a/src/lib/orm/orm.go +++ b/src/lib/orm/orm.go @@ -271,7 +271,7 @@ func Escape(str string) string { // e.g. n=3, returns "?,?,?" func ParamPlaceholderForIn(n int) string { placeholders := []string{} - for i := 0; i < n; i++ { + for range n { placeholders = append(placeholders, "?") } return strings.Join(placeholders, ",") diff --git a/src/lib/orm/test/orm_test.go b/src/lib/orm/test/orm_test.go index 9331f684224..128d0b434b9 100644 --- a/src/lib/orm/test/orm_test.go +++ b/src/lib/orm/test/orm_test.go @@ -387,7 +387,7 @@ func (suite *OrmSuite) TestReadOrCreateParallel() { arr := make([]int, count) var wg sync.WaitGroup - for i := 0; i < count; i++ { + for i := range count { wg.Add(1) go func(i int) { defer wg.Done() diff --git a/src/lib/q/builder.go b/src/lib/q/builder.go index da501c96112..66e625e2e6f 100644 --- a/src/lib/q/builder.go +++ b/src/lib/q/builder.go @@ -58,8 +58,8 @@ func parseKeywords(q string) (map[string]any, error) { } else { log.Errorf("failed to unescape the query %s: %v", q, err) } - params := strings.Split(q, ",") - for _, param := range params { + + for param := range strings.SplitSeq(q, ",") { strs := strings.SplitN(param, "=", 2) if len(strs) != 2 || len(strs[0]) == 0 || len(strs[1]) == 0 { return nil, errors.New(nil). @@ -82,7 +82,7 @@ func ParseSorting(sort string) []*Sort { return []*Sort{} } var sorts []*Sort - for _, sorting := range strings.Split(sort, ",") { + for sorting := range strings.SplitSeq(sort, ",") { key := sorting desc := false if strings.HasPrefix(sorting, "-") { @@ -176,8 +176,8 @@ func parseList(value string, c rune) ([]any, error) { return nil, fmt.Errorf(`and list must start with "(" and end with ")"`) } var vs []any - strs := strings.Split(value[1:length-1], " ") - for _, str := range strs { + + for str := range strings.SplitSeq(value[1:length-1], " ") { v := parseValue(str) if s, ok := v.(string); ok && len(s) == 0 { continue diff --git a/src/lib/q/query.go b/src/lib/q/query.go index 2b21a942a7b..a29b3fd878f 100644 --- a/src/lib/q/query.go +++ b/src/lib/q/query.go @@ -14,6 +14,8 @@ package q +import "maps" + // KeyWords ... type KeyWords = map[string]any @@ -56,9 +58,8 @@ func MustClone(query *Query) *Query { if query != nil { q.PageNumber = query.PageNumber q.PageSize = query.PageSize - for k, v := range query.Keywords { - q.Keywords[k] = v - } + maps.Copy(q.Keywords, query.Keywords) + for _, sort := range query.Sorts { q.Sorts = append(q.Sorts, &Sort{ Key: sort.Key, diff --git a/src/lib/redis/client_test.go b/src/lib/redis/client_test.go index 189d0f8eecd..e2f7446a66d 100644 --- a/src/lib/redis/client_test.go +++ b/src/lib/redis/client_test.go @@ -34,7 +34,7 @@ func TestGetRegistryClient(t *testing.T) { assert.NotNil(t, client) // multiple calls should return the same client - for i := 0; i < 10; i++ { + for range 10 { newClient, err := GetRegistryClient() assert.NoError(t, err) assert.Equal(t, client, newClient) @@ -55,7 +55,7 @@ func TestGetHarborClient(t *testing.T) { assert.NotNil(t, client) // multiple calls should return the same client - for i := 0; i < 10; i++ { + for range 10 { newClient, err := GetHarborClient() assert.NoError(t, err) assert.Equal(t, client, newClient) diff --git a/src/lib/selector/selectors/index/index.go b/src/lib/selector/selectors/index/index.go index 6fb40b2a9bc..ad7aaf955a0 100644 --- a/src/lib/selector/selectors/index/index.go +++ b/src/lib/selector/selectors/index/index.go @@ -15,6 +15,7 @@ package index import ( + "slices" "sync" "github.com/goharbor/harbor/src/lib/errors" @@ -80,11 +81,9 @@ func Get(kind, decoration, pattern, extras string) (selector.Selector, error) { } item := v.(*indexedItem) - for _, dec := range item.Meta.Decorations { - if dec == decoration { - factory := item.Factory - return factory(decoration, pattern, extras), nil - } + if slices.Contains(item.Meta.Decorations, decoration) { + factory := item.Factory + return factory(decoration, pattern, extras), nil } return nil, errors.Errorf("decoration %s of selector %s is not supported", decoration, kind) diff --git a/src/pkg/allowlist/dao/dao_test.go b/src/pkg/allowlist/dao/dao_test.go index fc8f86070c2..33fe19aefd6 100644 --- a/src/pkg/allowlist/dao/dao_test.go +++ b/src/pkg/allowlist/dao/dao_test.go @@ -28,7 +28,7 @@ func (s *testSuite) TestSetAndGet() { s.Nil(err) s.Nil(l) var longList []models.CVEAllowlistItem - for i := 0; i < 50; i++ { + for range 50 { longList = append(longList, models.CVEAllowlistItem{CVEID: "CVE-1999-0067"}) } diff --git a/src/pkg/auditext/dao/dao.go b/src/pkg/auditext/dao/dao.go index ad0e25421f3..07794dd002a 100644 --- a/src/pkg/auditext/dao/dao.go +++ b/src/pkg/auditext/dao/dao.go @@ -16,11 +16,11 @@ package dao import ( "context" + "slices" "strings" beegorm "github.com/beego/beego/v2/client/orm" - "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" "github.com/goharbor/harbor/src/lib/orm" @@ -197,7 +197,7 @@ func permitEventTypes(includeEventTypes []string) []string { var filterEvents []string for _, e := range includeEventTypes { event := strings.ToLower(e) - if utils.StringInSlice(event, model.EventTypes) { + if slices.Contains(model.EventTypes, event) { filterEvents = append(filterEvents, e) } else if event == model.OtherEvents { // include all other events filterEvents = append(filterEvents, model.OtherEventTypes...) diff --git a/src/pkg/cached/manager.go b/src/pkg/cached/manager.go index 9ac21a28040..affd2bbbf96 100644 --- a/src/pkg/cached/manager.go +++ b/src/pkg/cached/manager.go @@ -75,7 +75,7 @@ func (ok *ObjectKey) Format(keysAndValues ...any) (string, error) { } s := ok.namespace - for i := 0; i < len(keysAndValues); i++ { + for i := range len(keysAndValues) { // even is key if i%2 == 0 { key, match := keysAndValues[i].(string) diff --git a/src/pkg/config/inmemory/manager.go b/src/pkg/config/inmemory/manager.go index 2ef9945daaf..3cbfaf3316c 100644 --- a/src/pkg/config/inmemory/manager.go +++ b/src/pkg/config/inmemory/manager.go @@ -16,6 +16,7 @@ package inmemory import ( "context" + "maps" "sync" "github.com/goharbor/harbor/src/common" @@ -41,9 +42,7 @@ func (d *Driver) Load(context.Context) (map[string]any, error) { d.Lock() defer d.Unlock() res := make(map[string]any) - for k, v := range d.cfgMap { - res[k] = v - } + maps.Copy(res, d.cfgMap) return res, nil } @@ -51,9 +50,7 @@ func (d *Driver) Load(context.Context) (map[string]any, error) { func (d *Driver) Save(_ context.Context, cfg map[string]any) error { d.Lock() defer d.Unlock() - for k, v := range cfg { - d.cfgMap[k] = v - } + maps.Copy(d.cfgMap, cfg) return nil } diff --git a/src/pkg/config/rest/rest_test.go b/src/pkg/config/rest/rest_test.go index 3be9a782946..663c4bcd6c4 100644 --- a/src/pkg/config/rest/rest_test.go +++ b/src/pkg/config/rest/rest_test.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "io" + "maps" "net/http" "net/http/httptest" "testing" @@ -66,9 +67,7 @@ func ConfigPutHandler(w http.ResponseWriter, r *http.Request) { if err != nil { log.Fatal(err) } - for k, v := range cfgs { - configMapForTest[k] = v - } + maps.Copy(configMapForTest, cfgs) } func TestHTTPDriver_Save(t *testing.T) { diff --git a/src/pkg/jobmonitor/redis.go b/src/pkg/jobmonitor/redis.go index 7886673e4b5..63ab35bb762 100644 --- a/src/pkg/jobmonitor/redis.go +++ b/src/pkg/jobmonitor/redis.go @@ -88,10 +88,7 @@ func (r *redisClientImpl) StopPendingJobs(ctx context.Context, jobType string) ( // use batch to list the job in queue, because the too many object load from a list might cause the redis crash for startIndex := int64(0); startIndex < int64(size); startIndex += batchSize { - endIndex := startIndex + batchSize - if endIndex > int64(size) { - endIndex = int64(size) - } + endIndex := min(startIndex+batchSize, int64(size)) jobs, err := redis.Strings(conn.Do("LRANGE", redisKeyJobQueue, startIndex, endIndex)) if err != nil { return []string{}, err diff --git a/src/pkg/jobmonitor/redis_test.go b/src/pkg/jobmonitor/redis_test.go index 4eae1a49a3b..a2aefba813c 100644 --- a/src/pkg/jobmonitor/redis_test.go +++ b/src/pkg/jobmonitor/redis_test.go @@ -59,7 +59,7 @@ func (s *RedisClientTestSuite) TestUntrackJobStatusInBatch() { jobIDs := make([]string, 0) conn := s.redisClient.redisPool.Get() defer conn.Close() - for i := 0; i < 100; i++ { + for range 100 { k := utils.GenerateRandomStringWithLen(10) jobIDs = append(jobIDs, k) key := rds.KeyJobStats(fmt.Sprintf("{%s}", s.redisClient.namespace), k) @@ -92,7 +92,7 @@ func (s *RedisClientTestSuite) TestStopPendingJobs() { } conn := s.redisClient.redisPool.Get() defer conn.Close() - for i := 0; i < 100; i++ { + for range 100 { job := jobInfo{ ID: utils.GenerateRandomStringWithLen(10), Params: utils.GenerateRandomStringWithLen(10), @@ -107,7 +107,7 @@ func (s *RedisClientTestSuite) TestStopPendingJobs() { } } // job without id - for i := 0; i < 10; i++ { + for range 10 { job := jobInfo{ Params: utils.GenerateRandomStringWithLen(10), } diff --git a/src/pkg/notifier/notifier_test.go b/src/pkg/notifier/notifier_test.go index b4539d04881..856ed344d34 100644 --- a/src/pkg/notifier/notifier_test.go +++ b/src/pkg/notifier/notifier_test.go @@ -173,7 +173,7 @@ func TestConcurrentPublish(t *testing.T) { } // Publish in a short interval. - for i := 0; i < 10; i++ { + for range 10 { Publish(context.TODO(), "topic1", 100) } diff --git a/src/pkg/oidc/helper.go b/src/pkg/oidc/helper.go index db3ba7eab31..9d619f4fbed 100644 --- a/src/pkg/oidc/helper.go +++ b/src/pkg/oidc/helper.go @@ -22,6 +22,7 @@ import ( "net/http" "net/url" "regexp" + "slices" "strings" "sync" "sync/atomic" @@ -392,11 +393,8 @@ func userInfoFromClaims(c claimsProvider, setting cfgModels.OIDCSetting) (*UserI } res.Groups, res.hasGroupClaim = groupsFromClaims(c, setting.GroupsClaim) if len(setting.AdminGroup) > 0 { - for _, g := range res.Groups { - if g == setting.AdminGroup { - res.AdminGroupMember = true - break - } + if slices.Contains(res.Groups, setting.AdminGroup) { + res.AdminGroupMember = true } } return res, nil diff --git a/src/pkg/proxy/secret/manager_test.go b/src/pkg/proxy/secret/manager_test.go index 0e07ee0f221..cbb532477f1 100644 --- a/src/pkg/proxy/secret/manager_test.go +++ b/src/pkg/proxy/secret/manager_test.go @@ -36,13 +36,13 @@ func TestExpiration(t *testing.T) { func TestGC(t *testing.T) { manager := createManager(1*time.Second, 10, 1*time.Second).(*mgr) - for i := 0; i < 10; i++ { + for i := range 10 { rn := fmt.Sprintf("project%d/golang", i) manager.Generate(rn) } time.Sleep(2 * time.Second) assert.Equal(t, uint64(10), manager.size) - for i := 0; i < 1000; i++ { + for i := range 1000 { rn := fmt.Sprintf("project%d/redis", i) manager.Generate(rn) } diff --git a/src/pkg/reg/adapter/awsecr/adapter_test.go b/src/pkg/reg/adapter/awsecr/adapter_test.go index 8d910b840ce..f9590b2cc65 100644 --- a/src/pkg/reg/adapter/awsecr/adapter_test.go +++ b/src/pkg/reg/adapter/awsecr/adapter_test.go @@ -329,7 +329,7 @@ func compileRegexpEveryTime(url string) (string, string, error) { } func BenchmarkGetAccountRegion(b *testing.B) { - for i := 0; i < b.N; i++ { + for b.Loop() { for _, url := range urlForBenchmark { parseAccountRegion(url) } @@ -337,7 +337,7 @@ func BenchmarkGetAccountRegion(b *testing.B) { } func BenchmarkCompileRegexpEveryTime(b *testing.B) { - for i := 0; i < b.N; i++ { + for b.Loop() { for _, url := range urlForBenchmark { compileRegexpEveryTime(url) } diff --git a/src/pkg/reg/adapter/googlegcr/adapter.go b/src/pkg/reg/adapter/googlegcr/adapter.go index 75a33665c9f..ecfcb64654a 100644 --- a/src/pkg/reg/adapter/googlegcr/adapter.go +++ b/src/pkg/reg/adapter/googlegcr/adapter.go @@ -19,6 +19,7 @@ import ( "fmt" "io" "net/http" + "slices" "github.com/opencontainers/go-digest" @@ -195,10 +196,8 @@ func (a adapter) listGcrTagsByRef(repository, reference string) ([]string, strin } // for tag as reference for d, m := range tgs.Manifest { - for _, t := range m.Tag { - if t == reference { - return m.Tag, d, nil - } + if slices.Contains(m.Tag, reference) { + return m.Tag, d, nil } } return nil, "", nil diff --git a/src/pkg/reg/util/pattern.go b/src/pkg/reg/util/pattern.go index b0c15e6e367..63c11ce58f7 100644 --- a/src/pkg/reg/util/pattern.go +++ b/src/pkg/reg/util/pattern.go @@ -40,7 +40,7 @@ func IsSpecificPath(path string) ([]string, bool) { return nil, false } components := [][]string{} - for _, component := range strings.Split(path, "/") { + for component := range strings.SplitSeq(path, "/") { strs, ok := IsSpecificPathComponent(component) if !ok { return nil, false @@ -113,8 +113,7 @@ func IsSpecificPathComponent(component string) ([]string, bool) { suffix = component[j+1:] } components := []string{} - strs := strings.Split(component[i+1:j], ",") - for _, str := range strs { + for str := range strings.SplitSeq(component[i+1:j], ",") { components = append(components, prefix+str+suffix) } return components, true diff --git a/src/pkg/retention/policy/rule/latestk/evaluator.go b/src/pkg/retention/policy/rule/latestk/evaluator.go index 72cc87a4220..6d84ac0212d 100644 --- a/src/pkg/retention/policy/rule/latestk/evaluator.go +++ b/src/pkg/retention/policy/rule/latestk/evaluator.go @@ -49,11 +49,7 @@ func (e *evaluator) Process(artifacts []*selector.Candidate) ([]*selector.Candid return activeTime(artifacts[i]) > activeTime(artifacts[j]) }) - i := e.k - if i > len(artifacts) { - i = len(artifacts) - } - + i := min(e.k, len(artifacts)) return artifacts[:i], nil } diff --git a/src/pkg/retention/policy/rule/latestpl/evaluator.go b/src/pkg/retention/policy/rule/latestpl/evaluator.go index c550874eda7..65cb5869e00 100644 --- a/src/pkg/retention/policy/rule/latestpl/evaluator.go +++ b/src/pkg/retention/policy/rule/latestpl/evaluator.go @@ -46,11 +46,7 @@ func (e *evaluator) Process(artifacts []*selector.Candidate) ([]*selector.Candid return artifacts[i].PulledTime > artifacts[j].PulledTime }) - i := e.n - if i > len(artifacts) { - i = len(artifacts) - } - + i := min(e.n, len(artifacts)) return artifacts[:i], nil } diff --git a/src/pkg/retention/policy/rule/latestps/evaluator.go b/src/pkg/retention/policy/rule/latestps/evaluator.go index 61682dc593a..3f0c37f77b5 100644 --- a/src/pkg/retention/policy/rule/latestps/evaluator.go +++ b/src/pkg/retention/policy/rule/latestps/evaluator.go @@ -48,11 +48,7 @@ func (e *evaluator) Process(artifacts []*selector.Candidate) ([]*selector.Candid return artifacts[i].PushedTime > artifacts[j].PushedTime }) - i := e.k - if i > len(artifacts) { - i = len(artifacts) - } - + i := min(e.k, len(artifacts)) return artifacts[:i], nil } diff --git a/src/pkg/scan/dao/scanner/model.go b/src/pkg/scan/dao/scanner/model.go index 070dc410e99..8ef1de1e4bb 100644 --- a/src/pkg/scan/dao/scanner/model.go +++ b/src/pkg/scan/dao/scanner/model.go @@ -16,6 +16,7 @@ package scanner import ( "encoding/json" + "slices" "time" "github.com/goharbor/harbor/src/lib" @@ -140,15 +141,9 @@ func (r *Registration) HasCapability(manifestMimeType string) bool { return false } - for _, capability := range r.Metadata.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == manifestMimeType { - return true - } - } - } - - return false + return slices.ContainsFunc(r.Metadata.Capabilities, func(c *v1.ScannerCapability) bool { + return slices.Contains(c.ConsumesMimeTypes, manifestMimeType) + }) } // GetProducesMimeTypes returns produces mime types for the artifact @@ -162,10 +157,8 @@ func (r *Registration) GetProducesMimeTypes(mimeType string, scanType string) [] capType = v1.ScanTypeVulnerability } if scanType == capType { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return capability.ProducesMimeTypes - } + if slices.Contains(capability.ConsumesMimeTypes, mimeType) { + return capability.ProducesMimeTypes } } } @@ -180,10 +173,8 @@ func (r *Registration) GetCapability(mimeType string) *v1.ScannerCapability { } for _, capability := range r.Metadata.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return capability - } + if slices.Contains(capability.ConsumesMimeTypes, mimeType) { + return capability } } diff --git a/src/pkg/scan/export/filter_processor.go b/src/pkg/scan/export/filter_processor.go index 4353e847971..8281dda53f5 100644 --- a/src/pkg/scan/export/filter_processor.go +++ b/src/pkg/scan/export/filter_processor.go @@ -16,6 +16,7 @@ package export import ( "context" + "slices" "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/controller/artifact" @@ -170,10 +171,8 @@ func (dfp *DefaultFilterProcessor) ProcessLabelFilter(_ context.Context, labelID // TODO (as now there should not have many labels, so here just use // for^2, we can convert to use map to reduce the time complex if needed. ) for _, label := range art.Labels { - for _, labelID := range labelIDs { - if labelID == label.ID { - return true - } + if slices.Contains(labelIDs, label.ID) { + return true } } return false diff --git a/src/pkg/scan/report/summary.go b/src/pkg/scan/report/summary.go index 0fc907d049e..8513ee1fd34 100644 --- a/src/pkg/scan/report/summary.go +++ b/src/pkg/scan/report/summary.go @@ -101,10 +101,7 @@ func GenerateNativeSummary(r *scan.Report, _ ...Option) (any, error) { sum.ReportID = r.UUID sum.StartTime = r.StartTime sum.EndTime = r.EndTime - sum.Duration = r.EndTime.Unix() - r.StartTime.Unix() - if sum.Duration < 0 { - sum.Duration = 0 - } + sum.Duration = max(r.EndTime.Unix()-r.StartTime.Unix(), 0) sum.ScanStatus = job.ErrorStatus.String() if job.Status(r.Status).Code() != -1 { diff --git a/src/pkg/scan/rest/v1/models.go b/src/pkg/scan/rest/v1/models.go index 83fb29ec7d3..30a8e27610f 100644 --- a/src/pkg/scan/rest/v1/models.go +++ b/src/pkg/scan/rest/v1/models.go @@ -17,6 +17,7 @@ package v1 import ( "encoding/json" "fmt" + "slices" "github.com/goharbor/harbor/src/lib/errors" ) @@ -95,26 +96,15 @@ func (md *ScannerAdapterMetadata) Validate() error { for _, ca := range md.Capabilities { // v1.MimeTypeDockerArtifact is required now - found := false - for _, cm := range ca.ConsumesMimeTypes { - if cm == MimeTypeDockerArtifact { - found = true - break - } - } + found := slices.Contains(ca.ConsumesMimeTypes, MimeTypeDockerArtifact) if !found { return errors.Errorf("missing %s in consumes_mime_types", MimeTypeDockerArtifact) } // either of v1.MimeTypeNativeReport OR v1.MimeTypeGenericVulnerabilityReport is required - found = false - for _, pm := range ca.ProducesMimeTypes { - if isSupportedMimeType(pm) { - found = true - break - } - } - + found = slices.ContainsFunc(ca.ProducesMimeTypes, func(pm string) bool { + return isSupportedMimeType(pm) + }) if !found { return errors.Errorf("missing %s or %s in produces_mime_types", MimeTypeNativeReport, MimeTypeGenericVulnerabilityReport) } @@ -124,34 +114,21 @@ func (md *ScannerAdapterMetadata) Validate() error { } func isSupportedMimeType(mimeType string) bool { - for _, mt := range supportedMimeTypes { - if mt == mimeType { - return true - } - } - return false + return slices.Contains(supportedMimeTypes, mimeType) } // HasCapability returns true when mine type of the artifact support by the scanner func (md *ScannerAdapterMetadata) HasCapability(mimeType string) bool { - for _, capability := range md.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return true - } - } - } - - return false + return slices.ContainsFunc(md.Capabilities, func(c *ScannerCapability) bool { + return slices.Contains(c.ConsumesMimeTypes, mimeType) + }) } // GetCapability returns capability for the mime type func (md *ScannerAdapterMetadata) GetCapability(mimeType string) *ScannerCapability { for _, capability := range md.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return capability - } + if slices.Contains(capability.ConsumesMimeTypes, mimeType) { + return capability } } diff --git a/src/pkg/systemartifact/manager.go b/src/pkg/systemartifact/manager.go index 90057a4d396..1daea91bae3 100644 --- a/src/pkg/systemartifact/manager.go +++ b/src/pkg/systemartifact/manager.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io" + "maps" "sync" "time" @@ -206,9 +207,7 @@ func (mgr *systemArtifactManager) Cleanup(ctx context.Context) (int64, int64, er // iterate through this copy to invoke the cleanup registeredCriteria := make(map[string]Selector, 0) mgr.lock.Lock() - for key, val := range mgr.cleanupCriteria { - registeredCriteria[key] = val - } + maps.Copy(registeredCriteria, mgr.cleanupCriteria) mgr.lock.Unlock() for key, val := range registeredCriteria { diff --git a/src/pkg/task/dao/execution.go b/src/pkg/task/dao/execution.go index 819c5a091e4..faf5d1b695b 100644 --- a/src/pkg/task/dao/execution.go +++ b/src/pkg/task/dao/execution.go @@ -224,7 +224,7 @@ func (e *executionDAO) GetMetrics(ctx context.Context, id int64) (*Metrics, erro func (e *executionDAO) RefreshStatus(ctx context.Context, id int64) (bool, string, error) { // as the status of the execution can be refreshed by multiple operators concurrently // we use the optimistic locking to avoid the conflict and retry 5 times at most - for i := 0; i < 5; i++ { + for range 5 { statusChanged, currentStatus, retry, err := e.refreshStatus(ctx, id) if err != nil { return false, "", err diff --git a/src/pkg/task/dao/task_test.go b/src/pkg/task/dao/task_test.go index f2ac2a67a38..8333fb9b339 100644 --- a/src/pkg/task/dao/task_test.go +++ b/src/pkg/task/dao/task_test.go @@ -256,7 +256,7 @@ func (t *taskDAOTestSuite) TestGetMaxEndTime() { func (t *taskDAOTestSuite) TestUpdateStatusInBatch() { jobIDs := make([]string, 0) taskIDs := make([]int64, 0) - for i := 0; i < 300; i++ { + for i := range 300 { jobID := fmt.Sprintf("job-%d", i) tid, err := t.taskDAO.Create(t.ctx, &Task{ JobID: jobID, @@ -272,7 +272,7 @@ func (t *taskDAOTestSuite) TestUpdateStatusInBatch() { err := t.taskDAO.UpdateStatusInBatch(t.ctx, jobIDs, "Stopped", 10) t.Require().Nil(err) - for i := 0; i < 300; i++ { + for i := range 300 { tasks, err := t.taskDAO.List(t.ctx, &q.Query{ Keywords: q.KeyWords{"job_id": jobIDs[i]}}) t.Require().Nil(err) diff --git a/src/pkg/task/sweep_job.go b/src/pkg/task/sweep_job.go index 6ee7d49a0a5..c9760861669 100644 --- a/src/pkg/task/sweep_job.go +++ b/src/pkg/task/sweep_job.go @@ -165,11 +165,7 @@ func (sj *SweepJob) sweep(ctx job.Context, vendorType string, retainCount int64) return errStop } // calculate the batch position - j := i + sweepBatchSize - // avoid overflow - if j > total { - j = total - } + j := min(i+sweepBatchSize, total) if err = sj.mgr.Clean(ctx.SystemContext(), candidates[i:j]); err != nil { sj.logger.Errorf("[%s] failed to batch clean candidates, error: %v", vendorType, err) diff --git a/src/server/middleware/repoproxy/proxy.go b/src/server/middleware/repoproxy/proxy.go index d5a2dcbc684..75abdcae26a 100644 --- a/src/server/middleware/repoproxy/proxy.go +++ b/src/server/middleware/repoproxy/proxy.go @@ -329,7 +329,7 @@ func proxyManifestHead(ctx context.Context, w http.ResponseWriter, ctl proxy.Con // Then GET the image by digest, in order to associate the tag with the digest // Ensure tag after head request, make sure tags in proxy cache keep update bCtx := orm.Context() - for i := 0; i < ensureTagMaxRetry; i++ { + for range ensureTagMaxRetry { time.Sleep(ensureTagInterval) bArt := lib.ArtifactInfo{ProjectName: art.ProjectName, Repository: art.Repository, Digest: string(desc.Digest)} err := ctl.EnsureTag(bCtx, bArt, art.Tag) diff --git a/src/server/middleware/vulnerable/vulnerable.go b/src/server/middleware/vulnerable/vulnerable.go index 5fbd52ebb11..9a1ae56c4e9 100644 --- a/src/server/middleware/vulnerable/vulnerable.go +++ b/src/server/middleware/vulnerable/vulnerable.go @@ -17,6 +17,7 @@ package vulnerable import ( "fmt" "net/http" + "slices" "github.com/goharbor/harbor/src/controller/artifact/processor/cnab" "github.com/goharbor/harbor/src/controller/artifact/processor/image" @@ -110,12 +111,10 @@ func Middleware() func(http.Handler) http.Handler { if art.IsImageIndex() { // artifact is image index, skip the checking when it is in the allowlist skippingAllowlist := []string{image.ArtifactTypeImage, cnab.ArtifactTypeCNAB} - for _, t := range skippingAllowlist { - if art.Type == t { - logger.Debugf("artifact %s@%s is image index and its type is %s in skipping allowlist, "+ - "skip the vulnerability prevention checking", art.RepositoryName, art.Digest, art.Type) - return nil - } + if slices.Contains(skippingAllowlist, art.Type) { + logger.Debugf("artifact %s@%s is image index and its type is %s in skipping allowlist, "+ + "skip the vulnerability prevention checking", art.RepositoryName, art.Digest, art.Type) + return nil } } diff --git a/src/server/registry/util/util.go b/src/server/registry/util/util.go index 2915da71e85..aa9e175d5ef 100644 --- a/src/server/registry/util/util.go +++ b/src/server/registry/util/util.go @@ -147,12 +147,7 @@ func pickItems(items []string, n *int, last string) ([]string, string) { i = sort.Search(len(items), func(ix int) bool { return strings.Compare(items[ix], last) > 0 }) } - j := i + *n - - if j >= len(items) { - j = len(items) - } - + j := min(i+*n, len(items)) result := items[i:j] nextLast := "" diff --git a/src/server/v2.0/handler/project.go b/src/server/v2.0/handler/project.go index 683a4827bed..acc1d47b0d3 100644 --- a/src/server/v2.0/handler/project.go +++ b/src/server/v2.0/handler/project.go @@ -17,6 +17,7 @@ package handler import ( "context" "fmt" + "slices" "strconv" "strings" "sync" @@ -795,13 +796,12 @@ func (a *projectAPI) validateProjectReq(ctx context.Context, req *models.Project if err != nil { return fmt.Errorf("failed to get the registry %d: %v", *req.RegistryID, err) } + permitted := false - for _, t := range config.GetPermittedRegistryTypesForProxyCache() { - if string(registry.Type) == t { - permitted = true - break - } + if slices.Contains(config.GetPermittedRegistryTypesForProxyCache(), string(registry.Type)) { + permitted = true } + if !permitted { return errors.BadRequestError(fmt.Errorf("unsupported registry type %s", string(registry.Type))) } diff --git a/src/server/v2.0/handler/util.go b/src/server/v2.0/handler/util.go index f748fbbed90..0309c88d911 100644 --- a/src/server/v2.0/handler/util.go +++ b/src/server/v2.0/handler/util.go @@ -48,7 +48,7 @@ func parseScanReportMimeTypes(header *string) []string { var mimeTypes []string if header != nil { - for _, mimeType := range strings.Split(*header, ",") { + for mimeType := range strings.SplitSeq(*header, ",") { mimeType = strings.TrimSpace(mimeType) switch mimeType { case v1.MimeTypeNativeReport, v1.MimeTypeGenericVulnerabilityReport: diff --git a/src/testing/job/mock_client.go b/src/testing/job/mock_client.go index 69e001b0a34..d7f927c1e12 100644 --- a/src/testing/job/mock_client.go +++ b/src/testing/job/mock_client.go @@ -3,6 +3,7 @@ package job import ( "fmt" "math/rand" + "slices" "github.com/goharbor/harbor/src/common/http" "github.com/goharbor/harbor/src/common/job/models" @@ -54,10 +55,5 @@ func (mjc *MockJobClient) GetExecutions(uuid string) ([]job.Stats, error) { } func (mjc *MockJobClient) validUUID(uuid string) bool { - for _, u := range mjc.JobUUID { - if uuid == u { - return true - } - } - return false + return slices.Contains(mjc.JobUUID, uuid) } diff --git a/src/testing/mock/mock.go b/src/testing/mock/mock.go index 3cad03f62c0..b095535f411 100644 --- a/src/testing/mock/mock.go +++ b/src/testing/mock/mock.go @@ -53,7 +53,7 @@ func OnAnything(obj any, methodName string) *mock.Call { } args := []any{} - for i := 0; i < fnType.NumIn(); i++ { + for range fnType.NumIn() { args = append(args, mock.Anything) } From c0b22d8e24d3737d27e415cd0577e9021e096fd4 Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Thu, 19 Jun 2025 20:47:04 +0800 Subject: [PATCH 43/55] Add environment variable add network_type env (#22097) Use test_network_type to adapt to various network conditions in the test environment. Signed-off-by: stonezdj --- tests/e2e_setup/e2e_container.sh | 3 ++- tests/resources/Docker-Util.robot | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/e2e_setup/e2e_container.sh b/tests/e2e_setup/e2e_container.sh index d08efa0de7a..aaf27d92c39 100755 --- a/tests/e2e_setup/e2e_container.sh +++ b/tests/e2e_setup/e2e_container.sh @@ -3,5 +3,6 @@ HARBOR_SRC_FOLDER=$(realpath ../../) echo ${HARBOR_SRC_FOLDER} -docker run -it --privileged -v /var/log/harbor:/var/log/harbor -v /etc/hosts:/etc/hosts -v ${HARBOR_SRC_FOLDER}:/drone -v ${HARBOR_SRC_FOLDER}/tests/harbor_ca.crt:/ca/ca.crt -v /dev/shm:/dev/shm -w /drone registry.goharbor.io/harbor-ci/goharbor/harbor-e2e-engine:latest-ui /bin/bash +# If the testbed network type is private need to set NETWORK_TYPE private, default is public +docker run -it --privileged -v /var/log/harbor:/var/log/harbor -v /etc/hosts:/etc/hosts -v ${HARBOR_SRC_FOLDER}:/drone -v ${HARBOR_SRC_FOLDER}/tests/harbor_ca.crt:/ca/ca.crt -v /dev/shm:/dev/shm -e NETWORK_TYPE=public -w /drone registry.goharbor.io/harbor-ci/goharbor/harbor-e2e-engine:latest-ui /bin/bash diff --git a/tests/resources/Docker-Util.robot b/tests/resources/Docker-Util.robot index 930bce6e614..c8d3b5f8b11 100644 --- a/tests/resources/Docker-Util.robot +++ b/tests/resources/Docker-Util.robot @@ -17,6 +17,12 @@ Documentation This resource provides helper functions for docker operations Library OperatingSystem Library Process +*** Variables *** +# Define variables for start dockerd within private network +${DOCKERD_CMD} dockerd +${DOCKERD_ARGS} --iptables=false +${LOG_FILE} ./docker-daemon.log + *** Keywords *** Run Docker Info [Arguments] ${docker-params} @@ -115,12 +121,22 @@ Get Container IP # docker:1.13-dind # If you are running this keyword in a container, make sure it is run with --privileged turned on Start Docker Daemon Locally + ${test_network_type}= Get Environment Variable NETWORK_TYPE public + Log To Console current test_network_type: ${test_network_type} ${pid}= Run pidof dockerd #${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/docker_config.sh #Log ${output} #Should Be Equal As Integers ${rc} 0 Return From Keyword If '${pid}' != '${EMPTY}' OperatingSystem.File Should Exist /usr/local/bin/dockerd-entrypoint.sh + ${handle}= Set Variable "" + IF '${test_network_type}' == 'private' + Log To Console network type is private + ${handle}= Start Process ${DOCKERD_CMD} ${DOCKERD_ARGS} stdout=${LOG_FILE} stderr=${LOG_FILE} shell=Tr + ELSE IF '${test_network_type}' == 'public' + Log To Console network type is public + ${handle}= Start Process /usr/local/bin/dockerd-entrypoint.sh dockerd>./daemon-docker-local.log 2>&1 shell=True + END ${handle}= Start Process /usr/local/bin/dockerd-entrypoint.sh dockerd>./daemon-local.log 2>&1 shell=True Process Should Be Running ${handle} FOR ${IDX} IN RANGE 5 From 918aac61a6c488afde81056091b559020eeb14f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:17:48 +0000 Subject: [PATCH 44/55] chore(deps): bump github.com/volcengine/volcengine-go-sdk from 1.1.11 to 1.1.17 in /src (#22089) chore(deps): bump github.com/volcengine/volcengine-go-sdk in /src Bumps [github.com/volcengine/volcengine-go-sdk](https://github.com/volcengine/volcengine-go-sdk) from 1.1.11 to 1.1.17. - [Release notes](https://github.com/volcengine/volcengine-go-sdk/releases) - [Commits](https://github.com/volcengine/volcengine-go-sdk/compare/v1.1.11...v1.1.17) --- updated-dependencies: - dependency-name: github.com/volcengine/volcengine-go-sdk dependency-version: 1.1.17 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: miner --- src/go.mod | 2 +- src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/go.mod b/src/go.mod index 37f3181477a..b5fbe4887d8 100644 --- a/src/go.mod +++ b/src/go.mod @@ -56,7 +56,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible github.com/vmihailenco/msgpack/v5 v5.4.1 - github.com/volcengine/volcengine-go-sdk v1.1.11 + github.com/volcengine/volcengine-go-sdk v1.1.17 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.59.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 go.opentelemetry.io/otel v1.35.0 diff --git a/src/go.sum b/src/go.sum index e1c02ab971c..e60c68fcba1 100644 --- a/src/go.sum +++ b/src/go.sum @@ -564,8 +564,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/volcengine/volc-sdk-golang v1.0.23 h1:anOslb2Qp6ywnsbyq9jqR0ljuO63kg9PY+4OehIk5R8= github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU= -github.com/volcengine/volcengine-go-sdk v1.1.11 h1:TZk2klExlL1hrLp02whgKQ9UTsFjaI+srl3ItjG6ZSY= -github.com/volcengine/volcengine-go-sdk v1.1.11/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= +github.com/volcengine/volcengine-go-sdk v1.1.17 h1:Izrcx/FERzGvpY3ufPjt4GR7Ak6y94aMVXbnLmeuw2g= +github.com/volcengine/volcengine-go-sdk v1.1.17/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From 937e5920a2a7ee97a29043c814d7ebd74c9db105 Mon Sep 17 00:00:00 2001 From: miner Date: Mon, 23 Jun 2025 15:10:51 +0800 Subject: [PATCH 45/55] update robot case for get harbor version (#22104) --- tests/resources/Harbor-Util.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/resources/Harbor-Util.robot b/tests/resources/Harbor-Util.robot index 550d55bd2a4..186091dafff 100644 --- a/tests/resources/Harbor-Util.robot +++ b/tests/resources/Harbor-Util.robot @@ -159,5 +159,5 @@ Wait for Harbor Ready Fail Harbor failed to come up properly! Get Harbor Version - ${rc} ${output}= Run And Return Rc And Output curl -k -X GET --header 'Accept: application/json' 'https://${ip}/api/v2.0/systeminfo'|grep -i harbor_version + ${rc} ${output}= Run And Return Rc And Output curl -k -X GET -u ${HARBOR_ADMIN}:${HARBOR_PASSWORD} --header 'Accept: application/json' 'https://${ip}/api/v2.0/systeminfo'|grep -i harbor_version Log To Console ${output} From e1e807072cc9408843716825bf87a171250eccfc Mon Sep 17 00:00:00 2001 From: Chethan Date: Mon, 23 Jun 2025 12:51:44 +0530 Subject: [PATCH 46/55] Update CHANGELOG.md, RELEASES.md and ROADMAP.md (#22095) Signed-off-by: chethanm99 --- CHANGELOG.md | 18 +++++++++--------- RELEASES.md | 14 +++++++------- ROADMAP.md | 6 +++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b816aebdd0..139aa96187e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,10 +31,10 @@ API explorer integration. End users can now explore and trigger Harbor’s API v * Support Image Retag, enables the user to tag image to different repositories and projects, this is particularly useful in cases when images need to be retagged programmatically in a CI pipeline. * Support Image Build History, makes it easy to see the contents of a container image, refer to the [User Guide](https://github.com/goharbor/harbor/blob/release-1.7.0/docs/user_guide.md#build-history). * Support Logger customization, enables the user to customize STDOUT / STDERR / FILE / DB logger of running jobs. -* Improve user experience of Helm Chart Repository: - - Chart searching included in the global search results - - Show chart versions total number in the chart list - - Mark labels to helm charts +* Improve the user experience of Helm Chart Repository: + - Chart searching is included in the global search results + - Show the total number of chart versions in the chart list + - Mark labels in helm charts - The latest version can be downloaded as default one on the chart list view - The chart can be deleted by deleting all the versions under it @@ -58,7 +58,7 @@ API explorer integration. End users can now explore and trigger Harbor’s API v - Replication policy rework to support wildcard, scheduled replication. - Support repository level description. - Batch operation on projects/repositories/users from UI. -- On board LDAP user when adding member to a project. +- On board LDAP user when adding a member to a project. ## v1.3.0 (2018-01-04) @@ -75,11 +75,11 @@ API explorer integration. End users can now explore and trigger Harbor’s API v ## v1.1.0 (2017-04-18) - Add in Notary support -- User can update configuration through Harbor UI +- User can update the configuration through Harbor UI - Redesign of Harbor's UI using Clarity - Some changes to API -- Fix some security issues in token service -- Upgrade base image of nginx for latest openssl version +- Fix some security issues in the token service +- Upgrade the base image of nginx to the latest openssl version - Various bug fixes. ## v0.5.0 (2016-12-6) @@ -88,7 +88,7 @@ API explorer integration. End users can now explore and trigger Harbor’s API v - Easier configuration for HTTPS in prepare script - Script to collect logs of a Harbor deployment - User can view the storage usage (default location) of Harbor. -- Add an attribute to disable normal user to create project +- Add an attribute to disable normal users from creating projects. - Various bug fixes. For Harbor virtual appliance: diff --git a/RELEASES.md b/RELEASES.md index 368cfa8f519..ad9fbded729 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,17 +1,17 @@ # Versioning and Release -This document describes the versioning and release process of Harbor. This document is a living document, contents will be updated according to each release. +This document describes the versioning and release process of Harbor. This document is a living document, it's contents will be updated according to each release. ## Releases Harbor releases will be versioned using dotted triples, similar to [Semantic Version](http://semver.org/). For this specific document, we will refer to the respective components of this triple as `..`. The version number may have additional information, such as "-rc1,-rc2,-rc3" to mark release candidate builds for earlier access. Such releases will be considered as "pre-releases". ### Major and Minor Releases -Major and minor releases of Harbor will be branched from `main` when the release reaches to `RC(release candidate)` state. The branch format should follow `release-..0`. For example, once the release `v1.0.0` reaches to RC, a branch will be created with the format `release-1.0.0`. When the release reaches to `GA(General Available)` state, The tag with format `v..` and should be made with command `git tag -s v..`. The release cadence is around 3 months, might be adjusted based on open source event, but will communicate it clearly. +Major and minor releases of Harbor will be branched from `main` when the release reaches to `RC(release candidate)` state. The branch format should follow `release-..0`. For example, once the release `v1.0.0` reaches to RC, a branch will be created with the format `release-1.0.0`. When the release reaches to `GA(General Available)` state, the tag with format `v..` and should be made with the command `git tag -s v..`. The release cadence is around 3 months, might be adjusted based on open source events, but will communicate it clearly. ### Patch releases Patch releases are based on the major/minor release branch, the release cadence for patch release of recent minor release is one month to solve critical community and security issues. The cadence for patch release of recent minus two minor releases are on-demand driven based on the severity of the issue to be fixed. ### Pre-releases -`Pre-releases:mainly the different RC builds` will be compiled from their corresponding branches. Please note they are done to assist in the stabilization process, no guarantees are provided. +`Pre-releases:mainly the different RC builds` will be compiled from their corresponding branches. Please note that they are done to assist in the stabilization process, no guarantees are provided. ### Minor Release Support Matrix | Version | Supported | @@ -22,7 +22,7 @@ Patch releases are based on the major/minor release branch, the release cadence ### Upgrade path and support policy -The upgrade path for Harbor is (1) 2.2.x patch releases are always compatible with its major and minor version. For example, previous released 2.2.x can be upgraded to most recent 2.2.3 release. (2) Harbor only supports two previous minor releases to upgrade to current minor release. For example, 2.3.0 will only support 2.1.0 and 2.2.0 to upgrade from, 2.0.0 to 2.3.0 is not supported. One should upgrade to 2.2.0 first, then to 2.3.0. +The upgrade path for Harbor is (1) 2.2.x patch releases are always compatible with its major and minor versions. For example, previous released 2.2.x can be upgraded to most recent 2.2.3 release. (2) Harbor only supports two previous minor releases to upgrade to current minor release. For example, 2.3.0 will only support 2.1.0 and 2.2.0 to upgrade from, 2.0.0 to 2.3.0 is not supported. One should upgrade to 2.2.0 first, then to 2.3.0. The Harbor project maintains release branches for the three most recent minor releases, each minor release will be maintained for approximately 9 months. ### Next Release @@ -33,12 +33,12 @@ The activity for next release will be tracked in the [up-to-date project board]( The following steps outline what to do when it's time to plan for and publish a release. Depending on the release (major/minor/patch), not all the following items are needed. 1. Prepare information about what's new in the release. - * For every release, update documentation for changes that have happened in the release. See the [goharbor/website](https://github.com/goharbor/website) repo for more details on how to create documentation for a release. All documentation for a release should be published by the time the release is out. + * For every release, update the documentation for changes that have happened in the release. See the [goharbor/website](https://github.com/goharbor/website) repo for more details on how to create documentation for a release. All documentation for a release should be published by the time the release is out. * For every release, write release notes. See [previous releases](https://github.com/goharbor/harbor/releases) for examples of what to include in release notes. - * For a major/minor release, write a blog post that highlights new features in the release. Plan to publish this the same day as the release. Highlight the themes, or areas of focus, for the release. Some examples of themes are security, bug fixes, feature improvements. If there are any new features or workflows introduced in a release, consider writing additional blog posts to help users learn about the new features. Plan to publish these after the release date (all blogs don’t have to be published all at once). + * For a major/minor release, write a blog post that highlights new features in the release. Plan to publish this on the same day as the release. Highlight the themes, or areas of focus, for the release. Some examples of themes are security, bug fixes, feature improvements. If there are any new features or workflows introduced in a release, consider writing additional blog posts to help users learn about the new features. Plan to publish these after the release date (all blogs don’t have to be published all at once). 1. Release a new version. Make the new version, docs updates, and blog posts available. 1. Announce the release and thank contributors. We should be doing the following for all releases. - * In all messages to the community include a brief list of highlights and links to the new release blog, release notes, or download location. Also include shoutouts to community member contribution included in the release. + * In all messages to the community include a brief list of highlights and links to the new release blog, release notes, or download location. Also include shoutouts to community members contributions included in the release. * Send an email to the community via the [mailing list](https://lists.cncf.io/g/harbor-users) * Post a message in the Harbor [slack channel](https://cloud-native.slack.com/archives/CC1E09J6S) * Post to social media. Maintainers are encouraged to also post or repost from the Harbor account to help spread the word. diff --git a/ROADMAP.md b/ROADMAP.md index 19f8fe1e8ea..641b6e877e0 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -9,11 +9,11 @@ This document provides a link to the [Harbor Project board](https://github.com/o Discussion on the roadmap can take place in threads under [Issues](https://github.com/goharbor/harbor/issues) or in [community meetings](https://goharbor.io/community/). Please open and comment on an issue if you want to provide suggestions and feedback to an item in the roadmap. Please review the roadmap to avoid potential duplicated effort. ### How to add an item to the roadmap? -Please open an issue to track any initiative on the roadmap of Harbor (Usually driven by new feature requests). We will work with and rely on our community to focus our efforts to improve Harbor. +Please open an issue to track any initiative on the roadmap of Harbor (Usually driven by new feature requests). We will work with and rely on our community to focus our efforts on improving Harbor. ### Current Roadmap -The following table includes the current roadmap for Harbor. If you have any questions or would like to contribute to Harbor, please attend a [community meeting](https://goharbor.io/community/) to discuss with our team. If you don't know where to start, we are always looking for contributors that will help us reduce technical, automation, and documentation debt. Please take the timelines & dates as proposals and goals. Priorities and requirements change based on community feedback, roadblocks encountered, community contributions, etc. If you depend on a specific item, we encourage you to attend community meetings to get updated status information, or help us deliver that feature by contributing to Harbor. +The following table includes the current roadmap for Harbor. If you have any questions or would like to contribute to Harbor, please attend a [community meeting](https://goharbor.io/community/) to discuss with our team. If you don't know where to start, we are always looking for contributors who will help us reduce technical, automation, and documentation debt. Please take the timelines & dates as proposals and goals. Priorities and requirements change based on community feedback, roadblocks encountered, community contributions, etc. If you depend on a specific item, we encourage you to attend community meetings to get updated status information, or help us deliver that feature by contributing to Harbor. `Last Updated: June 2022` @@ -49,4 +49,4 @@ The following table includes the current roadmap for Harbor. If you have any que |I&AM and RBAC|Improved Multi-tenancy through granular access and ability to manage teams of users and robot accounts through workspaces|Dec 2020| |Observability|Expose Harbor metrics through Prometheus Integration|Mar 2021| |Tracing|Leverage OpenTelemetry for enhanced tracing capabilities and identify bottlenecks and improve performance |Mar 2021| -|Image Signing|Leverage Sigstore Cosign to deliver persisting image signatures across image replications|Apr 2021| +|Image Signing|Leverage Sigstore Cosign to deliver persistent image signatures across image replications|Apr 2021| From b8e3dd8fa0779b75459574c4a4e8ba552eb26d10 Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Thu, 26 Jun 2025 14:05:02 +0800 Subject: [PATCH 47/55] change the pass-CI rules to exclude the resources and robot-cases folder (#22121) Change the pass-CI rules to exclude the resources and robot-cases folder Pass HARBOR_ADMIN env to robot testcases Signed-off-by: stonezdj --- .github/workflows/pass-CI.yml | 4 ++++ tests/ci/api_run.sh | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pass-CI.yml b/.github/workflows/pass-CI.yml index 24049ba7d95..d335d1b96e8 100644 --- a/.github/workflows/pass-CI.yml +++ b/.github/workflows/pass-CI.yml @@ -9,6 +9,8 @@ on: - '!tests/**.sh' - '!tests/apitests/**' - '!tests/ci/**' + - '!tests/resources/**' + - '!tests/robot-cases/**' push: paths: - 'docs/**' @@ -17,6 +19,8 @@ on: - '!tests/**.sh' - '!tests/apitests/**' - '!tests/ci/**' + - '!tests/resources/**' + - '!tests/robot-cases/**' jobs: UTTEST: diff --git a/tests/ci/api_run.sh b/tests/ci/api_run.sh index b348ea2ac6d..498e4057959 100755 --- a/tests/ci/api_run.sh +++ b/tests/ci/api_run.sh @@ -20,9 +20,9 @@ set +e docker ps # run db auth api cases if [ "$1" = 'DB' ]; then - docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --exclude proxy_cache -v DOCKER_USER:${DOCKER_USER} -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:Harbor12345 /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot + docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --exclude proxy_cache -v DOCKER_USER:"${DOCKER_USER}" -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:${HARBOR_ADMIN_PASSWD} -v HARBOR_ADMIN:${HARBOR_ADMIN} /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot elif [ "$1" = 'PROXY_CACHE' ]; then - docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --include setup --include proxy_cache -v DOCKER_USER:${DOCKER_USER} -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:Harbor12345 /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot + docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --include setup --include proxy_cache -v DOCKER_USER:"${DOCKER_USER}" -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:${HARBOR_ADMIN_PASSWD} -v HARBOR_ADMIN:${HARBOR_ADMIN} /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot elif [ "$1" = 'LDAP' ]; then # run ldap api cases python $DIR/../../tests/configharbor.py -H $IP -u $HARBOR_ADMIN -p $HARBOR_ADMIN_PASSWD -c auth_mode=ldap_auth \ @@ -31,7 +31,7 @@ elif [ "$1" = 'LDAP' ]; then ldap_search_password=admin \ ldap_base_dn=dc=example,dc=com \ ldap_uid=cn - docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot -v DOCKER_USER:${DOCKER_USER} -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:Harbor12345 /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_LDAP.robot + docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot -v DOCKER_USER:"${DOCKER_USER}" -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:${HARBOR_ADMIN_PASSWD} -v HARBOR_ADMIN:${HARBOR_ADMIN} /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_LDAP.robot else rc=999 fi From 0c5d82e9d497ab3778a6ccac63cdf4ee1a8fd66f Mon Sep 17 00:00:00 2001 From: miner Date: Tue, 1 Jul 2025 14:23:05 +0800 Subject: [PATCH 48/55] Update pipenv for prepare (#22124) * update pipenv and lock Signed-off-by: my036811 * update pipenv Signed-off-by: my036811 --------- Signed-off-by: my036811 --- make/photon/prepare/Dockerfile.base | 2 +- make/photon/prepare/Pipfile | 2 +- make/photon/prepare/Pipfile.lock | 165 +++++++++++----------------- 3 files changed, 67 insertions(+), 102 deletions(-) diff --git a/make/photon/prepare/Dockerfile.base b/make/photon/prepare/Dockerfile.base index e88bbb7da06..3df3256c9b1 100644 --- a/make/photon/prepare/Dockerfile.base +++ b/make/photon/prepare/Dockerfile.base @@ -1,7 +1,7 @@ FROM photon:5.0 RUN tdnf install -y python3 python3-pip python3-PyYAML python3-jinja2 && tdnf clean all -RUN pip3 install pipenv==2022.1.8 +RUN pip3 install pipenv==2025.0.3 #To install only htpasswd binary from photon package httpd RUN tdnf install -y rpm cpio apr-util diff --git a/make/photon/prepare/Pipfile b/make/photon/prepare/Pipfile index 61b85654f9f..efea2909bfc 100644 --- a/make/photon/prepare/Pipfile +++ b/make/photon/prepare/Pipfile @@ -12,4 +12,4 @@ pylint = "*" pytest = "*" [requires] -python_version = "3.9.1" +python_version = "3.13" diff --git a/make/photon/prepare/Pipfile.lock b/make/photon/prepare/Pipfile.lock index c087da94022..6856b3f634d 100644 --- a/make/photon/prepare/Pipfile.lock +++ b/make/photon/prepare/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "0c84f574a48755d88f78a64d754b3f834a72f2a86808370dd5f3bf3e650bfa13" + "sha256": "d3a89b8575c29b9f822b892ffd31fd4a997effb1ebf3e3ed061a41e2d04b4490" }, "pipfile-spec": 6, "requires": { - "python_version": "3.9.1" + "python_version": "3.13" }, "sources": [ { @@ -18,157 +18,122 @@ "default": { "click": { "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" + "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", + "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" ], "index": "pypi", - "version": "==8.0.1" + "markers": "python_version >= '3.10'", + "version": "==8.2.1" }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "index": "pypi", - "version": "==20.9" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" + "markers": "python_version >= '3.8'", + "version": "==25.0" } }, "develop": { "astroid": { "hashes": [ - "sha256:4db03ab5fc3340cf619dbc25e42c2cc3755154ce6009469766d7143d1fc2ee4e", - "sha256:8a398dfce302c13f14bab13e2b14fe385d32b73f4e4853b9bdfb64598baa1975" + "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", + "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce" ], - "markers": "python_version ~= '3.6'", - "version": "==2.5.6" + "markers": "python_full_version >= '3.9.0'", + "version": "==3.3.10" }, - "attrs": { + "dill": { "hashes": [ - "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", - "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" + "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", + "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.2.0" + "markers": "python_version >= '3.8'", + "version": "==0.4.0" }, "iniconfig": { "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", + "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" ], - "version": "==1.1.1" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "isort": { "hashes": [ - "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6", - "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d" + "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", + "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615" ], - "markers": "python_version >= '3.6' and python_version < '4.0'", - "version": "==5.8.0" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", - "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", - "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", - "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", - "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", - "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", - "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", - "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", - "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", - "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", - "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", - "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", - "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", - "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", - "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", - "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", - "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", - "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", - "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", - "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", - "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", - "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.6.0" + "markers": "python_full_version >= '3.9.0'", + "version": "==6.0.1" }, "mccabe": { "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" ], - "version": "==0.6.1" + "markers": "python_version >= '3.6'", + "version": "==0.7.0" }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "index": "pypi", - "version": "==20.9" + "markers": "python_version >= '3.8'", + "version": "==25.0" }, - "pluggy": { + "platformdirs": { "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", + "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" + "markers": "python_version >= '3.9'", + "version": "==4.3.8" }, - "py": { + "pluggy": { "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.10.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, - "pylint": { + "pygments": { "hashes": [ - "sha256:586d8fa9b1891f4b725f587ef267abe2a1bad89d6b184520c7f07a253dd6e217", - "sha256:f7e2072654a6b6afdf5e2fb38147d3e2d2d43c89f648637baab63e026481279b" + "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", + "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" ], - "index": "pypi", - "version": "==2.8.2" + "markers": "python_version >= '3.8'", + "version": "==2.19.2" }, - "pyparsing": { + "pylint": { "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", + "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" + "index": "pypi", + "markers": "python_full_version >= '3.9.0'", + "version": "==3.3.7" }, "pytest": { "hashes": [ - "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b", - "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" + "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", + "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" ], "index": "pypi", - "version": "==6.2.4" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" + "markers": "python_version >= '3.9'", + "version": "==8.4.1" }, - "wrapt": { + "tomlkit": { "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" + "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", + "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0" ], - "version": "==1.12.1" + "markers": "python_version >= '3.8'", + "version": "==0.13.3" } } } From 0f8913bb275b8975684a7e4fee87f689d1ed4f1c Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Tue, 1 Jul 2025 15:33:05 +0800 Subject: [PATCH 49/55] feat: support customize the job execution retention count by env (#22129) Signed-off-by: chlins --- src/jobservice/job/known_jobs.go | 28 ++++++----- src/lib/env.go | 35 ++++++++++++++ src/lib/env_test.go | 83 ++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 13 deletions(-) create mode 100644 src/lib/env.go create mode 100644 src/lib/env_test.go diff --git a/src/jobservice/job/known_jobs.go b/src/jobservice/job/known_jobs.go index 3572e495716..1bd0ccd7003 100644 --- a/src/jobservice/job/known_jobs.go +++ b/src/jobservice/job/known_jobs.go @@ -14,6 +14,8 @@ package job +import "github.com/goharbor/harbor/src/lib" + // Define the register name constants of known jobs const ( @@ -53,19 +55,19 @@ const ( var ( // executionSweeperCount stores the count for execution retained executionSweeperCount = map[string]int64{ - ImageScanJobVendorType: 1, - SBOMJobVendorType: 1, - ScanAllVendorType: 1, - PurgeAuditVendorType: 10, - ExecSweepVendorType: 10, - GarbageCollectionVendorType: 50, - SlackJobVendorType: 50, - WebhookJobVendorType: 50, - ReplicationVendorType: 50, - ScanDataExportVendorType: 50, - SystemArtifactCleanupVendorType: 50, - P2PPreheatVendorType: 50, - RetentionVendorType: 50, + ImageScanJobVendorType: lib.GetEnvInt64("IMAGE_SCAN_EXECUTION_RETENTION_COUNT", 1), + SBOMJobVendorType: lib.GetEnvInt64("SBOM_EXECUTION_RETENTION_COUNT", 1), + ScanAllVendorType: lib.GetEnvInt64("SCAN_ALL_EXECUTION_RETENTION_COUNT", 1), + PurgeAuditVendorType: lib.GetEnvInt64("PURGE_AUDIT_EXECUTION_RETENTION_COUNT", 10), + ExecSweepVendorType: lib.GetEnvInt64("EXECUTION_SWEEP_EXECUTION_RETENTION_COUNT", 10), + GarbageCollectionVendorType: lib.GetEnvInt64("GARBAGE_COLLECTION_EXECUTION_RETENTION_COUNT", 50), + SlackJobVendorType: lib.GetEnvInt64("SLACK_EXECUTION_RETENTION_COUNT", 50), + WebhookJobVendorType: lib.GetEnvInt64("WEBHOOK_EXECUTION_RETENTION_COUNT", 50), + ReplicationVendorType: lib.GetEnvInt64("REPLICATION_EXECUTION_RETENTION_COUNT", 50), + ScanDataExportVendorType: lib.GetEnvInt64("SCAN_DATA_EXPORT_EXECUTION_RETENTION_COUNT", 50), + SystemArtifactCleanupVendorType: lib.GetEnvInt64("SYSTEM_ARTIFACT_CLEANUP_EXECUTION_RETENTION_COUNT", 50), + P2PPreheatVendorType: lib.GetEnvInt64("P2P_PREHEAT_EXECUTION_RETENTION_COUNT", 50), + RetentionVendorType: lib.GetEnvInt64("RETENTION_EXECUTION_RETENTION_COUNT", 50), } ) diff --git a/src/lib/env.go b/src/lib/env.go new file mode 100644 index 00000000000..1c3b2f53092 --- /dev/null +++ b/src/lib/env.go @@ -0,0 +1,35 @@ +// Copyright Project Harbor Authors +// +// 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. + +package lib + +import ( + "os" + "strconv" +) + +// GetEnvInt64 reads an environment variable and converts it to an int64, returning the default value if not set or invalid. +func GetEnvInt64(envKey string, defaultValue int64) int64 { + value := os.Getenv(envKey) + if value == "" { + return defaultValue + } + + intValue, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return defaultValue + } + + return intValue +} diff --git a/src/lib/env_test.go b/src/lib/env_test.go new file mode 100644 index 00000000000..45b772cb068 --- /dev/null +++ b/src/lib/env_test.go @@ -0,0 +1,83 @@ +package lib + +import ( + "os" + "testing" +) + +func TestGetEnvInt64(t *testing.T) { + tests := []struct { + name string + envKey string + envValue string + defaultValue int64 + setEnv bool + expectedValue int64 + }{ + { + name: "env set with valid value", + envKey: "TEST_ENV", + envValue: "100", + defaultValue: 50, + setEnv: true, + expectedValue: 100, + }, + { + name: "env not set", + envKey: "UNSET_ENV", + envValue: "", + defaultValue: 50, + setEnv: false, + expectedValue: 50, + }, + { + name: "env set with invalid value", + envKey: "INVALID_ENV", + envValue: "not_a_number", + defaultValue: 50, + setEnv: true, + expectedValue: 50, + }, + { + name: "env set with zero", + envKey: "ZERO_ENV", + envValue: "0", + defaultValue: 50, + setEnv: true, + expectedValue: 0, + }, + { + name: "env set with negative value", + envKey: "NEGATIVE_ENV", + envValue: "-10", + defaultValue: 50, + setEnv: true, + expectedValue: -10, + }, + { + name: "env set with large value", + envKey: "LARGE_ENV", + envValue: "9223372036854775807", + defaultValue: 50, + setEnv: true, + expectedValue: 9223372036854775807, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.setEnv { + os.Setenv(tt.envKey, tt.envValue) + } else { + os.Unsetenv(tt.envKey) + } + + result := GetEnvInt64(tt.envKey, tt.defaultValue) + if result != tt.expectedValue { + t.Errorf("GetEnvInt64(%q, %d) = %d; want %d", tt.envKey, tt.defaultValue, result, tt.expectedValue) + } + + os.Unsetenv(tt.envKey) + }) + } +} From 229ef886842b2f4ebd54bd8e2b273a45ec07df1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 08:19:14 +0000 Subject: [PATCH 50/55] chore(deps): bump github.com/volcengine/volcengine-go-sdk from 1.1.17 to 1.1.19 in /src (#22133) chore(deps): bump github.com/volcengine/volcengine-go-sdk in /src --- updated-dependencies: - dependency-name: github.com/volcengine/volcengine-go-sdk dependency-version: 1.1.19 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: miner --- src/go.mod | 2 +- src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/go.mod b/src/go.mod index b5fbe4887d8..a7c25faa3e9 100644 --- a/src/go.mod +++ b/src/go.mod @@ -56,7 +56,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible github.com/vmihailenco/msgpack/v5 v5.4.1 - github.com/volcengine/volcengine-go-sdk v1.1.17 + github.com/volcengine/volcengine-go-sdk v1.1.19 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.59.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 go.opentelemetry.io/otel v1.35.0 diff --git a/src/go.sum b/src/go.sum index e60c68fcba1..55263539a0c 100644 --- a/src/go.sum +++ b/src/go.sum @@ -564,8 +564,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/volcengine/volc-sdk-golang v1.0.23 h1:anOslb2Qp6ywnsbyq9jqR0ljuO63kg9PY+4OehIk5R8= github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU= -github.com/volcengine/volcengine-go-sdk v1.1.17 h1:Izrcx/FERzGvpY3ufPjt4GR7Ak6y94aMVXbnLmeuw2g= -github.com/volcengine/volcengine-go-sdk v1.1.17/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= +github.com/volcengine/volcengine-go-sdk v1.1.19 h1:+jLVMqDtdtiAt8QGBk6AMiEg22Br5SZGu2FSHUrIcU0= +github.com/volcengine/volcengine-go-sdk v1.1.19/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From 6be29719415b25d85ac3280a30bd090ac843c028 Mon Sep 17 00:00:00 2001 From: Sergey <81344204+sergey-akhmineev@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:57:27 +0900 Subject: [PATCH 51/55] Add Russian language support (#21083) * Add Russian language support Signed-off-by: Sergey Akhmineev * Update ru-ru-lang.json Made edits to the translation based on comments Signed-off-by: Sergey <81344204+sergey-akhmineev@users.noreply.github.com> * Update ru-ru-lang.json Signed-off-by: Sergey <81344204+sergey-akhmineev@users.noreply.github.com> * Update ru-ru-lang.json Signed-off-by: Sergey <81344204+sergey-akhmineev@users.noreply.github.com> * Update ru-ru-lang.json Signed-off-by: Sergey <81344204+sergey-akhmineev@users.noreply.github.com> --------- Signed-off-by: Sergey Akhmineev Signed-off-by: Sergey <81344204+sergey-akhmineev@users.noreply.github.com> Co-authored-by: Sergey Akhmineev Co-authored-by: Orlix <7236111+OrlinVasilev@users.noreply.github.com> --- .../src/app/shared/entities/shared.const.ts | 2 + src/portal/src/i18n/lang/ru-ru-lang.json | 1847 +++++++++++++++++ 2 files changed, 1849 insertions(+) create mode 100644 src/portal/src/i18n/lang/ru-ru-lang.json diff --git a/src/portal/src/app/shared/entities/shared.const.ts b/src/portal/src/app/shared/entities/shared.const.ts index 258eacfa14e..0102b2f7d14 100644 --- a/src/portal/src/app/shared/entities/shared.const.ts +++ b/src/portal/src/app/shared/entities/shared.const.ts @@ -21,6 +21,7 @@ import locale_fr from '@angular/common/locales/fr'; import locale_pt from '@angular/common/locales/pt-PT'; import locale_tr from '@angular/common/locales/tr'; import locale_de from '@angular/common/locales/de'; +import locale_ru from '@angular/common/locales/ru'; import { ClrCommonStrings } from '@clr/angular/utils/i18n/common-strings.interface'; export const enum AlertType { @@ -261,6 +262,7 @@ export const LANGUAGES = { 'pt-br': ['PortuguÃĒs do Brasil', locale_pt], 'tr-tr': ['TÃŧrkçe', locale_tr], 'de-de': ['Deutsch', locale_de], + 'ru-ru': ['Đ ŅƒŅŅĐēиК', locale_ru], } as const; export const supportedLangs = Object.keys(LANGUAGES) as SupportedLanguage[]; /** diff --git a/src/portal/src/i18n/lang/ru-ru-lang.json b/src/portal/src/i18n/lang/ru-ru-lang.json new file mode 100644 index 00000000000..c37a1642771 --- /dev/null +++ b/src/portal/src/i18n/lang/ru-ru-lang.json @@ -0,0 +1,1847 @@ +{ + "APP_TITLE": { + "VMW_HARBOR": "Harbor", + "HARBOR": "Harbor", + "VIC": "vSphere Integrated Containers", + "MGMT": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ", + "REG": "Đ ĐĩĐĩҁ҂Ҁ", + "HARBOR_SWAGGER": "Harbor Swagger", + "THEME_DARK_TEXT": "ĐĸЕМНĐĢЙ", + "THEME_LIGHT_TEXT": "СВЕĐĸЛĐĢЙ" + }, + "SIGN_IN": { + "REMEMBER": "ЗаĐŋĐžĐŧĐŊĐ¸Ņ‚ŅŒ ĐŧĐĩĐŊŅ", + "INVALID_MSG": "НĐĩвĐĩŅ€ĐŊĐžĐĩ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ иĐģи ĐŋĐ°Ņ€ĐžĐģҌ.", + "FORGOT_PWD": "Đ—Đ°ĐąŅ‹Đģи ĐŋĐ°Ņ€ĐžĐģҌ", + "HEADER_LINK": "Đ’ĐžĐšŅ‚Đ¸", + "CORE_SERVICE_NOT_AVAILABLE": "ĐžŅĐŊОвĐŊĐ°Ņ ҁĐģ҃Đļйа ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊа.", + "OR": "ИЛИ", + "VIA_LOCAL_DB": "ВОЙĐĸИ ЧЕРЕЗ ЛОКАЛĐŦĐĐŖĐŽ Đ‘ĐĐ—ĐŖ ДАННĐĢĐĨ" + }, + "SIGN_UP": { + "TITLE": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ" + }, + "BUTTON": { + "STOP": "ОСĐĸАНОВИĐĸĐŦ", + "CANCEL": "ОĐĸМЕНА", + "OK": "ОК", + "DELETE": "ĐŖĐ”ĐĐ›Đ˜ĐĸĐŦ", + "LOG_IN": "ВОЙĐĸИ", + "LOG_IN_OIDC": "Đ’ĐžĐšŅ‚Đ¸ ҇ĐĩŅ€ĐĩС OIDC ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€", + "SIGN_UP_LINK": "Đ—Đ°Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒŅŅ", + "SIGN_UP": "ЗАРЕГИСĐĸРИРОВАĐĸĐŦĐĄĐ¯", + "CONFIRM": "ПОДĐĸВЕРДИĐĸĐŦ", + "SEND": "ОĐĸПРАВИĐĸĐŦ", + "SAVE": "СОĐĨРАНИĐĸĐŦ", + "TEST_MAIL": "ПРОВЕРИĐĸĐŦ ПОЧĐĸОВĐĢЙ СЕРВЕР", + "CLOSE": "ЗАКРĐĢĐĸĐŦ", + "TEST_LDAP": "ПРОВЕРИĐĸĐŦ LDAP СЕРВЕР", + "TEST_OIDC": "ПРОВЕРИĐĸĐŦ OIDC СЕРВЕР", + "MORE_INFO": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ...", + "YES": "ДА", + "NO": "НЕĐĸ", + "NEGATIVE": "ОĐĸРИĐĻАĐĸЕЛĐŦНО", + "COPY": "КОПИРОВАĐĸĐŦ", + "EDIT": "РЕДАКĐĸИРОВАĐĸĐŦ", + "SWITCH": "ПЕРЕКЛЮЧИĐĸĐŦ", + "REPLICATE": "РЕПЛИĐĻИРОВАĐĸĐŦ", + "ACTIONS": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ", + "BROWSE": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ", + "UPLOAD": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ", + "NO_FILE": "ФаКĐģ ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊ", + "ADD": "ДОБАВИĐĸĐŦ", + "RUN": "Đ—ĐĐŸĐŖĐĄĐĸИĐĸĐŦ", + "CONTINUE": "ПРОДОЛЖИĐĸĐŦ", + "ENABLE": "ВКЛЮЧИĐĸĐŦ", + "DISABLE": "ОĐĸКЛЮЧИĐĸĐŦ" + }, + "BATCH": { + "DELETED_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐž", + "DELETED_FAILURE": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ иĐģи Ņ‡Đ°ŅŅ‚Đ¸Ņ‡ĐŊĐž ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ", + "SWITCH_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊĐž", + "SWITCH_FAILURE": "ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ", + "REPLICATE_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊĐž", + "REPLICATE_FAILURE": "ЗаĐŋ҃ҁĐē ĐŊĐĩ ŅƒĐ´Đ°ĐģŅŅ", + "STOP_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "STOP_FAILURE": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ", + "TIME_OUT": "ШĐģŅŽĐˇ ĐŊĐĩ ĐžŅ‚Đ˛ĐĩŅ‡Đ°ĐĩŅ‚" + }, + "TOOLTIP": { + "NAME_FILTER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐž иĐŧĐĩĐŊи Ņ€ĐĩŅŅƒŅ€ŅĐ°. ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐŋŅƒŅŅ‚Ņ‹Đŧ иĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ '**' Đ´ĐģŅ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Ņ Đ˛ŅĐĩĐŧ. 'library/**' ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ€ĐĩŅŅƒŅ€ŅĐ°Đŧ ĐŋОд 'library'. ДĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ŅˆĐ°ĐąĐģĐžĐŊОв ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē Ņ€ŅƒĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛Ņƒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ.", + "TAG_FILTER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐž Ņ‚ĐĩĐŗŅƒ/вĐĩŅ€ŅĐ¸Đ¸ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛. ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐŋŅƒŅŅ‚Ņ‹Đŧ иĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ '**' Đ´ĐģŅ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Ņ Đ˛ŅĐĩĐŧ. '1.0*' ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ‚ĐĩĐŗĐ°Đŧ, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐŧŅŅ ҁ '1.0'. ДĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ŅˆĐ°ĐąĐģĐžĐŊОв ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē Ņ€ŅƒĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛Ņƒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ.", + "LABEL_FILTER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ĐŋĐž ĐŧĐĩŅ‚ĐēаĐŧ.", + "RESOURCE_FILTER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐž Ņ‚Đ¸Đŋ҃ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛.", + "PUSH_BASED": "ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ҁ ĐģĐžĐēаĐģҌĐŊĐžĐŗĐž Harbor ĐŊа ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš Ņ€ĐĩĐĩҁ҂Ҁ.", + "PULL_BASED": "ПоĐģŅƒŅ‡Đ°Ņ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ҁ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Ņ€ĐĩĐĩŅŅ‚Ņ€Đ° ĐŊа ĐģĐžĐēаĐģҌĐŊŅ‹Đš Harbor.", + "DESTINATION_NAMESPACE": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ ҆ĐĩĐģĐĩвОĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž иĐŧĐĩĐŊ. Đ•ŅĐģи ĐŋŅƒŅŅ‚Đž, Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐžĐŧĐĩ҉ĐĩĐŊŅ‹ в Ņ‚Đž ĐļĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž иĐŧĐĩĐŊ, Ņ‡Ņ‚Đž и Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐē.", + "OVERRIDE": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ, ҁĐģĐĩĐ´ŅƒĐĩŅ‚ Đģи ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ в ĐŧĐĩҁ҂Đĩ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ, ĐĩҁĐģи Ņ€ĐĩŅŅƒŅ€Ņ ҁ Ņ‚Đ°ĐēиĐŧ ĐļĐĩ иĐŧĐĩĐŊĐĩĐŧ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", + "EMAIL": "ĐŸĐžŅ‡Ņ‚Đ° Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧ Đ°Đ´Ņ€ĐĩŅĐžĐŧ, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ name@example.com.", + "USER_NAME": "НĐĩ ĐŧĐžĐļĐĩŅ‚ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹ и ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐ°Ņ Đ´ĐģиĐŊа Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ 255 ŅĐ¸ĐŧвОĐģОв.", + "FULL_NAME": "МаĐēŅĐ¸ĐŧаĐģҌĐŊĐ°Ņ Đ´ĐģиĐŊа Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ 20 ŅĐ¸ĐŧвОĐģОв.", + "COMMENT": "ДĐģиĐŊа ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Ņ Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ ĐŧĐĩĐŊĐĩĐĩ 30 ŅĐ¸ĐŧвОĐģОв.", + "CURRENT_PWD": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ĐŋĐ°Ņ€ĐžĐģҌ.", + "PASSWORD": "ĐŸĐ°Ņ€ĐžĐģҌ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ Đ´ĐģиĐŊОК ĐžŅ‚ 8 Đ´Đž 20 ŅĐ¸ĐŧвОĐģОв ҁ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊОК ĐˇĐ°ĐŗĐģавĐŊОК ĐąŅƒĐēвОК, ОдĐŊОК ŅŅ‚Ņ€ĐžŅ‡ĐŊОК ĐąŅƒĐēвОК и ОдĐŊОК Ņ†Đ¸Ņ„Ņ€ĐžĐš.", + "CONFIRM_PWD": "ĐŸĐ°Ņ€ĐžĐģи ĐŊĐĩ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚.", + "SIGN_IN_USERNAME": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ.", + "SIGN_IN_PWD": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐ°Ņ€ĐžĐģҌ.", + "SIGN_UP_MAIL": "ĐŸĐžŅ‡Ņ‚Đ° Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐąŅ€ĐžŅĐ° ĐŋĐ°Ņ€ĐžĐģŅ.", + "SIGN_UP_REAL_NAME": "ИĐŧŅ и Ņ„Đ°ĐŧиĐģĐ¸Ņ", + "ITEM_REQUIRED": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž Đ´ĐģŅ СаĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ.", + "SCOPE_REQUIRED": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž Đ´ĐģŅ СаĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ОйĐģĐ°ŅŅ‚Đ¸.", + "NUMBER_REQUIRED": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž Đ´ĐģŅ СаĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ Ņ‡Đ¸ŅĐģаĐŧи.", + "PORT_REQUIRED": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž Đ´ĐģŅ СаĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧ ĐŊĐžĐŧĐĩŅ€ĐžĐŧ ĐŋĐžŅ€Ņ‚Đ°.", + "CRON_REQUIRED": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž Đ´ĐģŅ СаĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ cron.", + "EMAIL_EXISTING": "ĐĐ´Ņ€Đĩҁ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", + "USER_EXISTING": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ.", + "RULE_USER_EXISTING": "ИĐŧŅ ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ.", + "EMPTY": "ИĐŧŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "NONEMPTY": "НĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ", + "REPO_TOOLTIP": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒ ĐŊиĐēаĐēиĐĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐžĐąŅ€Đ°ĐˇĐ°Đŧи в ŅŅ‚ĐžĐŧ Ņ€ĐĩĐļиĐŧĐĩ.", + "ENDPOINT_FORMAT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа Đ´ĐžĐģĐļĐŊа ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ HTTP:// иĐģи HTTPS://.", + "OIDC_ENDPOINT_FORMAT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа Đ´ĐžĐģĐļĐŊа ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ HTTPS://.", + "OIDC_NAME": "ИĐŧŅ OIDC ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ°.", + "OIDC_ENDPOINT": "URL OIDC-ŅĐžĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°.", + "OIDC_SCOPE": "ОбĐģĐ°ŅŅ‚ŅŒ, ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧĐ°Ņ ĐŊа OIDC ҁĐĩŅ€Đ˛ĐĩŅ€ вО Đ˛Ņ€ĐĩĐŧŅ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸. ДоĐģĐļĐŊа ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ “openid” и “offline_access”. Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Google, ŅƒĐ´Đ°ĐģĐ¸Ņ‚Đĩ “offline_access” иС ŅŅ‚ĐžĐŗĐž ĐŋĐžĐģŅ.", + "OIDC_VERIFYCERT": "ĐĄĐŊиĐŧĐ¸Ņ‚Đĩ ŅŅ‚ĐžŅ‚ Ņ„ĐģаĐļĐžĐē, ĐĩҁĐģи Đ˛Đ°Ņˆ OIDC ҁĐĩŅ€Đ˛ĐĩŅ€ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊ ĐŊа ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊĐžĐŧ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đĩ.", + "OIDC_AUTOONBOARD": "ĐŸŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ŅĐēŅ€Đ°ĐŊ адаĐŋŅ‚Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ĐŊĐĩ ĐŧĐžĐŗ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐĩ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ. ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ иС ID Ņ‚ĐžĐēĐĩĐŊа", + "OIDC_USER_CLAIM": "ИĐŧŅ ŅƒŅ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ в ID Ņ‚ĐžĐēĐĩĐŊĐĩ, ĐžŅ‚ĐēŅƒĐ´Đ° иСвĐģĐĩĐēаĐĩŅ‚ŅŅ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ. Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊĐž, ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ 'name'", + "NEW_SECRET": "ĐĄĐĩĐēŅ€ĐĩŅ‚ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ Đ´ĐģиĐŊĐŊĐĩĐĩ 8 ŅĐ¸ĐŧвОĐģОв ҁ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊОК ĐˇĐ°ĐŗĐģавĐŊОК ĐąŅƒĐēвОК, ОдĐŊОК ŅŅ‚Ņ€ĐžŅ‡ĐŊОК ĐąŅƒĐēвОК и ОдĐŊОК Ņ†Đ¸Ņ„Ņ€ĐžĐš" + }, + "PLACEHOLDER": { + "CURRENT_PWD": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "NEW_PWD": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "CONFIRM_PWD": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "USER_NAME": "ВвĐĩĐ´Đ¸Ņ‚Đĩ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "MAIL": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ°Đ´Ņ€Đĩҁ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹", + "FULL_NAME": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŋĐžĐģĐŊĐžĐĩ иĐŧŅ", + "SIGN_IN_NAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "SIGN_IN_PWD": "ĐŸĐ°Ņ€ĐžĐģҌ" + }, + "PROFILE": { + "TITLE": "ĐŸŅ€ĐžŅ„Đ¸ĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "USER_NAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "EMAIL": "ĐŸĐžŅ‡Ņ‚Đ°", + "FULL_NAME": "ИĐŧŅ и Ņ„Đ°ĐŧиĐģĐ¸Ņ", + "COMMENT": "КоĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đ¸", + "PASSWORD": "ĐŸĐ°Ņ€ĐžĐģҌ", + "SAVE_SUCCESS": "ĐŸŅ€ĐžŅ„Đ¸ĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ.", + "ADMIN_RENAME_BUTTON": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "ADMIN_RENAME_TIP": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐēĐŊĐžĐŋĐē҃, Ņ‡Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐŊа \"admin@harbor.local\". Đ­Ņ‚Ņƒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ĐŊĐĩĐģŅŒĐˇŅ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ.", + "RENAME_SUCCESS": "ИĐŧŅ ҃ҁĐŋĐĩ҈ĐŊĐž иСĐŧĐĩĐŊĐĩĐŊĐž!", + "RENAME_CONFIRM_INFO": "ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊиĐĩ, иСĐŧĐĩĐŊĐĩĐŊиĐĩ иĐŧĐĩĐŊи ĐŊа admin@harbor.local ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž.", + "CLI_PASSWORD": "ĐĄĐĩĐēŅ€ĐĩŅ‚ CLI", + "CLI_PASSWORD_TIP": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ҁĐĩĐēŅ€ĐĩŅ‚ CLI ĐēаĐē ĐŋĐ°Ņ€ĐžĐģҌ ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии docker/helm cli Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Harbor.", + "COPY_SUCCESS": "҃ҁĐŋĐĩ҈ĐŊĐž ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "COPY_ERROR": "ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ", + "ADMIN_CLI_SECRET_BUTTON": "СГЕНЕРИРОВАĐĸĐŦ СЕКРЕĐĸ", + "ADMIN_CLI_SECRET_RESET_BUTTON": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐš ҁĐĩĐēŅ€ĐĩŅ‚", + "NEW_SECRET": "ĐĄĐĩĐēŅ€ĐĩŅ‚", + "CONFIRM_SECRET": "ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ввĐĩĐ´Đ¸Ņ‚Đĩ ҁĐĩĐēŅ€ĐĩŅ‚", + "GENERATE_SUCCESS": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ҁĐĩĐēŅ€ĐĩŅ‚Đ° CLI ĐŋŅ€ĐžŅˆĐģа ҃ҁĐŋĐĩ҈ĐŊĐž", + "GENERATE_ERROR": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ҁĐĩĐēŅ€ĐĩŅ‚Đ° CLI ĐŊĐĩ ŅƒĐ´Đ°ĐģĐ°ŅŅŒ", + "CONFIRM_TITLE_CLI_GENERATE": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁĐĩĐēŅ€ĐĩŅ‚?", + "CONFIRM_BODY_CLI_GENERATE": "Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩŅ‚Đĩ ҁĐĩĐēŅ€ĐĩŅ‚ CLI, ŅŅ‚Đ°Ņ€Ņ‹Đš ҁĐĩĐēŅ€ĐĩŅ‚ CLI ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚ĐąŅ€ĐžŅˆĐĩĐŊ" + }, + "CHANGE_PWD": { + "TITLE": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ", + "CURRENT_PWD": "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "NEW_PWD": "ĐĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "CONFIRM_PWD": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ", + "SAVE_SUCCESS": "ĐŸĐ°Ņ€ĐžĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ҃ҁĐŋĐĩ҈ĐŊĐž иСĐŧĐĩĐŊĐĩĐŊ.", + "PASS_TIPS": "ДĐģиĐŊа ĐžŅ‚ 8 Đ´Đž 128 ŅĐ¸ĐŧвОĐģОв ҁ 1 ĐˇĐ°ĐŗĐģавĐŊОК, 1 ŅŅ‚Ņ€ĐžŅ‡ĐŊОК ĐąŅƒĐēвОК и 1 Ņ†Đ¸Ņ„Ņ€ĐžĐš" + }, + "ACCOUNT_SETTINGS": { + "PROFILE": "ĐŸŅ€ĐžŅ„Đ¸ĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "CHANGE_PWD": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ", + "ABOUT": "О ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧĐĩ", + "LOGOUT": "Đ’Ņ‹ĐšŅ‚Đ¸" + }, + "GLOBAL_SEARCH": { + "PLACEHOLDER": "ĐŸĐžĐ¸ŅĐē {{param}}...", + "PLACEHOLDER_VIC": "ĐŸĐžĐ¸ŅĐē в Đ ĐĩĐĩҁ҂ҀĐĩ..." + }, + "TOP_NAV": { + "DATETIME_RENDERING_DEFAULT": "По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ" + }, + "SIDE_NAV": { + "DASHBOARD": "ПаĐŊĐĩĐģҌ ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ", + "PROJECTS": "ĐŸŅ€ĐžĐĩĐē҂ҋ", + "SYSTEM_MGMT": { + "NAME": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ", + "USER": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи", + "GROUP": "Đ“Ņ€ŅƒĐŋĐŋŅ‹", + "REGISTRY": "Đ ĐĩĐĩҁ҂Ҁҋ", + "REPLICATION": "Đ ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "CONFIG": "КоĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ", + "VULNERABILITY": "ĐŖŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸", + "GARBAGE_COLLECTION": "ĐĄĐąĐžŅ€Đēа ĐŧŅƒŅĐžŅ€Đ°", + "INTERROGATION_SERVICES": "ĐĄĐĩŅ€Đ˛Đ¸ŅŅ‹ ĐžĐŋŅ€ĐžŅĐ°" + }, + "LOGS": "Đ›ĐžĐŗĐ¸", + "TASKS": "Đ—Đ°Đ´Đ°Ņ‡Đ¸", + "API_EXPLORER": "Api Explorer", + "HARBOR_API_MANAGEMENT": "Harbor API V2.0", + "HELM_API_MANAGEMENT": "Harbor API", + "DISTRIBUTIONS": { + "NAME": "Đ Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ", + "INSTANCES": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€Ņ‹" + } + }, + "USER": { + "ADD_ACTION": "ĐĐžĐ˛Ņ‹Đš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ", + "ENABLE_ADMIN_ACTION": "СДЕЛАĐĸĐŦ АДМИНИСĐĸРАĐĸОРОМ", + "DISABLE_ADMIN_ACTION": "ОĐĸОЗВАĐĸĐŦ АДМИНИСĐĸРАĐĸОРА", + "DEL_ACTION": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "FILTER_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš", + "COLUMN_NAME": "ИĐŧŅ", + "COLUMN_ADMIN": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€", + "COLUMN_EMAIL": "ĐŸĐžŅ‡Ņ‚Đ°", + "COLUMN_REG_NAME": "Đ’Ņ€ĐĩĐŧŅ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸", + "IS_ADMIN": "Да", + "IS_NOT_ADMIN": "НĐĩŅ‚", + "ADD_USER_TITLE": "ĐĐžĐ˛Ņ‹Đš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ", + "SAVE_SUCCESS": "ĐĐžĐ˛Ņ‹Đš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊ.", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ {{param}}?", + "DELETE_SUCCESS": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹.", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "OF": "иС", + "RESET_OK": "ĐŸĐ°Ņ€ĐžĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐąŅ€ĐžŅˆĐĩĐŊ", + "EXISTING_PASSWORD": "ĐĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ŅĐž ŅŅ‚Đ°Ņ€Ņ‹Đŧ", + "UNKNOWN": "НĐĩиСвĐĩҁ҂ĐŊĐž", + "UNKNOWN_TIP": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ, иĐŧĐĩĐĩŅ‚ Đģи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ŅŅ‚Đ°Ņ‚ŅƒŅ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° ҇ĐĩŅ€ĐĩС ĐĄĐ¸ŅŅ‚ĐĩĐŧ҃ ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐĩĐš, ĐĩҁĐģи СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ \"НĐĩиСвĐĩҁ҂ĐŊĐž\"" + }, + "PROJECT": { + "PROJECTS": "ĐŸŅ€ĐžĐĩĐē҂ҋ", + "NAME": "НазваĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "ROLE": "Đ ĐžĐģҌ", + "PUBLIC_OR_PRIVATE": "ĐŖŅ€ĐžĐ˛ĐĩĐŊҌ Đ´ĐžŅŅ‚ŅƒĐŋа", + "REPO_COUNT": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв", + "CHART_COUNT": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧ", + "CREATION_TIME": "Đ’Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ", + "ACCESS_LEVEL": "ĐŖŅ€ĐžĐ˛ĐĩĐŊҌ Đ´ĐžŅŅ‚ŅƒĐŋа", + "PUBLIC": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš", + "PRIVATE": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Đš", + "MAKE": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ", + "NEW_POLICY": "НовоĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "ALL_PROJECTS": "Đ’ŅĐĩ ĐŋŅ€ĐžĐĩĐē҂ҋ", + "PRIVATE_PROJECTS": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Đĩ ĐŋŅ€ĐžĐĩĐē҂ҋ", + "PUBLIC_PROJECTS": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ĐŋŅ€ĐžĐĩĐē҂ҋ", + "PROJECT": "ĐŸŅ€ĐžĐĩĐēŅ‚", + "NEW_PROJECT": "ĐĐžĐ˛Ņ‹Đš ĐŋŅ€ĐžĐĩĐēŅ‚", + "NAME_TOOLTIP": "НазваĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° Đ´ĐžĐģĐļĐŊĐž ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ĐžŅ‚ 1 Đ´Đž 255 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ._- и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "NAME_IS_REQUIRED": "НазваĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž.", + "NAME_ALREADY_EXISTS": "НазваĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", + "NAME_IS_ILLEGAL": "НазваĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° ĐŊĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž.", + "UNKNOWN_ERROR": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐŊĐĩиСвĐĩҁ҂ĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ŅĐžĐˇĐ´Đ°ĐŊии ĐŋŅ€ĐžĐĩĐēŅ‚Đ°.", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊ҂ҋ", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐēŅ‚ {{param}}?", + "FILTER_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐē҂ҋ", + "REPLICATION_RULE": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "CREATED_SUCCESS": "ĐŸŅ€ĐžĐĩĐēŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊ.", + "DELETED_SUCCESS": "ĐŸŅ€ĐžĐĩĐē҂ҋ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹.", + "TOGGLED_SUCCESS": "ĐŸŅ€ĐžĐĩĐēŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊ.", + "FAILED_TO_DELETE_PROJECT": "ĐŸŅ€ĐžĐĩĐēŅ‚ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸, ĐŋŅ€Đ°Đ˛Đ¸Đģа Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ иĐģи Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹ Helm и ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊ.", + "INLINE_HELP_PUBLIC": "ĐšĐžĐŗĐ´Đ° ĐŋŅ€ĐžĐĩĐēŅ‚ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ ĐēаĐē ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš, ĐģŅŽĐąĐžĐš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ иĐŧĐĩĐĩŅ‚ ĐŋŅ€Đ°Đ˛Đ° ĐŊа ҇҂ĐĩĐŊиĐĩ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв в ŅŅ‚ĐžĐŧ ĐŋŅ€ĐžĐĩĐēŅ‚Đĩ, и ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅŽ ĐŊĐĩ ĐŊ҃ĐļĐŊĐž Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒ \"docker login\" ĐŋĐĩŅ€ĐĩĐ´ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēОК ĐžĐąŅ€Đ°ĐˇĐžĐ˛ в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚.", + "OF": "иС", + "COUNT_QUOTA": "ĐšĐ˛ĐžŅ‚Đ° ĐŋĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Ņƒ", + "STORAGE_QUOTA": "ĐšĐ˛ĐžŅ‚Đ° ĐŋĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ", + "COUNT_QUOTA_TIP": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ввĐĩĐ´Đ¸Ņ‚Đĩ ҆ĐĩĐģĐžĐĩ Ņ‡Đ¸ŅĐģĐž ĐŧĐĩĐļĐ´Ņƒ '1' и '100,000,000', '-1' Đ´ĐģŅ ĐŊĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊĐžĐŗĐž.", + "STORAGE_QUOTA_TIP": "ВĐĩҀ҅ĐŊиК ĐŋŅ€ĐĩĐ´ĐĩĐģ ĐšĐ˛ĐžŅ‚Ņ‹ ĐŋĐž ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ҆ĐĩĐģŅ‹Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ, ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅ‹Đĩ '1024TB'. ВвĐĩĐ´Đ¸Ņ‚Đĩ '-1' Đ´ĐģŅ ĐŊĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊОК ĐēĐ˛ĐžŅ‚Ņ‹", + "QUOTA_UNLIMIT_TIP": "ДĐģŅ ĐŊĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊОК ĐēĐ˛ĐžŅ‚Ņ‹ ввĐĩĐ´Đ¸Ņ‚Đĩ '-1'.", + "TYPE": "ĐĸиĐŋ", + "PROXY_CACHE": "ĐŸŅ€ĐžĐēŅĐ¸-ĐēŅŅˆ", + "PROXY_CACHE_TOOLTIP": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ŅŅ‚Đž, Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐēŅ‚Ņƒ Đ´ĐĩĐšŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐēаĐē ĐŋŅ€ĐžĐēŅĐ¸-ĐēŅŅˆ Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐŗĐž ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ° Ņ€ĐĩĐĩŅŅ‚Ņ€Đ°. Harbor ĐŧĐžĐļĐĩŅ‚ Đ´ĐĩĐšŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐēаĐē ĐŋŅ€ĐžĐēŅĐ¸ Đ´ĐģŅ DockerHub, Docker Registry, Harbor, Aws ECR, Azure ACR, Quay, Google GCR, Github GHCR и JFrog Artifactory.", + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа", + "PROXY_CACHE_ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа ĐŋŅ€ĐžĐēŅĐ¸-ĐēŅŅˆĐ°", + "NO_PROJECT": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛" + }, + "PROJECT_DETAIL": { + "SUMMARY": "ХвОдĐēа", + "REPOSITORIES": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "REPLICATION": "Đ ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Ņ", + "USERS": "ĐŖŅ‡Đ°ŅŅ‚ĐŊиĐēи", + "LOGS": "Đ›ĐžĐŗĐ¸", + "LABELS": "МĐĩŅ‚Đēи", + "PROJECTS": "ĐŸŅ€ĐžĐĩĐē҂ҋ", + "CONFIG": "КоĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ", + "HELMCHART": "Đ”Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹ Helm", + "ROBOT_ACCOUNTS": "АĐēĐēĐ°ŅƒĐŊ҂ҋ Ņ€ĐžĐąĐžŅ‚ĐžĐ˛", + "WEBHOOKS": "ВĐĩĐąŅ…ŅƒĐēи", + "IMMUTABLE_TAG": "НĐĩиСĐŧĐĩĐŊŅĐĩĐŧŅ‹Đĩ Ņ‚ĐĩĐŗĐ¸", + "POLICY": "ПоĐģĐ¸Ņ‚Đ¸Đēа" + }, + "PROJECT_CONFIG": { + "REGISTRY": "Đ ĐĩĐĩҁ҂Ҁ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "PUBLIC_TOGGLE": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš", + "PUBLIC_POLICY": "ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ Ņ€ĐĩĐĩҁ҂Ҁ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đŧ ŅĐ´ĐĩĐģаĐĩŅ‚ Đ˛ŅĐĩ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи Đ´ĐģŅ Đ˛ŅĐĩŅ….", + "SECURITY": "БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐŊĐ¸Ņ", + "CONTENT_TRUST_TOGGLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ дОвĐĩŅ€Đ¸Đĩ Đē ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚Ņƒ", + "CONTENT_TRUST_POLCIY": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐŊиĐĩ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊҋ҅ ĐžĐąŅ€Đ°ĐˇĐžĐ˛.", + "PREVENT_VULNERABLE_TOGGLE": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ СаĐŋ҃ҁĐē ŅƒŅĐˇĐ˛Đ¸Đŧҋ҅ ĐžĐąŅ€Đ°ĐˇĐžĐ˛.", + "PREVENT_VULNERABLE_1": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰Đ°Ņ‚ŅŒ Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐŊиĐĩ ĐžĐąŅ€Đ°ĐˇĐžĐ˛ ҁ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ŅŒŅŽ ҁĐĩŅ€ŅŒĐĩСĐŊĐžŅŅ‚Đ¸", + "PREVENT_VULNERABLE_2": "и Đ˛Ņ‹ŅˆĐĩ.", + "SCAN": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš", + "AUTOSCAN_TOGGLE": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°ĐˇŅ‹ ĐŋŅ€Đ¸ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēĐĩ", + "AUTOSCAN_POLICY": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°ĐˇŅ‹, ĐēĐžĐŗĐ´Đ° ĐžĐŊи ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅŅŽŅ‚ŅŅ в Ņ€ĐĩĐĩҁ҂Ҁ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°." + }, + "MEMBER": { + "NEW_USER": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "NEW_MEMBER": "ĐĐžĐ˛Ņ‹Đš ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐē", + "MEMBER": "ĐŖŅ‡Đ°ŅŅ‚ĐŊиĐē", + "NAME": "ИĐŧŅ", + "ROLE": "Đ ĐžĐģҌ", + "SYS_ADMIN": "ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€", + "PROJECT_ADMIN": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "PROJECT_MAINTAINER": "ĐĄĐžĐŋŅ€ĐžĐ˛ĐžĐļĐ´Đ°ŅŽŅ‰Đ¸Đš", + "DEVELOPER": "Đ Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đē", + "GUEST": "Đ“ĐžŅŅ‚ŅŒ", + "LIMITED_GUEST": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅ‹Đš ĐŗĐžŅŅ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊ҂ҋ", + "ACTIONS": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ", + "USER": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ", + "USERS": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи", + "EMAIL": "ĐŸĐžŅ‡Ņ‚Đ°", + "ADD_USER": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "NEW_USER_INFO": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ° ҁ ҃ĐēаСаĐŊĐŊОК Ņ€ĐžĐģŅŒŅŽ", + "NEW_GROUP": "ĐĐžĐ˛Đ°Ņ ĐŗŅ€ŅƒĐŋĐŋа", + "IMPORT_GROUP": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃", + "NEW_GROUP_INFO": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ŅƒŅŽ ĐŗŅ€ŅƒĐŋĐŋ҃ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš иĐģи Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃ иС LDAP/AD в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "ADD_GROUP_SELECT": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ŅƒŅŽ ĐŗŅ€ŅƒĐŋĐŋ҃ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "CREATE_GROUP_SELECT": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃ иС LDAP в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "LDAP_SEARCH_DN": "LDAP Đ“Ņ€ŅƒĐŋĐŋа DN", + "LDAP_SEARCH_NAME": "ИĐŧŅ", + "LDAP_GROUP": "Đ“Ņ€ŅƒĐŋĐŋа", + "LDAP_GROUPS": "Đ“Ņ€ŅƒĐŋĐŋŅ‹", + "LDAP_PROPERTY": "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đž", + "ACTION": "ДЕЙСĐĸВИЕ", + "MEMBER_TYPE": "ĐĸиĐŋ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа", + "GROUP_TYPE": "Đ“Ņ€ŅƒĐŋĐŋа", + "USER_TYPE": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ", + "USERNAME_IS_REQUIRED": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "USERNAME_DOES_NOT_EXISTS": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐŊĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚", + "USERNAME_ALREADY_EXISTS": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ҃ĐļĐĩ дОйавĐģĐĩĐŊĐž в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚", + "UNKNOWN_ERROR": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐŊĐĩиСвĐĩҁ҂ĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ дОйавĐģĐĩĐŊии ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа", + "FILTER_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв ĐŋŅ€ĐžĐĩĐēŅ‚Đ° {{param}}?", + "ADDED_SUCCESS": "ĐŖŅ‡Đ°ŅŅ‚ĐŊиĐē ҃ҁĐŋĐĩ҈ĐŊĐž дОйавĐģĐĩĐŊ.", + "DELETED_SUCCESS": "ĐŖŅ‡Đ°ŅŅ‚ĐŊиĐē ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊ.", + "SWITCHED_SUCCESS": "Đ ĐžĐģҌ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊа.", + "OF": "иС", + "SWITCH_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "SWITCH_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв ĐŋŅ€ĐžĐĩĐēŅ‚Đ° {{param}}?", + "SET_ROLE": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐģҌ", + "REMOVE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "GROUP_NAME_REQUIRED": "ИĐŧŅ ĐŗŅ€ŅƒĐŋĐŋŅ‹ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "NON_EXISTENT_GROUP": "ИĐŧŅ ĐŗŅ€ŅƒĐŋĐŋŅ‹ ĐŊĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚", + "GROUP_ALREADY_ADDED": "ИĐŧŅ ĐŗŅ€ŅƒĐŋĐŋŅ‹ ҃ĐļĐĩ дОйавĐģĐĩĐŊĐž в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚" + }, + "ROBOT_ACCOUNT": { + "NAME": "ИĐŧŅ", + "PERMISSIONS": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ", + "TOKEN": "ĐĄĐĩĐēŅ€ĐĩŅ‚", + "NEW_ROBOT_ACCOUNT": "НОВĐĢЙ ĐĐšĐšĐĐŖĐĐĸ РОБОĐĸА", + "ENABLED_STATE": "ĐĄĐžŅŅ‚ĐžŅĐŊиĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ", + "NUMBER_REQUIRED": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ҆ĐĩĐģŅ‹Đŧ Ņ‡Đ¸ŅĐģĐžĐŧ, ĐžŅ‚ĐģĐ¸Ņ‡ĐŊŅ‹Đŧ ĐžŅ‚ 0.", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "CREATETION": "Đ’Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ", + "EXPIRATION": "ĐĄŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ", + "TOKEN_EXPIRATION": "ĐĄŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Ņ‚ĐžĐēĐĩĐŊа Ņ€ĐžĐąĐžŅ‚Đ° (ДĐŊи)", + "ACTION": "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊ҂ҋ", + "OF": "иС", + "DISABLE_ACCOUNT": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚", + "ENABLE_ACCOUNT": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "CREAT_ROBOT_ACCOUNT": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚ Ņ€ĐžĐąĐžŅ‚Đ°", + "PERMISSIONS_ARTIFACT": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚", + "PERMISSIONS_HELMCHART": "Đ”Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧа Helm (Chart Museum)", + "PUSH": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ", + "PULL": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ", + "FILTER_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊ҂ҋ Ņ€ĐžĐąĐžŅ‚ĐžĐ˛", + "ROBOT_NAME": "НĐĩ ĐŧĐžĐļĐĩŅ‚ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹(~#$%) и ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐ°Ņ Đ´ĐģиĐŊа Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ 255 ŅĐ¸ĐŧвОĐģОв.", + "ACCOUNT_EXISTING": "АĐēĐēĐ°ŅƒĐŊŅ‚ Ņ€ĐžĐąĐžŅ‚Đ° ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", + "ALERT_TEXT": "Đ­Ņ‚Đž ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš Ņ€Đ°Đˇ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ҁĐĩĐēŅ€ĐĩŅ‚. ĐŖ Đ˛Đ°Ņ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ Đ´Ņ€ŅƒĐŗĐžĐŗĐž ŅˆĐ°ĐŊŅĐ°", + "CREATED_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊ '{{param}}'.", + "COPY_SUCCESS": "ĐĄĐĩĐēŅ€ĐĩŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊ Đ´ĐģŅ '{{param}}'", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐ˛ Ņ€ĐžĐąĐžŅ‚ĐžĐ˛", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊ҂ҋ Ņ€ĐžĐąĐžŅ‚ĐžĐ˛ {{param}}?", + "PULL_IS_MUST": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ ĐŊа ĐˇĐ°ĐŗŅ€ŅƒĐˇĐē҃ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ŅŅ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ и ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊĐž.", + "EXPORT_TO_FILE": "ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ в Ņ„Đ°ĐšĐģ", + "EXPIRES_AT": "Đ˜ŅŅ‚ĐĩĐēаĐĩŅ‚", + "EXPIRATION_TOOLTIP": "Đ•ŅĐģи ĐŊĐĩ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž, ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ˛Ņ€ĐĩĐŧŅ Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸", + "INVALID_VALUE": "ЗĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ŅŅ€ĐžĐēа Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŊĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž", + "NEVER_EXPIRED": "НиĐēĐžĐŗĐ´Đ° ĐŊĐĩ Đ¸ŅŅ‚ĐĩĐēаĐĩŅ‚", + "NAME_PREFIX": "ĐŸŅ€ĐĩŅ„Đ¸Đēҁ иĐŧĐĩĐŊи Ņ€ĐžĐąĐžŅ‚Đ°", + "NAME_PREFIX_REQUIRED": "ĐŸŅ€ĐĩŅ„Đ¸Đēҁ иĐŧĐĩĐŊи Ņ€ĐžĐąĐžŅ‚Đ° ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ" + }, + "WEBHOOK": { + "EDIT_BUTTON": "РЕДАКĐĸИРОВАĐĸĐŦ", + "ENABLED_BUTTON": "ВКЛЮЧИĐĸĐŦ", + "DISABLED_BUTTON": "ДЕАКĐĸИВИРОВАĐĸĐŦ", + "TYPE": "ВĐĩĐąŅ…ŅƒĐē", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", + "CREATED": "ХОСдаĐŊ", + "ENABLED": "ВĐēĐģŅŽŅ‡ĐĩĐŊ", + "DISABLED": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "OF": "иС", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊ҂ҋ", + "LAST_TRIGGERED": "ĐŸĐžŅĐģĐĩĐ´ĐŊиК СаĐŋ҃ҁĐē", + "EDIT_WEBHOOK": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē", + "ADD_WEBHOOK": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē", + "CREATE_WEBHOOK": "ĐĐ°Ņ‡Đ°Ņ‚ŅŒ ҁ вĐĩĐąŅ…ŅƒĐēОв", + "EDIT_WEBHOOK_DESC": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиК вĐĩĐąŅ…ŅƒĐēОв", + "CREATE_WEBHOOK_DESC": "Đ§Ņ‚ĐžĐąŅ‹ ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ ҁ вĐĩĐąŅ…ŅƒĐēОв, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ и ŅƒŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ҁĐĩŅ€Đ˛ĐĩŅ€Ņƒ вĐĩĐąŅ…ŅƒĐēОв.", + "VERIFY_REMOTE_CERT_TOOLTIP": "ОĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚Đĩ, Đ´ĐžĐģĐļĐĩĐŊ Đģи вĐĩĐąŅ…ŅƒĐē ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ‚ŅŒ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž URL. ĐĄĐŊиĐŧĐ¸Ņ‚Đĩ ŅŅ‚ĐžŅ‚ Ņ„ĐģаĐļĐžĐē, ĐĩҁĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš URL Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš иĐģи ĐŊĐĩĐŊадĐĩĐļĐŊŅ‹Đš ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚.", + "ENDPOINT_URL": "URL ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи", + "URL_IS_REQUIRED": "URL ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ.", + "AUTH_HEADER": "Đ—Đ°ĐŗĐžĐģОвОĐē Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸", + "VERIFY_REMOTE_CERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", + "TEST_ENDPOINT_BUTTON": "ПРОВЕРИĐĸĐŦ ĐšĐžĐĐ•Đ§ĐĐŖĐŽ ĐĸĐžĐ§ĐšĐŖ", + "CANCEL_BUTTON": "ОĐĸМЕНА", + "SAVE_BUTTON": "СОĐĨРАНИĐĸĐŦ", + "TEST_ENDPOINT_SUCCESS": "ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐž.", + "TEST_ENDPOINT_FAILURE": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃.", + "ENABLED_WEBHOOK_TITLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē", + "ENABLED_WEBHOOK_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē {{name}}?", + "DISABLED_WEBHOOK_TITLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē", + "DISABLED_WEBHOOK_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē {{name}}?", + "DELETE_WEBHOOK_TITLE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē(и)", + "DELETE_WEBHOOK_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐĩĐąŅ…ŅƒĐē(и) {{names}}?", + "WEBHOOKS": "ВĐĩĐąŅ…ŅƒĐēи", + "NEW_WEBHOOK": "ĐĐžĐ˛Ņ‹Đš вĐĩĐąŅ…ŅƒĐē", + "ENABLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ", + "DISABLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "NAME": "ИĐŧŅ", + "TARGET": "URL ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи", + "EVENT_TYPES": "ĐĸиĐŋŅ‹ ŅĐžĐąŅ‹Ņ‚Đ¸Đš", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "NO_WEBHOOK": "НĐĩŅ‚ вĐĩĐąŅ…ŅƒĐēа", + "LAST_TRIGGER": "ĐŸĐžŅĐģĐĩĐ´ĐŊиК Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€", + "WEBHOOK_NAME": "ИĐŧŅ вĐĩĐąŅ…ŅƒĐēа", + "NO_TRIGGER": "НĐĩŅ‚ Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€Đ°", + "NAME_REQUIRED": "ИĐŧŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "NOTIFY_TYPE": "ĐĸиĐŋ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ", + "EVENT_TYPE": "ĐĸиĐŋ ŅĐžĐąŅ‹Ņ‚Đ¸Ņ", + "EVENT_TYPE_REQUIRED": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдиĐŊ Ņ‚Đ¸Đŋ ŅĐžĐąŅ‹Ņ‚Đ¸Ņ" + }, + "GROUP": { + "GROUP": "Đ“Ņ€ŅƒĐŋĐŋа", + "GROUPS": "Đ“Ņ€ŅƒĐŋĐŋŅ‹", + "IMPORT_LDAP_GROUP": "ИĐŧĐŋĐžŅ€Ņ‚ LDAP ĐŗŅ€ŅƒĐŋĐŋŅ‹", + "IMPORT_HTTP_GROUP": "ĐĐžĐ˛Đ°Ņ HTTP ĐŗŅ€ŅƒĐŋĐŋа", + "IMPORT_OIDC_GROUP": "ĐĐžĐ˛Đ°Ņ OIDC ĐŗŅ€ŅƒĐŋĐŋа", + "ADD": "ĐĐžĐ˛Đ°Ņ ĐŗŅ€ŅƒĐŋĐŋа", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "NAME": "ИĐŧŅ", + "TYPE": "ĐĸиĐŋ", + "DN": "DN", + "GROUP_DN": "DN LDAP ĐŗŅ€ŅƒĐŋĐŋŅ‹", + "PROPERTY": "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đž", + "REG_TIME": "Đ’Ņ€ĐĩĐŧŅ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸", + "ADD_GROUP_SUCCESS": "Đ“Ņ€ŅƒĐŋĐŋа ҃ҁĐŋĐĩ҈ĐŊĐž дОйавĐģĐĩĐŊа", + "EDIT_GROUP_SUCCESS": "Đ“Ņ€ŅƒĐŋĐŋа ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‚Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊа", + "LDAP_TYPE": "LDAP", + "HTTP_TYPE": "HTTP", + "OIDC_TYPE": "OIDC", + "OF": "иС", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "NEW_MEMBER": "ĐĐžĐ˛Ņ‹Đš ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐē ĐŗŅ€ŅƒĐŋĐŋŅ‹", + "NEW_USER_INFO": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃ ĐēаĐē ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ° ҁ ҃ĐēаСаĐŊĐŊОК Ņ€ĐžĐģŅŒŅŽ", + "ROLE": "Đ ĐžĐģҌ", + "SYS_ADMIN": "ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€", + "PROJECT_ADMIN": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "PROJECT_MAINTAINER": "ĐĄĐžĐŋŅ€ĐžĐ˛ĐžĐļĐ´Đ°ŅŽŅ‰Đ¸Đš ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "DEVELOPER": "Đ Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đē", + "GUEST": "Đ“ĐžŅŅ‚ŅŒ", + "LIMITED_GUEST": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅ‹Đš ĐŗĐžŅŅ‚ŅŒ", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв ĐŗŅ€ŅƒĐŋĐŋŅ‹", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа(Ов) ĐŗŅ€ŅƒĐŋĐŋŅ‹ {{param}}?" + }, + "AUDIT_LOG": { + "USERNAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "REPOSITORY_NAME": "ИĐŧŅ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ", + "TAGS": "ĐĸĐĩĐŗĐ¸", + "OPERATION": "ОĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ", + "OPERATIONS": "ОĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸", + "TIMESTAMP": "ĐžŅ‚ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи", + "ALL_OPERATIONS": "Đ’ŅĐĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸", + "PULL": "Đ’Ņ‹ĐŗŅ€ŅƒĐˇĐēа", + "PUSH": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа", + "CREATE": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "OTHERS": "Đ”Ņ€ŅƒĐŗĐ¸Đĩ", + "ADVANCED": "Đ Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đš", + "SIMPLE": "ĐŸŅ€ĐžŅŅ‚ĐžĐš", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "FILTER_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐģĐžĐŗĐ¸", + "INVALID_DATE": "НĐĩвĐĩŅ€ĐŊĐ°Ņ Đ´Đ°Ņ‚Đ°.", + "OF": "иС", + "NOT_FOUND": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐģĐžĐŗĐžĐ˛!", + "RESOURCE": "Đ ĐĩŅŅƒŅ€Ņ", + "RESOURCE_TYPE": "ĐĸиĐŋ Ņ€ĐĩŅŅƒŅ€ŅĐ°" + }, + "REPLICATION": { + "YES": "Да", + "SECONDS": "ĐĄĐĩĐē҃ĐŊĐ´Ņ‹", + "MINUTES": "МиĐŊŅƒŅ‚Ņ‹", + "HOURS": "Đ§Đ°ŅŅ‹", + "MONTH": "МĐĩŅŅŅ†", + "DAY_MONTH": "ДĐĩĐŊҌ ĐŧĐĩŅŅŅ†Đ°", + "DAY_WEEK": "ДĐĩĐŊҌ ĐŊĐĩĐ´ĐĩĐģи", + "CRON_TITLE": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ ŅˆĐ°ĐąĐģĐžĐŊа Đ´ĐģŅ cron '* * * * * *'. ĐĄŅ‚Ņ€ĐžĐēа cron ĐžŅĐŊОваĐŊа ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐŊи UTC", + "FIELD_NAME": "ИĐŧŅ ĐŋĐžĐģŅ", + "MANDATORY": "ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž?", + "ALLOWED_VALUES": "ДоĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "ALLOWED_CHARACTERS": "ДоĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đĩ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹", + "TOTAL": "Đ’ŅĐĩĐŗĐž", + "OVERRIDE": "ПĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ", + "ENABLED_RULE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "OVERRIDE_INFO": "ПĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ", + "OPERATION": "ОĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ", + "CURRENT": "Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš", + "FILTER_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐˇĐ°Đ´Đ°Ņ‡Đ¸", + "STOP_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐžŅŅ‚Đ°ĐŊОвĐēи Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиК", + "BOTH": "Ойа", + "STOP_SUCCESS": "ĐžŅŅ‚Đ°ĐŊОвĐēа Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ {{param}} ҃ҁĐŋĐĩ҈ĐŊа", + "STOP_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ {{param}}?", + "TASK_ID": "ID ĐˇĐ°Đ´Đ°Ņ‡Đ¸", + "RESOURCE_TYPE": "ĐĸиĐŋ Ņ€ĐĩŅŅƒŅ€ŅĐ°", + "SOURCE": "Đ˜ŅŅ‚ĐžŅ‡ĐŊиĐē", + "DESTINATION": "НазĐŊĐ°Ņ‡ĐĩĐŊиĐĩ", + "POLICY": "ПоĐģĐ¸Ņ‚Đ¸Đēа", + "DURATION": "ДĐģĐ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ", + "SUCCESS_RATE": "ĐŖŅĐŋĐĩ҈ĐŊŅ‹Đš ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚", + "SUCCESS": "ĐŖĐĄĐŸĐ•Đ¨ĐĐž", + "FAILURE": "ОШИБКА", + "IN_PROGRESS": "В ПРОĐĻЕССЕ", + "REPLICATION_RULE": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "NEW_REPLICATION_RULE": "НовоĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "ENDPOINTS": "КоĐŊĐĩ҇ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи", + "FILTER_POLICIES_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа", + "FILTER_EXECUTIONS_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ°Đ˛Đ¸Đģа Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ {{param}}?", + "REPLICATION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа", + "REPLICATION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Ņ€ĐĩĐŋĐģĐ¸Ņ†Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž {{param}}?", + "DELETION_TITLE_FAILURE": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "DELETION_SUMMARY_FAILURE": "иĐŧĐĩĐĩŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐžĐļидаĐŊĐ¸Ņ/Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ/ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊОК ĐŋĐžĐŋҋ҂Đēи", + "REPLICATE_SUMMARY_FAILURE": "иĐŧĐĩĐĩŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐžĐļидаĐŊĐ¸Ņ/Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "FILTER_TARGETS_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŊĐĩ҇ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи", + "DELETION_TITLE_TARGET": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи", + "DELETION_SUMMARY_TARGET": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ {{param}}?", + "ADD_POLICY": "НовоĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "EDIT_POLICY": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "EDIT_POLICY_TITLE": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "DELETE_POLICY": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "TEST_CONNECTION": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ", + "TESTING_CONNECTION": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ŅĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ...", + "TEST_CONNECTION_SUCCESS": "ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐž.", + "TEST_CONNECTION_FAILURE": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ ҁ ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡ĐēОК.", + "ID": "ID", + "NAME": "ИĐŧŅ", + "NAME_IS_REQUIRED": "ИĐŧŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž.", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "ENABLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ", + "DISABLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "REPLICATION_MODE": "Đ ĐĩĐļиĐŧ Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "SRC_REGISTRY": "Đ ĐĩĐĩҁ҂Ҁ Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐēа", + "DESTINATION_NAMESPACE": "Đ ĐĩĐĩҁ҂Ҁ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ:ĐŸŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž иĐŧĐĩĐŊ", + "DESTINATION_NAME_IS_REQUIRED": "ИĐŧŅ ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž.", + "NEW_DESTINATION": "ĐĐžĐ˛Đ°Ņ ĐēĐžĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа", + "DESTINATION_URL": "URL ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи", + "DESTINATION_URL_IS_REQUIRED": "URL ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ.", + "DESTINATION_USERNAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "DESTINATION_PASSWORD": "ĐŸĐ°Ņ€ĐžĐģҌ", + "ALL_STATUS": "Đ’ŅĐĩ ŅŅ‚Đ°Ņ‚ŅƒŅŅ‹", + "ENABLED": "ВĐēĐģŅŽŅ‡ĐĩĐŊĐž", + "DISABLED": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "LAST_START_TIME": "ĐŸĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ Đ˛Ņ€ĐĩĐŧŅ СаĐŋ҃ҁĐēа", + "ACTIVATION": "АĐēŅ‚Đ¸Đ˛Đ°Ņ†Đ¸Ņ", + "REPLICATION_EXECUTION": "Đ’Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "REPLICATION_EXECUTIONS": "Đ’Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "STOPJOB": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", + "ALL": "Đ’ŅĐĩ", + "PENDING": "ОĐļидаĐŊиĐĩ", + "RUNNING": "Đ’Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "ERROR": "ĐžŅˆĐ¸ĐąĐēа", + "RETRYING": "ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐ°Ņ ĐŋĐžĐŋҋ҂Đēа", + "STOPPED": "ОСĐĸАНОВЛЕНО", + "FINISHED": "ЗавĐĩŅ€ŅˆĐĩĐŊĐž", + "CANCELED": "ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž", + "SIMPLE": "ĐŸŅ€ĐžŅŅ‚ĐžĐš", + "ADVANCED": "Đ Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đš", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", + "REPLICATION_TRIGGER": "ĐĸŅ€Đ¸ĐŗĐŗĐĩŅ€", + "CREATION_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐŊĐ°Ņ‡Đ°Đģа", + "UPDATE_TIME": "Đ’Ņ€ĐĩĐŧŅ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ", + "END_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐžĐēĐžĐŊŅ‡Đ°ĐŊĐ¸Ņ", + "LOGS": "Đ›ĐžĐŗĐ¸", + "OF": "иС", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "NO_LOGS": "НĐĩŅ‚ ĐģĐžĐŗĐžĐ˛", + "TOGGLE_ENABLE_TITLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "TOGGLE_DISABLE_TITLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "CREATED_SUCCESS": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊĐž.", + "UPDATED_SUCCESS": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊĐž.", + "DELETED_SUCCESS": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐž.", + "DELETED_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸.", + "TOGGLED_SUCCESS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ ĐŋŅ€Đ°Đ˛Đ¸Đģа Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐž иСĐŧĐĩĐŊĐĩĐŊ.", + "CANNOT_EDIT": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊĐž, ĐŋĐžĐēа ĐžĐŊĐž вĐēĐģŅŽŅ‡ĐĩĐŊĐž.", + "INVALID_DATE": "НĐĩвĐĩŅ€ĐŊĐ°Ņ Đ´Đ°Ņ‚Đ°.", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸!", + "JOB_PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐˇĐ°Đ´Đ°Ņ‡ Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸!", + "NO_ENDPOINT_INFO": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, Đ´ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ ĐŋĐĩŅ€Đ˛ĐžĐš", + "NO_LABEL_INFO": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, Đ´ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ ĐŧĐĩŅ‚Đē҃ ĐŋĐĩŅ€Đ˛ĐžĐš", + "NO_PROJECT_INFO": "Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚ ĐŊĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚", + "SOURCE_RESOURCE_FILTER": "ФиĐģŅŒŅ‚Ņ€ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛ Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐēа", + "SCHEDULED": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "MANUAL": "Đ’Ņ€ŅƒŅ‡ĐŊŅƒŅŽ", + "EVENT_BASED": "На ĐžŅĐŊОвĐĩ ŅĐžĐąŅ‹Ņ‚Đ¸Đš", + "DAILY": "ЕĐļĐĩĐ´ĐŊĐĩвĐŊĐž", + "WEEKLY": "ЕĐļĐĩĐŊĐĩĐ´ĐĩĐģҌĐŊĐž", + "SETTING": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи", + "TRIGGER": "ĐŖŅĐģОвиĐĩ Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€Đ°", + "TARGETS": "ĐĻĐĩĐģҌ", + "MODE": "Đ ĐĩĐļиĐŧ", + "TRIGGER_MODE": "Đ ĐĩĐļиĐŧ Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€Đ°", + "SOURCE_PROJECT": "ĐŸŅ€ĐžĐĩĐēŅ‚ Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐēа", + "REPLICATE": "Đ ĐĩĐŋĐģĐ¸Ņ†Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE_REMOTE_IMAGES": "ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ĐŋŅ€Đ¸ ĐģĐžĐēаĐģҌĐŊĐžĐŧ ŅƒĐ´Đ°ĐģĐĩĐŊии", + "DELETE_ENABLED": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Ņƒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃", + "NEW": "ĐĐžĐ˛Ņ‹Đš", + "NAME_TOOLTIP": "ИĐŧŅ ĐŋŅ€Đ°Đ˛Đ¸Đģа Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ 2 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ŅĐ¸ĐŧвОĐģаĐŧи ._- и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "DESTINATION_NAME_TOOLTIP": "ИĐŧŅ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ 2 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ŅĐ¸ĐŧвОĐģаĐŧи ._- и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "ACKNOWLEDGE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ", + "RULE_DISABLED": "Đ­Ņ‚Đž ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐąŅ‹ĐģĐž Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž, Ņ‚Đ°Đē ĐēаĐē ĐŧĐĩŅ‚Đēа, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐ°Ņ в ĐĩĐŗĐž Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đĩ, ĐąŅ‹Đģа ŅƒĐ´Đ°ĐģĐĩĐŊа. \n ĐžŅ‚Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž и ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐĩĐŗĐž Ņ„Đ¸ĐģŅŒŅ‚Ņ€, Ņ‡Ņ‚ĐžĐąŅ‹ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐĩĐŗĐž.", + "REPLI_MODE": "Đ ĐĩĐļиĐŧ Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸", + "SOURCE_REGISTRY": "Đ ĐĩĐĩҁ҂Ҁ Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐēа", + "SOURCE_NAMESPACES": "ĐŸŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° иĐŧĐĩĐŊ Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐēа", + "DEST_REGISTRY": "Đ ĐĩĐĩҁ҂Ҁ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "DEST_NAMESPACE": "ĐŸŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž иĐŧĐĩĐŊ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "NAMESPACE_TOOLTIP": "ИĐŧŅ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° иĐŧĐĩĐŊ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ 2 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ŅĐ¸ĐŧвОĐģаĐŧи ._-/ и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "TAG": "ĐĸĐĩĐŗ", + "LABEL": "МĐĩŅ‚Đēа", + "RESOURCE": "Đ ĐĩŅŅƒŅ€Ņ", + "ENABLE_TITLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "ENABLE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž {{param}}?", + "DISABLE_TITLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "DISABLE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž {{param}}?", + "ENABLE_SUCCESS": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž ҃ҁĐŋĐĩ҈ĐŊĐž вĐēĐģŅŽŅ‡ĐĩĐŊĐž", + "ENABLE_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "DISABLE_SUCCESS": "ĐŸŅ€Đ°Đ˛Đ¸ĐģĐž ҃ҁĐŋĐĩ҈ĐŊĐž Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "DISABLE_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "DES_REPO_FLATTENING": "ĐĄĐŗĐģаĐļиваĐŊиĐĩ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "NAMESPACE": "ĐŸŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž иĐŧĐĩĐŊ", + "REPO_FLATTENING": "ĐĄĐŗĐģаĐļиваĐŊиĐĩ", + "NO_FLATTING": "БĐĩС ŅĐŗĐģаĐļиваĐŊĐ¸Ņ", + "FLATTEN_LEVEL_1": "ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ 1 ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ", + "FLATTEN_LEVEL_2": "ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ 2 ŅƒŅ€ĐžĐ˛ĐŊŅ", + "FLATTEN_LEVEL_3": "ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ 3 ŅƒŅ€ĐžĐ˛ĐŊŅ", + "FLATTEN_ALL": "ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ ŅƒŅ€ĐžĐ˛ĐŊи", + "FLATTEN_LEVEL_TIP": "ĐŖĐŧĐĩĐŊŅŒŅˆĐ¸Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊĐŊŅƒŅŽ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņƒ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ ĐŋŅ€Đ¸ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊии ĐžĐąŅ€Đ°ĐˇĐžĐ˛. ĐŸŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, Ņ‡Ņ‚Đž вĐģĐžĐļĐĩĐŊĐŊĐ°Ņ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ° Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ 'a/b/c/d/img', а ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž иĐŧĐĩĐŊ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ 'ns', ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ ĐēаĐļĐ´ĐžĐŗĐž ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ° ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ:", + "FLATTEN_LEVEL_TIP_ALL": "'ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ ŅƒŅ€ĐžĐ˛ĐŊи'(Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´Đž v2.3): 'a/b/c/d/img' -> 'ns/img'", + "FLATTEN_LEVEL_TIP_NO": "'БĐĩС ŅĐŗĐģаĐļиваĐŊĐ¸Ņ': 'a/b/c/d/img' -> 'ns/a/b/c/d/img", + "FLATTEN_LEVEL_TIP_1": "'ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ 1 ĐŖŅ€ĐžĐ˛ĐĩĐŊҌ' (По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ): 'a/b/c/d/img' -> 'ns/b/c/d/img'", + "FLATTEN_LEVEL_TIP_2": "'ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ 2 ĐŖŅ€ĐžĐ˛ĐŊŅ': 'a/b/c/d/img' -> 'ns/c/d/img'", + "FLATTEN_LEVEL_TIP_3": "'ĐĄĐŗĐģĐ°Đ´Đ¸Ņ‚ŅŒ 3 ĐŖŅ€ĐžĐ˛ĐŊŅ': 'a/b/c/d/img' -> 'ns/d/img'", + "NOTE": "ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: Đ”Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹ Chartmuseum ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņƒ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ ҁ 2 ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ°Đŧи ĐŋŅƒŅ‚Đ¸: 'a/chart'", + "BANDWIDTH": "ĐŸŅ€ĐžĐŋ҃ҁĐēĐŊĐ°Ņ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ", + "BANDWIDTH_ERROR_TIP": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ввĐĩĐ´Đ¸Ņ‚Đĩ -1 иĐģи ҆ĐĩĐģĐžĐĩ Ņ‡Đ¸ŅĐģĐž йОĐģҌ҈Đĩ 0", + "BANDWIDTH_TOOLTIP": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊŅƒŅŽ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊŅƒŅŽ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ ҁĐĩŅ‚Đ¸ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐŊиĐŧаĐŊиĐĩ ĐŊа ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ОдĐŊĐžĐ˛Ņ€ĐĩĐŧĐĩĐŊĐŊҋ҅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиК. ДĐģŅ ĐŊĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊОК ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊОК ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚Đ¸ ввĐĩĐ´Đ¸Ņ‚Đĩ -1", + "UNLIMITED": "НĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊĐž", + "UNREACHABLE_SOURCE_REGISTRY": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋОдĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒŅŅ Đē Đ¸ŅŅ…ĐžĐ´ĐŊĐžĐŧ҃ Ņ€ĐĩĐĩŅŅ‚Ņ€Ņƒ, ŅƒĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đš Ņ€ĐĩĐĩҁ҂Ҁ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ ĐŋĐĩŅ€ĐĩĐ´ Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅŅ‚ĐžĐŗĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа: {{error}}", + "CRON_ERROR_TIP": "ПоĐģĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž Đ´ĐģŅ СаĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ, и \"*\" ĐŊĐĩ Đ´ĐžĐŋ҃ҁĐēаĐĩŅ‚ŅŅ Đ´ĐģŅ ĐŋĐžĐģŅ \"МиĐŊŅƒŅ‚Ņ‹\"", + "COPY_BY_CHUNK": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐž Ņ‡Đ°ŅŅ‚ŅĐŧ", + "COPY_BY_CHUNK_TIP": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ, ҁĐģĐĩĐ´ŅƒĐĩŅ‚ Đģи ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ йОĐģŅŒŅˆĐžĐš Đ´Đ˛ĐžĐ¸Ņ‡ĐŊŅ‹Đš ĐžĐąŅŠĐĩĐēŅ‚ ĐŋĐž Ņ‡Đ°ŅŅ‚ŅĐŧ. ПĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ° ĐŋĐž Ņ‡Đ°ŅŅ‚ŅĐŧ ĐŧĐžĐļĐĩŅ‚ ŅƒĐ˛ĐĩĐģĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž СаĐŋŅ€ĐžŅĐžĐ˛ API.", + "TRIGGER_STOP_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ" + }, + "DESTINATION": { + "NEW_ENDPOINT": "ĐĐžĐ˛Đ°Ņ КоĐŊĐĩ҇ĐŊĐ°Ņ ĐĸĐžŅ‡Đēа", + "PROVIDER": "ĐŸŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€", + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ ĐĸĐžŅ‡Đēа", + "NAME": "ИĐŧŅ", + "NAME_IS_REQUIRED": "ИĐŧŅ ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž.", + "URL": "URL КоĐŊĐĩ҇ĐŊОК ĐĸĐžŅ‡Đēи", + "URL_IS_REQUIRED": "URL ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ.", + "AUTHENTICATION": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ", + "ACCESS_ID": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ Đ”ĐžŅŅ‚ŅƒĐŋа", + "ACCESS_SECRET": "ĐĄĐĩĐēŅ€ĐĩŅ‚ Đ”ĐžŅŅ‚ŅƒĐŋа", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", + "TEST_CONNECTION": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ", + "TITLE_EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ КоĐŊĐĩ҇ĐŊŅƒŅŽ ĐĸĐžŅ‡Đē҃", + "TITLE_ADD": "ĐĐžĐ˛Đ°Ņ КоĐŊĐĩ҇ĐŊĐ°Ņ ĐĸĐžŅ‡Đēа Đ ĐĩĐĩŅŅ‚Ņ€Đ°", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "TESTING_CONNECTION": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ĐĄĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ...", + "TEST_CONNECTION_SUCCESS": "ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐž.", + "TEST_CONNECTION_FAILURE": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋŅ€ĐžĐŋиĐŊĐŗĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃.", + "CONFLICT_NAME": "ИĐŧŅ ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", + "INVALID_NAME": "НĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧĐžĐĩ иĐŧŅ ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи.", + "FAILED_TO_GET_TARGET": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃.", + "CREATION_TIME": "Đ’Ņ€ĐĩĐŧŅ ХОСдаĐŊĐ¸Ņ", + "OF": "иС", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "CREATED_SUCCESS": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊа.", + "UPDATED_SUCCESS": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊа.", + "DELETED_SUCCESS": "КоĐŊĐĩ҇ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹.", + "DELETED_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐžĐŊĐĩ҇ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи.", + "CANNOT_EDIT": "КоĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ ĐŊĐĩĐģŅŒĐˇŅ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ, ĐŋĐžĐēа ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Đ¸ аĐēŅ‚Đ¸Đ˛ĐŊĐž.", + "FAILED_TO_DELETE_TARGET_IN_USED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅƒŅŽ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃.", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊи ОдĐŊОК ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡Đēи!", + "DEPRECATED": "Helm Hub ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´Đ¸Ņ‚ ĐŊа Artifact Hub" +}, + "REPOSITORY": { + "COPY_DIGEST_ID": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĨŅŅˆ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "NAME": "НазваĐŊиĐĩ", + "TAGS": "ĐĸĐĩĐŗĐ¸", + "PLATFORM": "ОС/ĐŅ€Ņ…Đ¸Ņ‚ĐĩĐēŅ‚ŅƒŅ€Đ°", + "ARTIFACT_TOOTIP": "НаĐļĐŧĐ¸Ņ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ ŅŅ‚ĐžĐŗĐž иĐŊĐ´ĐĩĐēŅĐ° OCI", + "ARTIFACTS_COUNT": "ĐŅ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ", + "PULL_COUNT": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēи", + "PULL_COMMAND": "КоĐŧаĐŊда Đ—Đ°ĐŗŅ€ŅƒĐˇĐēи", + "PULL_TIME": "Đ’Ņ€ĐĩĐŧŅ Đ—Đ°ĐŗŅ€ŅƒĐˇĐēи", + "PUSH_TIME": "Đ’Ņ€ĐĩĐŧŅ Đ—Đ°ĐŗŅ€ŅƒĐˇĐēи", + "IMMUTABLE": "НĐĩиСĐŧĐĩĐŊŅĐĩĐŧŅ‹Đš", + "MY_REPOSITORY": "Мой Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "PUBLIC_REPOSITORY": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "DELETION_TITLE_REPO": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŖĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ", + "DELETION_TITLE_REPO_SIGNED": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊ", + "DELETION_SUMMARY_REPO_SIGNED": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš '{{repoName}}' ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊ, Ņ‚Đ°Đē ĐēаĐē ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‚ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅ€Đ°ĐˇŅ‹.\n{{signedImages}} \nПĐĩŅ€ĐĩĐ´ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩĐŧ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋОдĐŋĐ¸ŅŅŒ Đ˛ŅĐĩŅ… ĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊҋ҅ ĐžĐąŅ€Đ°ĐˇĐžĐ˛!", + "DELETION_SUMMARY_REPO": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš {{repoName}}?", + "DELETION_TITLE_ARTIFACT": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŖĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Đ°", + "DELETION_SUMMARY_ARTIFACT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ {{param}}? ĐŸŅ€Đ¸ ŅƒĐ´Đ°ĐģĐĩĐŊии ŅŅ‚ĐžĐŗĐž Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Đ° Đ˛ŅĐĩ Ņ‚ĐĩĐŗĐ¸, ҁҁҋĐģĐ°ŅŽŅ‰Đ¸ĐĩŅŅ ĐŊа ŅŅ‚ĐžŅ‚ Ņ…ŅŅˆ, Ņ‚Đ°ĐēĐļĐĩ ĐąŅƒĐ´ŅƒŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹.", + "DELETION_TITLE_TAG": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŖĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ĐĸĐĩĐŗĐ°", + "DELETION_SUMMARY_TAG": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐŗ {{param}}?", + "DELETION_TITLE_TAG_DENIED": "ПодĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš Ņ‚ĐĩĐŗ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊ", + "DELETION_SUMMARY_TAG_DENIED": "ĐĸĐĩĐŗ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊ иС ĐĐžŅ‚Đ°Ņ€Đ¸ŅƒŅĐ° ĐŋĐĩŅ€ĐĩĐ´ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩĐŧ.\nĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иС ĐĐžŅ‚Đ°Ņ€Đ¸ŅƒŅĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ŅŅ‚ĐžĐš ĐēĐžĐŧаĐŊĐ´Ņ‹:\n", + "TAGS_NO_DELETE": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ СаĐŋŅ€Đĩ҉ĐĩĐŊĐž в Ņ€ĐĩĐļиĐŧĐĩ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ.", + "FILTER_FOR_REPOSITORIES": "ФиĐģŅŒŅ‚Ņ€ Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв", + "TAG": "ĐĸĐĩĐŗ", + "ARTIFACT": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚", + "ARTIFACTS": "ĐŅ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ", + "SIZE": "РаСĐŧĐĩŅ€", + "VULNERABILITY": "ĐŖŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸", + "BUILD_HISTORY": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ĐĄĐąĐžŅ€Đēи", + "SIGNED": "ПодĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš", + "AUTHOR": "ĐĐ˛Ņ‚ĐžŅ€", + "CREATED": "Đ’Ņ€ĐĩĐŧŅ ХОСдаĐŊĐ¸Ņ", + "DOCKER_VERSION": "ВĐĩŅ€ŅĐ¸Ņ Docker", + "ARCHITECTURE": "ĐŅ€Ņ…Đ¸Ņ‚ĐĩĐēŅ‚ŅƒŅ€Đ°", + "OS": "ОС", + "SHOW_DETAILS": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ДĐĩŅ‚Đ°Đģи", + "REPOSITORIES": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "OF": "иС", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "NO_ITEMS": "НЕĐĸ ЭЛЕМЕНĐĸОВ", + "POP_REPOS": "ПоĐŋ҃ĐģŅŅ€ĐŊŅ‹Đĩ Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "DELETED_REPO_SUCCESS": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹.", + "DELETED_TAG_SUCCESS": "ĐĸĐĩĐŗĐ¸ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹.", + "COPY": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "NOTARY_IS_UNDETERMINED": "НĐĩвОСĐŧĐžĐļĐŊĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ĐŋОдĐŋĐ¸ŅŅŒ ŅŅ‚ĐžĐŗĐž Ņ‚ĐĩĐŗĐ°.", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв!", + "INFO": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ", + "NO_INFO": "НĐĩŅ‚ ĐžĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐĩĐŗĐž в ŅŅ‚ĐžŅ‚ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš.", + "IMAGE": "ĐžĐąŅ€Đ°ĐˇŅ‹", + "LABELS": "МĐĩŅ‚Đēи", + "ADD_LABEL_TO_IMAGE": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŧĐĩŅ‚Đēи Đē ŅŅ‚ĐžĐŧ҃ ĐžĐąŅ€Đ°ĐˇŅƒ", + "FILTER_BY_LABEL": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°ĐˇŅ‹ ĐŋĐž ĐŧĐĩŅ‚ĐēĐĩ", + "FILTER_ARTIFACT_BY_LABEL": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ĐŋĐž ĐŧĐĩŅ‚ĐēĐĩ", + "ADD_LABELS": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ МĐĩŅ‚Đēи", + "RETAG": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "ACTION": "ДЕЙСĐĸВИЕ", + "DEPLOY": "Đ ĐĐ—Đ’Đ•Đ ĐĐŖĐĸĐŦ", + "ADDITIONAL_INFO": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ", + "REPO_NAME": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "MARKDOWN": "ПоддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ ĐžŅ„ĐžŅ€ĐŧĐģĐĩĐŊиĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Markdown", + "LAST_MODIFIED": "Đ’Ņ€ĐĩĐŧŅ ĐŸĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž ИСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ" + }, + "HELM_CHART": { + "HELMCHARTS": "Đ”Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹", + "CHARTVERSIONS": "ВĐĩŅ€ŅĐ¸Đ¸", + "UPLOAD_TITLE": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹", + "CHART_FILE": "ФаКĐģ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹", + "CHART_PROV": "ФаКĐģ Prov", + "DOWNLOAD": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ", + "SUMMARY": "ХвОдĐēа", + "DEPENDENCIES": "Đ—Đ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸", + "VALUES": "ЗĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "OVERVIEW": "ĐžĐąĐˇĐžŅ€", + "HOME": "ГĐģавĐŊĐ°Ņ", + "SRC_REPO": "Đ˜ŅŅ…ĐžĐ´ĐŊŅ‹Đš Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "CREATED": "Đ’Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ", + "MAINTAINERS": "ĐĄĐžĐŋŅ€ĐžĐ˛ĐžĐļĐ´Đ°ŅŽŅ‰Đ¸Đĩ", + "OTHER_MAINTAINERS": "{{ name }} и {{ number }} Đ´Ņ€ŅƒĐŗĐ¸Ņ…", + "PULLS": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž СаĐŋŅ€ĐžŅĐžĐ˛", + "VERSION": "ВĐĩŅ€ŅĐ¸Ņ", + "APP_VERSION": "ВĐĩŅ€ŅĐ¸Ņ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ", + "INSTALL": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", + "INSTALL_CHART": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧ҃", + "NAME": "ИĐŧŅ", + "REPO": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "FILTER_FOR_CHARTS": "ФиĐģŅŒŅ‚Ņ€ Đ´ĐģŅ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "OF": "иС", + "VERSIONS": "вĐĩŅ€ŅĐ¸Đš", + "IMAGES": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", + "ENGINE": "ДвиĐļĐžĐē", + "ACTION": "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ", + "UPLOAD": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ", + "DELETE_CHART_VERSION_TITLE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐĩŅ€ŅĐ¸Đ¸ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹", + "DELETE_CHART_VERSION": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐĩŅ€ŅĐ¸ŅŽ {{param}}?", + "IMPORT": "ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "EXPORT": "Đ­ĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "ADD_REPO": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "SHOW_KV": "ĐŸĐ°Ņ€Ņ‹ ĐēĐģŅŽŅ‡-СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ", + "SHOW_YAML": "ФаКĐģ YAML", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧ!", + "NO_VERSION_PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… вĐĩŅ€ŅĐ¸Đš!", + "FILE_UPLOADED": "ФаКĐģ ҃ҁĐŋĐĩ҈ĐŊĐž ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊ", + "SIGN": "ПодĐŋĐ¸ŅĐ°Ņ‚ŅŒ", + "SIGNED": "ПодĐŋĐ¸ŅĐ°ĐŊĐž", + "UNSIGNED": "НĐĩ ĐŋОдĐŋĐ¸ŅĐ°ĐŊĐž", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "NO_README": "ДĐģŅ ŅŅ‚ĐžĐš Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹ ĐŊĐĩ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊ Ņ„Đ°ĐšĐģ readme.", + "SECURITY": "БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ", + "ACTIVE": "АĐēŅ‚Đ¸Đ˛ĐŊĐž", + "DEPRECATED": "ĐŖŅŅ‚Đ°Ņ€ĐĩĐģĐž", + "VERIFY_CHART": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧ҃", + "COMMAND": "КоĐŧаĐŊĐ´Ņ‹", + "PROV_FILE": "ФаКĐģ Prov", + "READY": "Đ“ĐžŅ‚ĐžĐ˛Đž", + "NOT_READY": "НĐĩ ĐŗĐžŅ‚ĐžĐ˛Đž", + "LABELS": "МĐĩŅ‚Đēи", + "ADD_LABEL_TO_CHART_VERSION": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŧĐĩŅ‚Đēи Đē ŅŅ‚ĐžĐš вĐĩŅ€ŅĐ¸Đ¸ Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧŅ‹", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ" + }, + "SUMMARY": { + "QUOTAS": "ĐēĐ˛ĐžŅ‚Ņ‹", + "PROJECT_REPOSITORY": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "PROJECT_HELM_CHART": "Đ”Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧа Helm", + "PROJECT_MEMBER": "ĐŖŅ‡Đ°ŅŅ‚ĐŊиĐēи", + "PROJECT_QUOTAS": "ĐšĐ˛ĐžŅ‚Ņ‹", + "ARTIFACT_COUNT": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "STORAGE_CONSUMPTION": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊиĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°", + "ADMIN": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€(Ņ‹)", + "MAINTAINER": "ĐĄĐžĐŋŅ€ĐžĐ˛ĐžĐļĐ´Đ°ŅŽŅ‰Đ¸Đš(иĐĩ)", + "DEVELOPER": "Đ Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đē(и)", + "GUEST": "Đ“ĐžŅŅ‚ŅŒ(и)", + "LIMITED_GUEST": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅ‹Đš ĐŗĐžŅŅ‚ŅŒ(и)", + "SEE_ALL": "ПОСМОĐĸРЕĐĸĐŦ ВСЕ" + }, + "ALERT": { + "FORM_CHANGE_CONFIRMATION": "НĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ Đĩ҉Đĩ ĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹. Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ?" + }, + "RESET_PWD": { + "TITLE": "ĐĄĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ", + "CAPTION": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ˛Đ°ŅˆŅƒ ĐŋĐžŅ‡Ņ‚Ņƒ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ", + "EMAIL": "ĐŸĐžŅ‡Ņ‚Đ°", + "SUCCESS": "ĐŸĐ¸ŅŅŒĐŧĐž ŅĐž ҁҁҋĐģĐēОК Đ´ĐģŅ ŅĐąŅ€ĐžŅĐ° ĐŋĐ°Ņ€ĐžĐģŅ ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐž. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ СаĐēŅ€Ņ‹Ņ‚ŅŒ ŅŅ‚Đž диаĐģĐžĐŗĐžĐ˛ĐžĐĩ ĐžĐēĐŊĐž и ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅĐ˛ĐžŅŽ ĐŋĐžŅ‡Ņ‚Ņƒ.", + "CAPTION2": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ˛Đ°Ņˆ ĐŊĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "RESET_OK": "ĐŸĐ°Ņ€ĐžĐģҌ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐąŅ€ĐžŅˆĐĩĐŊ. НаĐļĐŧĐ¸Ņ‚Đĩ ОК, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ĐžĐšŅ‚Đ¸ ҁ ĐŊĐžĐ˛Ņ‹Đŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ." + }, + "RECENT_LOG": { + "SUB_TITLE": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ", + "SUB_TITLE_SUFIX": "Đ›ĐžĐŗĐ¸" + }, + "CONFIG": { + "HISTORY": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ", + "TITLE": "КоĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ", + "AUTH": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ", + "REPLICATION": "Đ ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Ņ", + "LABEL": "МĐĩŅ‚Đēи", + "REPOSITORY": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "REPO_READ_ONLY": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ", + "WEBHOOK_NOTIFICATION_ENABLED": "ВĐĩĐąŅ…ŅƒĐēи вĐēĐģŅŽŅ‡ĐĩĐŊŅ‹", + "SYSTEM": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹", + "PROJECT_QUOTAS": "ĐšĐ˛ĐžŅ‚Ņ‹ ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛", + "VULNERABILITY": "ĐŖŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ŅŒ", + "GC": "ĐĄĐąĐžŅ€Đēа ĐŧŅƒŅĐžŅ€Đ°", + "CONFIRM_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐžŅ‚ĐŧĐĩĐŊ҃", + "CONFIRM_SUMMARY": "НĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ ĐąŅ‹Đģи ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹. Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Đ¸Ņ…?", + "SAVE_SUCCESS": "КоĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊа.", + "VERIFY_REMOTE_CERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°", + "TOKEN_EXPIRATION": "ĐĄŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Ņ‚ĐžĐēĐĩĐŊа (МиĐŊŅƒŅ‚Ņ‹)", + "SESSION_TIMEOUT": "ĐĸаКĐŧ-Đ°ŅƒŅ‚ ҁĐĩŅŅĐ¸Đ¸ (МиĐŊŅƒŅ‚Ņ‹)", + "SESSION_TIMEOUT_INFO": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚ ҁĐĩŅŅĐ¸Đ¸ Đ´ĐģŅ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ° Harbor. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 60 ĐŧиĐŊŅƒŅ‚.", + "AUTH_MODE": "Đ ĐĩĐļиĐŧ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸", + "PRO_CREATION_RESTRICTION": "ХОСдаĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛", + "SELF_REGISTRATION": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ŅĐ°ĐŧĐžŅ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŽ", + "AUTH_MODE_DB": "База даĐŊĐŊҋ҅", + "AUTH_MODE_LDAP": "LDAP", + "AUTH_MODE_UAA": "UAA", + "AUTH_MODE_HTTP": "HTTP Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ", + "AUTH_MODE_OIDC": "OIDC", + "SCOPE_BASE": "Đ‘Đ°ĐˇĐžĐ˛Ņ‹Đš", + "SCOPE_ONE_LEVEL": "ОдиĐŊ ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ", + "SCOPE_SUBTREE": "ПоддĐĩŅ€ĐĩвО", + "PRO_CREATION_EVERYONE": "Đ’ŅĐĩ", + "PRO_CREATION_ADMIN": "ĐĸĐžĐģҌĐēĐž адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€", + "ROOT_CERT": "ĐšĐžŅ€ĐŊĐĩвОК ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ°", + "ROOT_CERT_LINK": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ", + "REGISTRY_CERTIFICATE": "ĐĄĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ°", + "NO_CHANGE": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž, Ņ‚Đ°Đē ĐēаĐē ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊиĐģĐžŅŅŒ", + "TOOLTIP": { + "SELF_REGISTRATION_ENABLE": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŽ.", + "SELF_REGISTRATION_DISABLE": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŽ.", + "VERIFY_REMOTE_CERT": "ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚, Đ´ĐžĐģĐļĐŊа Đģи Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Ņ ĐžĐąŅ€Đ°ĐˇĐžĐ˛ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ‚ŅŒ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Ņ€ĐĩĐĩŅŅ‚Ņ€Đ° Harbor. ĐĄĐŊиĐŧĐ¸Ņ‚Đĩ ŅŅ‚ĐžŅ‚ Ņ„ĐģаĐļĐžĐē, ĐĩҁĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš Ņ€ĐĩĐĩҁ҂Ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš иĐģи ĐŊĐĩĐŊадĐĩĐļĐŊŅ‹Đš ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚.", + "AUTH_MODE": "По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ Ņ€ĐĩĐļиĐŧ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ — йаСа даĐŊĐŊҋ҅, Ņ‚. Đĩ. ŅƒŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ Ņ…Ņ€Đ°ĐŊŅŅ‚ŅŅ в ĐģĐžĐēаĐģҌĐŊОК йаСĐĩ даĐŊĐŊҋ҅. ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐĩĐŗĐž в LDAP, ĐĩҁĐģи Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅƒŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐŊа LDAP-ҁĐĩŅ€Đ˛ĐĩŅ€Đĩ.", + "LDAP_SEARCH_DN": "DN ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ, ҃ ĐēĐžŅ‚ĐžŅ€ĐžĐŗĐž ĐĩŅŅ‚ŅŒ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ ĐŊа ĐŋĐžĐ¸ŅĐē ĐŊа LDAP/AD ҁĐĩŅ€Đ˛ĐĩŅ€Đĩ. Đ•ŅĐģи Đ˛Đ°Ņˆ LDAP/AD ҁĐĩŅ€Đ˛ĐĩŅ€ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ аĐŊĐžĐŊиĐŧĐŊŅ‹Đš ĐŋĐžĐ¸ŅĐē, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ DN и ldap_search_pwd.", + "LDAP_BASE_DN": "Đ‘Đ°ĐˇĐžĐ˛Ņ‹Đš DN Đ´ĐģŅ ĐŋĐžĐ¸ŅĐēа ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ в LDAP/AD.", + "LDAP_UID": "ĐŅ‚Ņ€Đ¸ĐąŅƒŅ‚, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đš ĐŋŅ€Đ¸ ĐŋĐžĐ¸ŅĐēĐĩ Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ uid, cn, email, sAMAccountName иĐģи Đ´Ņ€ŅƒĐŗĐ¸Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ Đ˛Đ°ŅˆĐĩĐŗĐž LDAP/AD.", + "LDAP_SCOPE": "ОбĐģĐ°ŅŅ‚ŅŒ ĐŋĐžĐ¸ŅĐēа ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš.", + "TOKEN_EXPIRATION": "Đ’Ņ€ĐĩĐŧŅ Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ ŅŅ€ĐžĐēа Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Ņ‚ĐžĐēĐĩĐŊа, ŅĐžĐˇĐ´Đ°ĐŊĐŊĐžĐŗĐž ҁĐģ҃ĐļйОК Ņ‚ĐžĐēĐĩĐŊОв. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 30 ĐŧиĐŊŅƒŅ‚.", + "ROBOT_NAME_PREFIX": "ĐŸŅ€ĐĩŅ„Đ¸Đēҁ ŅŅ‚Ņ€ĐžĐēи Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž иĐŧĐĩĐŊи Ņ€ĐžĐąĐžŅ‚Đ°, СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 'robot$'", + "ROBOT_TOKEN_EXPIRATION": "Đ’Ņ€ĐĩĐŧŅ Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ ŅŅ€ĐžĐēа Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Ņ‚ĐžĐēĐĩĐŊа ŅƒŅ‡ĐĩŅ‚ĐŊОК СаĐŋĐ¸ŅĐ¸ Ņ€ĐžĐąĐžŅ‚Đ°, ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 30 Đ´ĐŊĐĩĐš. ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ´ĐŊĐĩĐš, ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊĐŊҋ҅ иС ĐŧиĐŊŅƒŅ‚ и ĐžĐēŅ€ŅƒĐŗĐģĐĩĐŊĐŊҋ҅ в ĐŧĐĩĐŊŅŒŅˆŅƒŅŽ ŅŅ‚ĐžŅ€ĐžĐŊ҃", + "PRO_CREATION_RESTRICTION": "ФĐģĐ°Đŗ, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅŅŽŅ‰Đ¸Đš, ĐēаĐēиĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи иĐŧĐĩŅŽŅ‚ ĐŋŅ€Đ°Đ˛Đž ŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐē҂ҋ. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐģŅŽĐąĐžĐš ĐŧĐžĐļĐĩŅ‚ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐēŅ‚. ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ 'ĐĸĐžĐģҌĐēĐž адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€', Ņ‡Ņ‚ĐžĐąŅ‹ Ņ‚ĐžĐģҌĐēĐž адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ ĐŧĐžĐŗ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐēŅ‚.", + "ROOT_CERT_DOWNLOAD": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ ĐēĐžŅ€ĐŊĐĩвОК ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ°.", + "SCANNING_POLICY": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ĐžĐąŅ€Đ°ĐˇĐžĐ˛ ĐŊа ĐžŅĐŊОвĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊҋ҅ ҂ҀĐĩйОваĐŊиК. 'НĐĩŅ‚': НĐĩŅ‚ аĐēŅ‚Đ¸Đ˛ĐŊОК ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи; 'ЕĐļĐĩĐ´ĐŊĐĩвĐŊĐž в': ЗаĐŋ҃ҁĐē ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ в ҃ĐēаСаĐŊĐŊĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐēаĐļĐ´Ņ‹Đš Đ´ĐĩĐŊҌ.", + "VERIFY_CERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ҁ LDAP ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", + "REPO_TOOLTIP": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒ ĐŊиĐēаĐēĐ¸Ņ… ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đš ҁ ĐžĐąŅ€Đ°ĐˇĐ°Đŧи в ŅŅ‚ĐžĐŧ Ņ€ĐĩĐļиĐŧĐĩ.", + "WEBHOOK_TOOLTIP": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ вĐĩĐąŅ…ŅƒĐēи, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°Ņ‚ĐŊŅ‹Đĩ Đ˛Ņ‹ĐˇĐžĐ˛Ņ‹ ĐŊа Đ˛Đ°ŅˆĐ¸ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ‹Đĩ ĐēĐžĐŊĐĩ҇ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅŽŅ‚ŅŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ, Ņ‚Đ°ĐēиĐĩ ĐēаĐē ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēа, ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиĐĩ, ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ, ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐžĐąŅ€Đ°ĐˇĐžĐ˛ иĐģи Đ´Đ¸Đ°ĐŗŅ€Đ°ĐŧĐŧ", + "HOURLY_CRON": "ЗаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ ОдиĐŊ Ņ€Đ°Đˇ в Ņ‡Đ°Ņ, в ĐŊĐ°Ņ‡Đ°ĐģĐĩ Ņ‡Đ°ŅĐ°. Đ­ĐēвиваĐģĐĩĐŊŅ‚ĐŊĐž 0 0 * * * *.", + "WEEKLY_CRON": "ЗаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ ОдиĐŊ Ņ€Đ°Đˇ в ĐŊĐĩĐ´ĐĩĐģŅŽ, в ĐŋĐžĐģĐŊĐžŅ‡ŅŒ ĐŧĐĩĐļĐ´Ņƒ ŅŅƒĐąĐąĐžŅ‚ĐžĐš и Đ˛ĐžŅĐēŅ€ĐĩҁĐĩĐŊҌĐĩĐŧ. Đ­ĐēвиваĐģĐĩĐŊŅ‚ĐŊĐž 0 0 0 * * 0.", + "DAILY_CRON": "ЗаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ ОдиĐŊ Ņ€Đ°Đˇ в Đ´ĐĩĐŊҌ, в ĐŋĐžĐģĐŊĐžŅ‡ŅŒ. Đ­ĐēвиваĐģĐĩĐŊŅ‚ĐŊĐž 0 0 0 * * *." + }, + "LDAP": { + "URL": "URL ҁĐĩŅ€Đ˛ĐĩŅ€Đ° LDAP", + "SEARCH_DN": "ĐŸĐžĐ¸ŅĐē DN в LDAP", + "SEARCH_PWD": "ĐŸĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ ĐŋĐžĐ¸ŅĐēа в LDAP", + "BASE_DN": "Đ‘Đ°ĐˇĐžĐ˛Ņ‹Đš DN в LDAP", + "FILTER": "ФиĐģŅŒŅ‚Ņ€ LDAP", + "UID": "UID в LDAP", + "SCOPE": "ОбĐģĐ°ŅŅ‚ŅŒ ĐŋĐžĐ¸ŅĐēа LDAP", + "VERIFY_CERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ° LDAP", + "LDAP_GROUP_BASE_DN": "Đ‘Đ°ĐˇĐžĐ˛Ņ‹Đš DN ĐŗŅ€ŅƒĐŋĐŋŅ‹ в LDAP", + "LDAP_GROUP_BASE_DN_INFO": "Đ‘Đ°ĐˇĐžĐ˛Ņ‹Đš DN, ҁ ĐēĐžŅ‚ĐžŅ€ĐžĐŗĐž ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŋĐžĐ¸ŅĐē ĐŗŅ€ŅƒĐŋĐŋŅ‹ в LDAP/AD. Đ­Ņ‚Đž ĐŋĐžĐģĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ, ĐĩҁĐģи ваĐŧ ĐŊ҃ĐļĐŊĐž вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, ŅĐ˛ŅĐˇĐ°ĐŊĐŊŅƒŅŽ ҁ ĐŗŅ€ŅƒĐŋĐŋаĐŧи LDAP.", + "LDAP_GROUP_FILTER": "ФиĐģŅŒŅ‚Ņ€ ĐŗŅ€ŅƒĐŋĐŋŅ‹ LDAP", + "LDAP_GROUP_FILTER_INFO": "ФиĐģŅŒŅ‚Ņ€ Đ´ĐģŅ ĐŋĐžĐ¸ŅĐēа ĐŗŅ€ŅƒĐŋĐŋ LDAP/AD. ДĐģŅ OpenLDAP: objectclass=groupOfNames. ДĐģŅ Active Directory: objectclass=group. Đ­Ņ‚Đž ĐŋĐžĐģĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ, ĐĩҁĐģи ваĐŧ ĐŊ҃ĐļĐŊа Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, ŅĐ˛ŅĐˇĐ°ĐŊĐŊĐ°Ņ ҁ ĐŗŅ€ŅƒĐŋĐŋаĐŧи LDAP.", + "LDAP_GROUP_GID": "GID ĐŗŅ€ŅƒĐŋĐŋŅ‹ в LDAP", + "LDAP_GROUP_GID_INFO": "ĐŅ‚Ņ€Đ¸ĐąŅƒŅ‚, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đš Đ´ĐģŅ ĐŋĐžĐ¸ŅĐēа ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ, ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ uid, cn иĐģи Đ´Ņ€ŅƒĐŗĐ¸Đŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ Đ˛Đ°ŅˆĐĩĐŗĐž LDAP/AD. Đ“Ņ€ŅƒĐŋĐŋа в Harbor ĐąŅƒĐ´ĐĩŅ‚ ĐŊĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒŅŅ ĐŋĐž ŅŅ‚ĐžĐŧ҃ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņƒ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ. Đ­Ņ‚Đž ĐŋĐžĐģĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ, ĐĩҁĐģи ваĐŧ ĐŊ҃ĐļĐŊĐž вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, ŅĐ˛ŅĐˇĐ°ĐŊĐŊŅƒŅŽ ҁ ĐŗŅ€ŅƒĐŋĐŋаĐŧи LDAP.", + "LDAP_GROUP_ADMIN_DN": "DN адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° ĐŗŅ€ŅƒĐŋĐŋŅ‹ в LDAP", + "LDAP_GROUP_ADMIN_DN_INFO": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ DN ĐŗŅ€ŅƒĐŋĐŋŅ‹ LDAP. Đ’ŅĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи LDAP в ŅŅ‚ĐžĐš ĐŗŅ€ŅƒĐŋĐŋĐĩ ĐąŅƒĐ´ŅƒŅ‚ иĐŧĐĩŅ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ° адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° в Harbor. ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐŋŅƒŅŅ‚Ņ‹Đŧ, ĐĩҁĐģи ĐŊĐĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅŅ‚ĐžĐŗĐž.", + "LDAP_GROUP_MEMBERSHIP": "ЧĐģĐĩĐŊŅŅ‚Đ˛Đž в ĐŗŅ€ŅƒĐŋĐŋĐĩ LDAP", + "LDAP_GROUP_MEMBERSHIP_INFO": "ĐŅ‚Ņ€Đ¸ĐąŅƒŅ‚, ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ŅŽŅ‰Đ¸Đš ҇ĐģĐĩĐŊŅŅ‚Đ˛Đž в ĐŗŅ€ŅƒĐŋĐŋĐĩ LDAP, СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — memberof, в ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… LDAP-ҁĐĩŅ€Đ˛ĐĩŅ€Đ°Ņ… ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ \"ismemberof\". Đ­Ņ‚Đž ĐŋĐžĐģĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ, ĐĩҁĐģи ваĐŧ ĐŊ҃ĐļĐŊĐž вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, ŅĐ˛ŅĐˇĐ°ĐŊĐŊŅƒŅŽ ҁ ĐŗŅ€ŅƒĐŋĐŋаĐŧи LDAP.", + "GROUP_SCOPE": "ОбĐģĐ°ŅŅ‚ŅŒ ĐŋĐžĐ¸ŅĐēа ĐŗŅ€ŅƒĐŋĐŋ LDAP", + "GROUP_SCOPE_INFO": "ОбĐģĐ°ŅŅ‚ŅŒ ĐŋĐžĐ¸ŅĐēа ĐŗŅ€ŅƒĐŋĐŋ, ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ŅŅ Subtree." + }, + "UAA": { + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа UAA", + "CLIENT_ID": "ID ĐēĐģиĐĩĐŊŅ‚Đ° UAA", + "CLIENT_SECRET": "ĐĄĐĩĐēŅ€ĐĩŅ‚ ĐēĐģиĐĩĐŊŅ‚Đ° UAA", + "VERIFY_CERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ° UAA" + }, + "HTTP_AUTH": { + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", + "TOKEN_REVIEW": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Ņ‚ĐžĐēĐĩĐŊа", + "SKIP_SEARCH": "ĐŸŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐ¸ŅĐē", + "VERIFY_CERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°", + "ADMIN_GROUPS": "Đ“Ņ€ŅƒĐŋĐŋŅ‹ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐ˛" + }, + "OIDC": { + "OIDC_PROVIDER": "НазваĐŊиĐĩ ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ° OIDC", + "OIDC_REDIREC_URL": "ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž URL ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŊа ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đĩ OIDC ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ ĐŊа", + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа OIDC", + "CLIENT_ID": "ID ĐēĐģиĐĩĐŊŅ‚Đ° OIDC", + "CLIENTSECRET": "ĐĄĐĩĐēŅ€ĐĩŅ‚ ĐēĐģиĐĩĐŊŅ‚Đ° OIDC", + "SCOPE": "ОбĐģĐ°ŅŅ‚ŅŒ OIDC", + "OIDC_VERIFYCERT": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°", + "OIDC_AUTOONBOARD": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐ°Ņ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ", + "USER_CLAIM": "ĐŖŅ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ иĐŧĐĩĐŊи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "OIDC_SETNAME": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ OIDC", + "OIDC_SETNAMECONTENT": "Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ Harbor ĐŋŅ€Đ¸ ĐŋĐĩŅ€Đ˛ĐžĐš Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ€ĐĩС ŅŅ‚ĐžŅ€ĐžĐŊĐŊиК ҁĐĩŅ€Đ˛Đ¸Ņ (OIDC). Đ­Ņ‚Đž иĐŧŅ ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ в Harbor Đ´ĐģŅ ŅĐ˛ŅĐˇĐ¸ ҁ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Đŧи, Ņ€ĐžĐģŅĐŧи и Ņ‚.Đ´.", + "OIDC_USERNAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "GROUP_CLAIM_NAME": "ИĐŧŅ ŅƒŅ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ ĐŗŅ€ŅƒĐŋĐŋŅ‹", + "GROUP_CLAIM_NAME_INFO": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐžĐŗĐž ŅƒŅ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ ĐŗŅ€ŅƒĐŋĐŋŅ‹, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Đģи ҃ ŅĐ˛ĐžĐĩĐŗĐž ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ° OIDC", + "OIDC_ADMIN_GROUP": "Đ“Ņ€ŅƒĐŋĐŋа адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐ˛ OIDC", + "OIDC_ADMIN_GROUP_INFO": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ иĐŧŅ ĐŗŅ€ŅƒĐŋĐŋŅ‹ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐ˛ OIDC. Đ’ŅĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи OIDC в ŅŅ‚ĐžĐš ĐŗŅ€ŅƒĐŋĐŋĐĩ ĐąŅƒĐ´ŅƒŅ‚ иĐŧĐĩŅ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ° адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° в Harbor. ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐŋŅƒŅŅ‚Ņ‹Đŧ, ĐĩҁĐģи ĐŊĐĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅŅ‚ĐžĐŗĐž.", + "OIDC_GROUP_FILTER": "ФиĐģŅŒŅ‚Ņ€ ĐŗŅ€ŅƒĐŋĐŋ OIDC", + "OIDC_GROUP_FILTER_INFO": "ФиĐģŅŒŅ‚Ņ€ ĐŗŅ€ŅƒĐŋĐŋ OIDC, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊĐžĐŧ҃ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐžĐŧ҃ Đ˛Ņ‹Ņ€Đ°ĐļĐĩĐŊĐ¸ŅŽ. ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐŋŅƒŅŅ‚Ņ‹Đŧ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩĐŧ ĐŗŅ€ŅƒĐŋĐŋаĐŧ." + }, + "SCANNING": { + "STOP_SCAN_ALL_SUCCESS": "ĐĸŅ€Đ¸ĐŗĐŗĐĩŅ€ ĐžŅŅ‚Đ°ĐŊОвĐēи ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ҃ҁĐŋĐĩ҈ĐŊĐž!", + "TRIGGER_SCAN_ALL_SUCCESS": "ĐĸŅ€Đ¸ĐŗĐŗĐĩŅ€ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ҃ҁĐŋĐĩ҈ĐŊĐž!", + "TRIGGER_SCAN_ALL_FAIL": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩŅ… ҁ ĐžŅˆĐ¸ĐąĐēОК: {{error}}", + "TITLE": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš", + "SCAN_ALL": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ", + "SCHEDULE_TO_SCAN_ALL": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩŅ…", + "SCAN_NOW": "СКАНИРОВАĐĸĐŦ СЕЙЧАС", + "SCAN": "СКАНИРОВАĐĸĐŦ", + "NONE_POLICY": "НĐĩŅ‚", + "DAILY_POLICY": "ЕĐļĐĩĐ´ĐŊĐĩвĐŊĐž в", + "REFRESH_POLICY": "ĐŸŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии", + "DB_REFRESH_TIME": "База даĐŊĐŊҋ҅ ОйĐŊОвĐģĐĩĐŊа", + "DB_NOT_READY": "База даĐŊĐŊҋ҅ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ĐŗĐžŅ‚ĐžĐ˛Đ°!", + "NEXT_SCAN": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊĐž ĐŋĐžŅĐģĐĩ", + "STATUS": { + "PENDING": "В ĐžĐļидаĐŊии", + "RUNNING": "Đ’Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ", + "STOPPED": "ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "ERROR": "ĐžŅˆĐ¸ĐąĐēа", + "SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž", + "SCHEDULED": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž" + }, + "MANUAL": "Đ’Ņ€ŅƒŅ‡ĐŊŅƒŅŽ", + "SCHEDULED": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž" + }, + "TEST_MAIL_SUCCESS": "ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ ҁ ĐŋĐžŅ‡Ņ‚ĐžĐ˛Ņ‹Đŧ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐž.", + "TEST_LDAP_SUCCESS": "ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ ҁ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ LDAP ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐž.", + "TEST_MAIL_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ ҁ ĐŋĐžŅ‡Ņ‚ĐžĐ˛Ņ‹Đŧ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ ҁ ĐžŅˆĐ¸ĐąĐēОК: {{param}}.", + "TEST_LDAP_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ ҁ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ LDAP ҁ ĐžŅˆĐ¸ĐąĐēОК: {{param}}.", + "LEAVING_CONFIRMATION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ Đ˛Ņ‹Ņ…ĐžĐ´Đ°", + "LEAVING_CONFIRMATION_SUMMARY": "ИСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ Đĩ҉Đĩ ĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹. ĐĨĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐžĐēиĐŊŅƒŅ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰ŅƒŅŽ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ?", + "TEST_OIDC_SUCCESS": "ĐĄĐžĐĩдиĐŊĐĩĐŊиĐĩ ҁ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ OIDC ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐž." + }, + "PAGE_NOT_FOUND": { + "MAIN_TITLE": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° ĐŊĐĩ ĐŊаКдĐĩĐŊа", + "SUB_TITLE": "ПĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŗĐģавĐŊŅƒŅŽ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ҇ĐĩŅ€ĐĩС", + "UNIT": "ҁĐĩĐē҃ĐŊĐ´..." + }, + "ABOUT": { + "VERSION": "ВĐĩŅ€ŅĐ¸Ņ", + "BUILD": "ĐĄĐąĐžŅ€Đēа", + "COPYRIGHT": "ĐŸŅ€ĐžĐĩĐēŅ‚ Harbor — ŅŅ‚Đž ĐŋŅ€ĐžĐĩĐēŅ‚ ҁ ĐžŅ‚ĐēҀҋ҂ҋĐŧ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đŧ ĐēОдОĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚, ĐŋОдĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ и ҁĐēаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚. Harbor Ņ€Đ°ŅŅˆĐ¸Ņ€ŅĐĩŅ‚ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Ņ‹Đš Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đš ĐēОд Docker Distribution, дОйавĐģŅŅ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, ĐžĐąŅ‹Ņ‡ĐŊĐž ҂ҀĐĩĐąŅƒĐĩĐŧŅƒŅŽ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧи, Ņ‚Đ°ĐēŅƒŅŽ ĐēаĐē ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ, ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐĩĐš и Đ´ĐžŅŅ‚ŅƒĐŋĐžĐŧ. Harbor ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đĩ Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸, Ņ‚Đ°ĐēиĐĩ ĐēаĐē ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧи, ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌ Đ´ĐžŅŅ‚ŅƒĐŋа, ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗ аĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚Đ¸ и Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Ņ ĐŧĐĩĐļĐ´Ņƒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°Đŧи. НаĐģĐ¸Ņ‡Đ¸Đĩ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ° ĐąĐģиĐļĐĩ Đē ҁҀĐĩĐ´Đĩ ŅĐąĐžŅ€Đēи и Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚ ҃ĐģŅƒŅ‡ŅˆĐ¸Ņ‚ŅŒ ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸ ĐžĐąŅ€Đ°ĐˇĐžĐ˛.", + "COPYRIGHT_SUFIX": ".", + "TRADEMARK": "VMware ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐˇĐ°Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊОК Ņ‚ĐžŅ€ĐŗĐžĐ˛ĐžĐš ĐŧĐ°Ņ€ĐēОК иĐģи Ņ‚ĐžŅ€ĐŗĐžĐ˛ĐžĐš ĐŧĐ°Ņ€ĐēОК VMware, Inc. в ĐĄĐžĐĩдиĐŊĐĩĐŊĐŊҋ҅ Đ¨Ņ‚Đ°Ņ‚Đ°Ņ… и Đ´Ņ€ŅƒĐŗĐ¸Ņ… ŅŅ‚Ņ€Đ°ĐŊĐ°Ņ…. Đ’ŅĐĩ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐŊаСваĐŊĐ¸Ņ, ҃ĐŋĐžĐŧŅĐŊŅƒŅ‚Ņ‹Đĩ СдĐĩҁҌ, ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Ņ‚ĐžĐ˛Đ°Ņ€ĐŊŅ‹Đŧи СĐŊаĐēаĐŧи ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… ĐēĐžĐŧĐŋаĐŊиК.", + "END_USER_LICENSE": "Đ›Đ¸Ņ†ĐĩĐŊСиОĐŊĐŊĐžĐĩ ŅĐžĐŗĐģĐ°ŅˆĐĩĐŊиĐĩ ҁ ĐēĐžĐŊĐĩ҇ĐŊŅ‹Đŧ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐŧ", + "OPEN_SOURCE_LICENSE": "Đ›Đ¸Ņ†ĐĩĐŊĐˇĐ¸Ņ ĐŊа ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Ņ‹Đš Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đš ĐēОд/Đ›Đ¸Ņ†ĐĩĐŊĐˇĐ¸Ņ ĐŊа ŅŅ‚ĐžŅ€ĐžĐŊĐŊиĐĩ ĐŋŅ€ĐžĐ´ŅƒĐē҂ҋ" + }, + "START_PAGE": { + "GETTING_START": "", + "GETTING_START_TITLE": "ĐĐ°Ņ‡Đ°ĐģĐž Ņ€Đ°ĐąĐžŅ‚Ņ‹" + }, + "TOP_REPO": "ПоĐŋ҃ĐģŅŅ€ĐŊŅ‹Đĩ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "STATISTICS": { + "PRO_ITEM": "ĐŸŅ€ĐžĐĩĐē҂ҋ", + "REPO_ITEM": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "INDEX_PRIVATE": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Đĩ", + "INDEX_PUB": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đĩ", + "INDEX_TOTAL": "Đ’ŅĐĩĐŗĐž", + "STORAGE": "ĐĨРАНИЛИЩЕ", + "LIMIT": "ЛиĐŧĐ¸Ņ‚", + "STORAGE_USED": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" + }, + "SEARCH": { + "IN_PROGRESS": "ĐŸĐžĐ¸ŅĐē...", + "BACK": "Назад" + }, + "VULNERABILITY": { + "STATE": { + "OTHER_STATUS": "НĐĩ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "QUEUED": "В ĐžŅ‡ĐĩŅ€Đĩди", + "ERROR": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ ĐģĐžĐŗĐ°", + "SCANNING": "ĐĄĐēаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ŅŅ", + "STOPPED": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž" + }, + "GRID": { + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚ĐžĐ˛ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ!", + "COLUMN_ID": "ĐŖŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ŅŒ", + "COLUMN_SEVERITY": "ĐĄĐĩŅ€ŅŒĐĩСĐŊĐžŅŅ‚ŅŒ", + "COLUMN_PACKAGE": "ПаĐēĐĩŅ‚", + "COLUMN_PACKAGES": "ПаĐēĐĩ҂ҋ", + "COLUMN_VERSION": "ĐĸĐĩĐēŅƒŅ‰Đ°Ņ вĐĩŅ€ŅĐ¸Ņ", + "COLUMN_FIXED": "Đ˜ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐž в вĐĩŅ€ŅĐ¸Đ¸", + "COLUMN_DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "FOOT_ITEMS": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ", + "FOOT_OF": "иС", + "IN_ALLOW_LIST": "В ҁĐŋĐ¸ŅĐēĐĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅ CVE", + "CVSS3": "CVSS3" + }, + "CHART": { + "SCANNING_TIME": "Đ’Ņ€ĐĩĐŧŅ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ:", + "SCANNING_PERCENT": "ĐŸŅ€ĐžŅ†ĐĩĐŊŅ‚ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ:", + "SCANNING_PERCENT_EXPLAIN": "ĐŸŅ€ĐžŅ†ĐĩĐŊŅ‚ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Ņ€Đ°ŅŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēаĐē ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‚ŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐžĐąŅ€Đ°ĐˇĐžĐ˛ / ĐžĐąŅ‰ĐĩĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐžĐąŅ€Đ°ĐˇĐžĐ˛, ҃ĐēаСаĐŊĐŊҋ҅ в иĐŊĐ´ĐĩĐēҁĐĩ ĐžĐąŅ€Đ°ĐˇĐžĐ˛.", + "TOOLTIPS_TITLE": "ИС {{totalPackages}} {{package}} {{totalVulnerability}} иСвĐĩҁ҂ĐŊŅ‹ {{vulnerability}}.", + "TOOLTIPS_TITLE_SINGULAR": "ИС {{totalPackages}} {{package}} {{totalVulnerability}} иСвĐĩҁ҂ĐŊа {{vulnerability}}.", + "TOOLTIPS_TITLE_ZERO": "НĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐž ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš" + }, + "SEVERITY": { + "CRITICAL": "ĐšŅ€Đ¸Ņ‚Đ¸Ņ‡ĐĩҁĐēĐ°Ņ", + "HIGH": "Đ’Ņ‹ŅĐžĐēĐ°Ņ", + "MEDIUM": "ĐĄŅ€ĐĩĐ´ĐŊŅŅ", + "LOW": "НизĐēĐ°Ņ", + "NONE": "НĐĩŅ‚" + }, + "SINGULAR": "ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ŅŒ", + "OVERALL_SEVERITY": "ĐĄĐĩŅ€ŅŒĐĩСĐŊĐžŅŅ‚ŅŒ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸:", + "NO_VULNERABILITY": "НĐĩŅ‚ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš", + "PLURAL": "ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸", + "PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸", + "PACKAGE": "ĐŋаĐēĐĩŅ‚", + "PACKAGES": "ĐŋаĐēĐĩ҂ҋ", + "SCAN_NOW": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "SCAN_BY": "СКАНИРОВАНО {{scanner}}", + "REPORTED_BY": "ĐĄĐžĐžĐąŅ‰ĐĩĐŊĐž {{scanner}}", + "NO_SCANNER": "НЕĐĸ СКАНЕРА", + "TRIGGER_STOP_SUCCESS": "ĐĸŅ€Đ¸ĐŗĐŗĐĩŅ€ ĐžŅŅ‚Đ°ĐŊОвĐēи ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ҃ҁĐŋĐĩ҈ĐŊĐž", + "STOP_NOW": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ" + }, + "PUSH_IMAGE": { + "TITLE": "КоĐŧаĐŊда ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи", + "DOCKER": "Docker", + "HELM": "Helm", + "CNAB": "CNAB", + "TAG_COMMAND_CHART": "ĐŖĐŋаĐēĐžĐ˛Đ°Ņ‚ŅŒ Ņ‡Đ°Ņ€Ņ‚ Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°:", + "PUSH_COMMAND_CHART": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ‡Đ°Ņ€Ņ‚ в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚:", + "PUSH_COMMAND_CNAB": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ CNAB в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚:", + "TOOLTIP": "ĐĄŅŅ‹ĐģĐēи ĐŊа ĐēĐžĐŧаĐŊĐ´Ņ‹ Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Đ° в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚.", + "TAG_COMMAND": "ПоĐŧĐĩŅ‚Đ¸Ņ‚ŅŒ ĐžĐąŅ€Đ°Đˇ Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°:", + "PUSH_COMMAND": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ€Đ°Đˇ в ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚:", + "COPY_ERROR": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁҁҋĐģĐēи ĐŊа ĐēĐžĐŧаĐŊĐ´Ņ‹ Đ˛Ņ€ŅƒŅ‡ĐŊŅƒŅŽ." + }, + "ARTIFACT": { + "FILTER_FOR_ARTIFACTS": "ФиĐģŅŒŅ‚Ņ€ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "ADDITIONS": "ДоĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "ANNOTATION": "АĐŊĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸", + "OVERVIEW": "ĐžĐąĐˇĐžŅ€", + "IMAGE": "ИЗОБРАЖЕНИЕ", + "CHART": "ЧАРĐĸ", + "CNAB": "CNAB", + "WASM": "WASM", + "TAGGED": "ПоĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ", + "UNTAGGED": "НĐĩĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ", + "ALL": "Đ’ŅĐĩ", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛!", + "SCAN_UNSUPPORTED": "НĐĩĐŋОддĐĩŅ€ĐļиваĐĩĐŧŅ‹Đš" + }, + "TAG": { + "CREATION_TIME_PREFIX": "ХОСдаĐŊĐž", + "CREATOR_PREFIX": "ĐžŅ‚", + "ANONYMITY": "аĐŊĐžĐŊиĐŧĐŊĐžŅŅ‚ŅŒ", + "IMAGE_DETAILS": "ДĐĩŅ‚Đ°Đģи ĐžĐąŅ€Đ°ĐˇĐ°", + "DOCKER_VERSION": "ВĐĩŅ€ŅĐ¸Ņ Docker", + "ARCHITECTURE": "ĐŅ€Ņ…Đ¸Ņ‚ĐĩĐēŅ‚ŅƒŅ€Đ°", + "OS": "ОС", + "OS_VERSION": "ВĐĩŅ€ŅĐ¸Ņ ОС", + "HAVE": "иĐŧĐĩĐĩŅ‚", + "HAS": "иĐŧĐĩĐĩŅ‚", + "SCAN_COMPLETION_TIME": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ СавĐĩŅ€ŅˆĐĩĐŊĐž", + "IMAGE_VULNERABILITIES": "ĐŖŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸ ĐžĐąŅ€Đ°ĐˇĐ°", + "LEVEL_VULNERABILITIES": "ĐŖŅ€ĐžĐ˛ĐĩĐŊҌ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Ņ‚ĐĩĐŗĐžĐ˛!", + "COPY_ERROR": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛Ņ€ŅƒŅ‡ĐŊŅƒŅŽ.", + "FILTER_FOR_TAGS": "ФиĐģŅŒŅ‚Ņ€ Ņ‚ĐĩĐŗĐžĐ˛", + "AUTHOR": "ĐĐ˛Ņ‚ĐžŅ€", + "LABELS": "МĐĩŅ‚Đēи", + "CREATION": "ХОСдаĐŊĐž", + "COMMAND": "КоĐŧаĐŊĐ´Ņ‹", + "UPLOADTIME": "Đ’Ņ€ĐĩĐŧŅ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēи", + "NAME": "ИĐŧŅ", + "PULL_TIME": "Đ’Ņ€ĐĩĐŧŅ Đ˛Ņ‹Ņ‚ŅĐŗĐ¸Đ˛Đ°ĐŊĐ¸Ņ", + "PUSH_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи", + "OF": "иС", + "ITEMS": "ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛", + "ADD_TAG": "ДОБАВИĐĸĐŦ ĐĸЕГ", + "REMOVE_TAG": "ĐŖĐ”ĐĐ›Đ˜ĐĸĐŦ ĐĸЕГ", + "NAME_ALREADY_EXISTS": "ĐĸĐĩĐŗ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚ в Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸" + }, + "LABEL": { + "LABEL": "МĐĩŅ‚Đēа", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "CREATION_TIME": "Đ’Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ", + "NEW_LABEL": "ĐĐžĐ˛Đ°Ņ ĐŧĐĩŅ‚Đēа", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "LABEL_NAME": "ИĐŧŅ ĐŧĐĩŅ‚Đēи", + "COLOR": "ĐĻвĐĩŅ‚", + "FILTER_LABEL_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ ĐŧĐĩŅ‚ĐžĐē", + "NO_LABELS": "НĐĩŅ‚ ĐŧĐĩŅ‚ĐžĐē", + "DELETION_TITLE_TARGET": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ĐŧĐĩŅ‚Đēи", + "DELETION_SUMMARY_TARGET": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {{param}}?", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐŧĐĩŅ‚ĐžĐē!", + "NAME_ALREADY_EXISTS": "ИĐŧŅ ĐŧĐĩŅ‚Đēи ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚." + }, + "QUOTA": { + "PROJECT": "ĐŸŅ€ĐžĐĩĐēŅ‚", + "OWNER": "ВĐģадĐĩĐģĐĩ҆", + "COUNT": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž", + "STORAGE": "ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "OF": "иС", + "PROJECT_QUOTA_DEFAULT_ARTIFACT": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐŊа ĐŋŅ€ĐžĐĩĐēŅ‚", + "PROJECT_QUOTA_DEFAULT_DISK": "Đ”Đ¸ŅĐēОвОĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐŊа ĐŋŅ€ĐžĐĩĐēŅ‚", + "EDIT_PROJECT_QUOTAS": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐ˛ĐžŅ‚Ņ‹ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "EDIT_DEFAULT_PROJECT_QUOTAS": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐ˛ĐžŅ‚Ņ‹ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ Đ´ĐģŅ ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛", + "SET_QUOTAS": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐēĐ˛ĐžŅ‚Ņ‹ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° Đ´ĐģŅ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° '{{params}}'", + "SET_DEFAULT_QUOTAS": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐēĐ˛ĐžŅ‚Ņ‹ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐŋŅ€Đ¸ ŅĐžĐˇĐ´Đ°ĐŊии ĐŊĐžĐ˛Ņ‹Ņ… ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛", + "COUNT_QUOTA": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "COUNT_DEFAULT_QUOTA": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "STORAGE_QUOTA": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊиĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°", + "STORAGE_DEFAULT_QUOTA": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊиĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "SAVE_SUCCESS": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐēĐ˛ĐžŅ‚Ņ‹ ĐŋŅ€ĐžŅˆĐģĐž ҃ҁĐŋĐĩ҈ĐŊĐž", + "UNLIMITED": "ĐŊĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊĐž", + "INVALID_INPUT": "ĐŊĐĩвĐĩŅ€ĐŊŅ‹Đš ввОд", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐēĐ˛ĐžŅ‚ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "FILTER_PLACEHOLDER": "ĐŸĐžĐ¸ŅĐē ĐŋĐž иĐŧĐĩĐŊи (Ņ‚ĐžŅ‡ĐŊĐžĐĩ ŅĐžĐ˛ĐŋадĐĩĐŊиĐĩ)", + "QUOTA_USED": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐž ĐēĐ˛ĐžŅ‚Ņ‹" + }, + "WEEKLY": { + "MONDAY": "ПоĐŊĐĩĐ´ĐĩĐģҌĐŊиĐē", + "TUESDAY": "Đ’Ņ‚ĐžŅ€ĐŊиĐē", + "WEDNESDAY": "ĐĄŅ€Đĩда", + "THURSDAY": "ЧĐĩŅ‚Đ˛ĐĩŅ€Đŗ", + "FRIDAY": "ĐŸŅŅ‚ĐŊĐ¸Ņ†Đ°", + "SATURDAY": "ĐĄŅƒĐąĐąĐžŅ‚Đ°", + "SUNDAY": "Đ’ĐžŅĐēŅ€ĐĩҁĐĩĐŊҌĐĩ" + }, + "OPERATION": { + "LOCAL_EVENT": "ЛоĐēаĐģҌĐŊŅ‹Đĩ ŅĐžĐąŅ‹Ņ‚Đ¸Ņ", + "ALL": "Đ’ŅĐĩ", + "RUNNING": "Đ’Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ", + "FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ", + "STOP_EXECUTIONS": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "DELETE_PROJECT": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐĩĐēŅ‚", + "DELETE_REPO": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "DELETE_TAG": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐŗ", + "DELETE_USER": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "DELETE_ROBOT": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Đ°", + "DELETE_REGISTRY": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ€ĐĩĐĩҁ҂Ҁ", + "DELETE_REPLICATION": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ€ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸ŅŽ", + "DELETE_MEMBER": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēа", + "DELETE_GROUP": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃", + "DELETE_CHART_VERSION": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐĩŅ€ŅĐ¸ŅŽ Ņ‡Đ°Ņ€Ņ‚Đ°", + "DELETE_CHART": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ‡Đ°Ņ€Ņ‚", + "SWITCH_ROLE": "ĐĄĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Ņ€ĐžĐģҌ", + "ADD_GROUP": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃", + "ADD_USER": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "DELETE_LABEL": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŧĐĩŅ‚Đē҃", + "REPLICATION": "Đ ĐĩĐŋĐģиĐēĐ°Ņ†Đ¸Ņ", + "DAY_AGO": " Đ´ĐĩĐŊҌ(ĐĩĐš) ĐŊаСад", + "HOUR_AGO": " Ņ‡Đ°Ņ(Ов) ĐŊаСад", + "MINUTE_AGO": " ĐŧиĐŊŅƒŅ‚(Ņ‹) ĐŊаСад", + "SECOND_AGO": "ĐŧĐĩĐŊĐĩĐĩ 1 ĐŧиĐŊŅƒŅ‚Ņ‹", + "EVENT_LOG": "Đ–ĐŖĐ ĐĐĐ› СОБĐĢĐĸИЙ" + }, + "UNKNOWN_ERROR": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģи ĐŊĐĩиСвĐĩҁ҂ĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŋОСĐļĐĩ.", + "UNAUTHORIZED_ERROR": "Đ’Đ°ŅˆĐ° ҁĐĩŅŅĐ¸Ņ ĐŊĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊа иĐģи Đ¸ŅŅ‚ĐĩĐēĐģа. ВаĐŧ ĐŊ҃ĐļĐŊĐž Đ˛ĐžĐšŅ‚Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ.", + "REPO_READ_ONLY": "Harbor ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ в Ņ€ĐĩĐļиĐŧĐĩ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ, Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Đ°, Ņ‚ĐĩĐŗĐ° и ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēа ĐžĐąŅ€Đ°ĐˇĐ° ĐąŅƒĐ´ŅƒŅ‚ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ в Ņ€ĐĩĐļиĐŧĐĩ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ.", + "FORBIDDEN_ERROR": "ĐŖ Đ˛Đ°Ņ ĐŊĐĩŅ‚ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧҋ҅ ĐŋŅ€Đ°Đ˛ Đ´ĐģŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅŅ‚ĐžĐŗĐž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ.", + "GENERAL_ERROR": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģи ĐžŅˆĐ¸ĐąĐēи ĐŋŅ€Đ¸ Đ˛Ņ‹ĐˇĐžĐ˛Đĩ ҁĐĩŅ€Đ˛Đ¸ŅĐ°: {{param}}.", + "BAD_REQUEST_ERROR": "ĐœŅ‹ ĐŊĐĩ ĐŧĐžĐļĐĩĐŧ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ СаĐŋŅ€ĐžŅ иС-Са ĐŊĐĩвĐĩŅ€ĐŊĐžĐŗĐž СаĐŋŅ€ĐžŅĐ°.", + "NOT_FOUND_ERROR": "Đ’Đ°Ņˆ СаĐŋŅ€ĐžŅ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊ, Ņ‚Đ°Đē ĐēаĐē ĐžĐąŅŠĐĩĐēŅ‚ ĐŊĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", + "CONFLICT_ERROR": "ĐœŅ‹ ĐŊĐĩ ĐŧĐžĐļĐĩĐŧ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ СаĐŋŅ€ĐžŅ иС-Са ĐēĐžĐŊŅ„ĐģиĐēŅ‚Đ°.", + "PRECONDITION_FAILED": "ĐœŅ‹ ĐŊĐĩ ĐŧĐžĐļĐĩĐŧ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ СаĐŋŅ€ĐžŅ иС-Са ĐŊĐĩĐ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ҃ҁĐģĐžĐ˛Đ¸Ņ.", + "SERVER_ERROR": "ĐœŅ‹ ĐŊĐĩ ĐŧĐžĐļĐĩĐŧ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ СаĐŋŅ€ĐžŅ иС-Са вĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊĐ¸Ņ… ĐžŅˆĐ¸ĐąĐžĐē ҁĐĩŅ€Đ˛ĐĩŅ€Đ°.", + "INCONRRECT_OLD_PWD": "ĐĄŅ‚Đ°Ņ€Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩвĐĩŅ€ĐŊŅ‹Đš.", + "UNKNOWN": "ĐŊ/Đ´", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", + "START_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐŊĐ°Ņ‡Đ°Đģа", + "CREATION_TIME": "Đ’Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ", + "UPDATE_TIME": "Đ’Ņ€ĐĩĐŧŅ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ", + "LOGS": "Đ›ĐžĐŗĐ¸", + "PENDING": "ОĐļидаĐŊиĐĩ", + "FINISHED": "ЗавĐĩŅ€ŅˆĐĩĐŊĐž", + "STOPPED": "ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "RUNNING": "Đ’Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ", + "ERROR": "ĐžŅˆĐ¸ĐąĐēа", + "SCHEDULE": { + "NONE": "НĐĩŅ‚", + "DAILY": "ЕĐļĐĩĐ´ĐŊĐĩвĐŊĐž", + "WEEKLY": "ЕĐļĐĩĐŊĐĩĐ´ĐĩĐģҌĐŊĐž", + "HOURLY": "ЕĐļĐĩŅ‡Đ°ŅĐŊĐž", + "CUSTOM": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК", + "MANUAL": "Đ’Ņ€ŅƒŅ‡ĐŊŅƒŅŽ", + "SCHEDULE": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "CRON": "cron", + "ON": "в", + "AT": "в", + "NOSCHEDULE": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊии Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ" + }, + "GC": { + "CURRENT_SCHEDULE": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ Đ´ĐģŅ GC", + "GC_NOW": "GC СЕЙЧАС", + "JOB_HISTORY": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ GC", + "JOB_ID": "ID СадаĐŊĐ¸Ņ", + "TRIGGER_TYPE": "ĐĸиĐŋ Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€Đ°", + "LATEST_JOBS": "ĐŸĐžŅĐģĐĩĐ´ĐŊиĐĩ {{param}} СадаĐŊиК", + "MSG_SUCCESS": "ĐĄĐąĐžŅ€Đēа ĐŧŅƒŅĐžŅ€Đ° ĐŋŅ€ĐžŅˆĐģа ҃ҁĐŋĐĩ҈ĐŊĐž", + "MSG_SCHEDULE_SET": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ Đ´ĐģŅ ŅĐąĐžŅ€Đēи ĐŧŅƒŅĐžŅ€Đ° ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "MSG_SCHEDULE_RESET": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ Đ´ĐģŅ ŅĐąĐžŅ€Đēи ĐŧŅƒŅĐžŅ€Đ° ŅĐąŅ€ĐžŅˆĐĩĐŊĐž", + "PARAMETERS": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ", + "DELETE_UNTAGGED": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ŅĐąĐžŅ€Đē҃ ĐŧŅƒŅĐžŅ€Đ° Đ´ĐģŅ ĐŊĐĩĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊҋ҅ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "EXPLAIN": "GC — ŅŅ‚Đž Ņ€ĐĩŅŅƒŅ€ŅĐžĐĩĐŧĐēĐ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŧĐžĐļĐĩŅ‚ ĐŋОвĐģĐ¸ŅŅ‚ŅŒ ĐŊа ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ°", + "DRY_RUN_SUCCESS": "ĐĄŅƒŅ…ĐžĐš СаĐŋ҃ҁĐē ҃ҁĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊ" + }, + "RETAG": { + "MSG_SUCCESS": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "TIP_REPO": "ИĐŧŅ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ Ņ€Đ°ĐˇĐąĐ¸Đ˛Đ°ĐĩŅ‚ŅŅ ĐŊа ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊ҂ҋ ĐŋŅƒŅ‚Đ¸. КоĐŧĐŋĐžĐŊĐĩĐŊŅ‚ иĐŧĐĩĐŊи Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžŅŅ‚ĐžŅŅ‚ŅŒ ĐēаĐē ĐŧиĐŊиĐŧ҃Đŧ иС ОдĐŊĐžĐŗĐž ŅĐ¸ĐŧвОĐģа ĐŊиĐļĐŊĐĩĐŗĐž Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°, аĐģŅ„Đ°Đ˛Đ¸Ņ‚ĐŊĐž-Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Ņ‹Ņ… ŅĐ¸ĐŧвОĐģОв, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ Ņ‚ĐžŅ‡ĐēаĐŧи, Ņ‚Đ¸Ņ€Đĩ иĐģи ĐŋĐžĐ´Ņ‡ĐĩŅ€ĐēиваĐŊĐ¸ŅĐŧи. БоĐģĐĩĐĩ ŅŅ‚Ņ€ĐžĐŗĐž, ĐžĐŊ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐžĐŧ҃ Đ˛Ņ‹Ņ€Đ°ĐļĐĩĐŊĐ¸ŅŽ [a-z0-9]+(?:[._-][a-z0-9]+)*. Đ•ŅĐģи иĐŧŅ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ иĐŧĐĩĐĩŅ‚ два иĐģи йОĐģĐĩĐĩ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚ĐžĐ˛ ĐŋŅƒŅ‚Đ¸, ĐžĐŊи Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊŅ‹ ĐēĐžŅĐžĐš ҇ĐĩŅ€Ņ‚ĐžĐš ('/'). ĐžĐąŅ‰Đ°Ņ Đ´ĐģиĐŊа иĐŧĐĩĐŊи Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ, вĐēĐģŅŽŅ‡Đ°Ņ ĐēĐžŅŅ‹Đĩ ҇ĐĩҀ҂ҋ, Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ ĐŧĐĩĐŊĐĩĐĩ 256 ŅĐ¸ĐŧвОĐģОв.", + "TIP_TAG": "ĐĸĐĩĐŗ — ŅŅ‚Đž ĐŧĐĩŅ‚Đēа, ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩĐŧĐ°Ņ Đē ĐžĐąŅ€Đ°ĐˇŅƒ Docker в Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸. ĐĸĐĩĐŗĐ¸ — ŅŅ‚Đž ҁĐŋĐžŅĐžĐą Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ°Ņ‚ŅŒ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ĐžĐąŅ€Đ°ĐˇŅ‹ в Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸. ОĐŊ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊĐžĐŧ҃ Đ˛Ņ‹Ņ€Đ°ĐļĐĩĐŊĐ¸ŅŽ: (`[\\w][\\w.-]{0,127}`)" + }, + "CVE_ALLOWLIST": { + "DEPLOYMENT_SECURITY": "БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐŊĐ¸Ņ", + "CVE_ALLOWLIST": "ĐĄĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅ CVE", + "SYS_ALLOWLIST_EXPLAIN": "ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅ ĐŋОСвОĐģŅĐĩŅ‚ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸ в ŅŅ‚ĐžĐŧ ҁĐŋĐ¸ŅĐēĐĩ ĐŋŅ€Đ¸ Ņ€Đ°ŅŅ‡ĐĩŅ‚Đĩ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸ ĐžĐąŅ€Đ°ĐˇĐ°.", + "ADD_SYS": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ CVE ID в ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅", + "WARNING_SYS": "ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅ CVE Đ¸ŅŅ‚ĐĩĐē. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē, ĐŋŅ€ĐžĐ´Đģив ŅŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ.", + "WARNING_PRO": "ĐŸŅ€ĐžĐĩĐēŅ‚ĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅ CVE Đ¸ŅŅ‚ĐĩĐē. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē, ĐŋŅ€ĐžĐ´Đģив ŅŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ.", + "ADD": "ДОБАВИĐĸĐŦ", + "ENTER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ CVE ID(s)", + "HELP": "РаСдĐĩĐģĐ¸Ņ‚ĐĩĐģҌ: СаĐŋŅŅ‚Ņ‹Đĩ иĐģи ŅĐ¸ĐŧвОĐģŅ‹ ĐŊОвОК ŅŅ‚Ņ€ĐžĐēи", + "NONE": "НĐĩŅ‚", + "EXPIRES_AT": "Đ˜ŅŅ‚ĐĩĐēаĐĩŅ‚", + "NEVER_EXPIRES": "НиĐēĐžĐŗĐ´Đ° ĐŊĐĩ Đ¸ŅŅ‚ĐĩĐēаĐĩŅ‚", + "PRO_ALLOWLIST_EXPLAIN": "ĐŸŅ€ĐžĐĩĐēŅ‚ĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅ ĐŋОСвОĐģŅĐĩŅ‚ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸ в ŅŅ‚ĐžĐŧ ҁĐŋĐ¸ŅĐēĐĩ в ŅŅ‚ĐžĐŧ ĐŋŅ€ĐžĐĩĐēŅ‚Đĩ ĐŋŅ€Đ¸ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēĐĩ и Đ˛Ņ‹Ņ‚ŅĐŗĐ¸Đ˛Đ°ĐŊии ĐžĐąŅ€Đ°ĐˇĐžĐ˛.", + "PRO_OR_SYS": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ, ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đš ĐŊа ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐžĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩ, иĐģи ĐŊаĐļĐ°Ņ‚ŅŒ ĐŊа 'ĐŸŅ€ĐžĐĩĐēŅ‚ĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅', Ņ‡Ņ‚ĐžĐąŅ‹ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ҁĐŋĐ¸ŅĐžĐē", + "MERGE_INTO": "Đ”ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ ĐžŅ‚Đ´ĐĩĐģҌĐŊŅ‹Đĩ CVE ID ĐŋĐĩŅ€ĐĩĐ´ ĐŊаĐļĐ°Ņ‚Đ¸ĐĩĐŧ 'КОПИРОВАĐĸĐŦ ИЗ ХИХĐĸЕМĐĢ', Ņ‡Ņ‚ĐžĐąŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅.", + "SYS_ALLOWLIST": "ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅", + "PRO_ALLOWLIST": "ĐŸŅ€ĐžĐĩĐēŅ‚ĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊҋ҅", + "ADD_SYSTEM": "КОПИРОВАĐĸĐŦ ИЗ ХИХĐĸЕМĐĢ" + }, + "TAG_RETENTION": { + "TAG_RETENTION": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ Ņ‚ĐĩĐŗĐžĐ˛", + "RETENTION_RULES": "ĐŸŅ€Đ°Đ˛Đ¸Đģа ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ", + "RULE_NAME_1": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ {{number}} Đ´ĐŊĐĩĐš", + "RULE_NAME_2": " ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ {{number}} Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "RULE_NAME_3": " ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ‹Đĩ {{number}} Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛" + }, + "RETENTION": { + "RULE_NAME_4": " {{number}} ĐŋĐžŅĐģĐĩĐ´ĐŊĐ¸Ņ… Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "RULE_NAME_5": " Đ˛ŅĐĩĐŗĐ´Đ°", + "ADD_RULE": "ДОБАВИĐĸĐŦ ПРАВИЛО", + "ADD_RULE_HELP_1": "НаĐļĐŧĐ¸Ņ‚Đĩ ĐēĐŊĐžĐŋĐē҃ ДОБАВИĐĸĐŦ ПРАВИЛО, Ņ‡Ņ‚ĐžĐąŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž.", + "ADD_RULE_HELP_2": "ПоĐģĐ¸Ņ‚Đ¸Đēи Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚ĐĩĐŗĐžĐ˛ СаĐŋ҃ҁĐēĐ°ŅŽŅ‚ŅŅ ОдиĐŊ Ņ€Đ°Đˇ в Đ´ĐĩĐŊҌ.", + "RETENTION_RUNS": "ЗаĐŋ҃ҁĐēи Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ", + "RUN_NOW": "Đ—ĐĐŸĐŖĐĄĐĸИĐĸĐŦ СЕЙЧАС", + "WHAT_IF_RUN": "ПРОБНĐĢЙ Đ—ĐĐŸĐŖĐĄĐš", + "ABORT": "ОĐĸМЕНА", + "SERIAL": "ID", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", + "DRY_RUN": "ĐŸŅ€ĐžĐąĐŊŅ‹Đš СаĐŋ҃ҁĐē", + "START_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐŊĐ°Ņ‡Đ°Đģа", + "DURATION": "ДĐģĐ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ", + "DETAILS": "ДĐĩŅ‚Đ°Đģи", + "REPOSITORY": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DISABLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "ENABLE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "ADD_TITLE": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚ĐĩĐŗĐžĐ˛", + "ADD_SUBTITLE": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚ĐĩĐŗĐžĐ˛ Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°. Đ’ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚ĐĩĐŗĐžĐ˛ Ņ€Đ°ŅŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž, и ĐēаĐļĐ´ĐžĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅŅ‚ŅŒŅŅ Đē Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊĐžĐŧ҃ ҁĐŋĐ¸ŅĐē҃ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв.", + "BY_WHAT": "По ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Ņƒ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ иĐģи ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Ņƒ Đ´ĐŊĐĩĐš", + "RULE_TEMPLATE_1": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ # Đ´ĐŊĐĩĐš", + "RULE_TEMPLATE_2": " ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ # Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "RULE_TEMPLATE_3": " ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊŅ‹Đĩ # Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "RULE_TEMPLATE_4": " ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ ҁĐēĐ°Ņ‡Đ°ĐŊĐŊŅ‹Đĩ # Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛", + "RULE_TEMPLATE_5": " Đ˛ŅĐĩĐŗĐ´Đ°", + "ACTION_RETAIN": " Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ", + "UNIT_DAY": "ДНЕЙ", + "UNIT_COUNT": "КОЛИЧЕСĐĸВО", + "NUMBER": "ЧИСЛО", + "IN_REPOSITORIES": "ДĐģŅ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв", + "REP_SEPARATOR": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ, repo*, иĐģи **", + "TAGS": "ĐĸĐĩĐŗĐ¸", + "UNTAGGED": " ĐąĐĩС Ņ‚ĐĩĐŗĐ°", + "INCLUDE_UNTAGGED": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ ĐąĐĩС Ņ‚ĐĩĐŗĐ°", + "MATCHES_TAGS": "ĐĄĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ Ņ‚ĐĩĐŗĐ°Đŧ", + "MATCHES_EXCEPT_TAGS": "ĐĄĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚, ĐēŅ€ĐžĐŧĐĩ Ņ‚ĐĩĐŗĐžĐ˛", + "TAG_SEPARATOR": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ‚ĐĩĐŗĐžĐ˛ ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ, tag*, иĐģи **. ĐŸŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸ вĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ Đ˛ŅĐĩ Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ ĐąĐĩС Ņ‚ĐĩĐŗĐ° ĐŋŅ€Đ¸ ĐŋŅ€Đ¸ĐŧĐĩĐŊĐĩĐŊии ҁĐĩĐģĐĩĐēŅ‚ĐžŅ€Đ° 'вĐēĐģŅŽŅ‡Đ°Ņ' иĐģи 'Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ', ŅƒŅŅ‚Đ°ĐŊОвив Ņ„ĐģаĐļĐžĐē Đ˛Ņ‹ŅˆĐĩ.", + "LABELS": "МĐĩŅ‚Đēи", + "MATCHES_LABELS": "ĐĄĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŧĐĩŅ‚ĐēаĐŧ", + "MATCHES_EXCEPT_LABELS": "ĐĄĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚, ĐēŅ€ĐžĐŧĐĩ ĐŧĐĩŅ‚ĐžĐē", + "REP_LABELS": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŧĐĩŅ‚ĐžĐē ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ", + "RETENTION_RUN": "ЗаĐŋ҃ҁĐē Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ", + "RETENTION_RUN_EXPLAIN": "Đ’Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐŧĐžĐļĐĩŅ‚ иĐŧĐĩŅ‚ŅŒ ĐŊĐĩĐŗĐ°Ņ‚Đ¸Đ˛ĐŊŅ‹Đĩ ĐŋĐžŅĐģĐĩĐ´ŅŅ‚Đ˛Đ¸Ņ Đ´ĐģŅ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ в ŅŅ‚ĐžĐŧ ĐŋŅ€ĐžĐĩĐēŅ‚Đĩ, и ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đĩ Ņ‚ĐĩĐŗĐ¸ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ ĐąŅƒĐ´ŅƒŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹. НаĐļĐŧĐ¸Ņ‚Đĩ ОĐĸМЕНА и Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ПРОБНĐĢЙ Đ—ĐĐŸĐŖĐĄĐš Đ´ĐģŅ ŅĐ¸Đŧ҃ĐģŅŅ†Đ¸Đ¸ ŅŅ„Ņ„ĐĩĐēŅ‚Đ° ŅŅ‚ĐžĐš ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи. В ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŊаĐļĐŧĐ¸Ņ‚Đĩ Đ—ĐĐŸĐŖĐĄĐĸИĐĸĐŦ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ.", + "RETENTION_RUN_ABORTED": "ЗаĐŋ҃ҁĐē Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊ", + "RETENTION_RUN_ABORTED_EXPLAIN": "Đ­Ņ‚ĐžŅ‚ СаĐŋ҃ҁĐē Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐąŅ‹Đģ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊ. ĐŖĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ ĐŊĐĩĐžĐąŅ€Đ°Ņ‚Đ¸ĐŧŅ‹. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иĐŊĐ¸Ņ†Đ¸Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš СаĐŋ҃ҁĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛. ДĐģŅ ŅĐ¸Đŧ҃ĐģŅŅ†Đ¸Đ¸ СаĐŋ҃ҁĐēа Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ “ПРОБНĐĢЙ Đ—ĐĐŸĐŖĐĄĐšâ€.", + "LOADING": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа...", + "NO_EXECUTION": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиК!", + "NO_HISTORY": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēОК Đ¸ŅŅ‚ĐžŅ€Đ¸Đ¸!", + "DELETION": "ĐŖĐ´Đ°ĐģĐĩĐŊĐ¸Ņ", + "EDIT_TITLE": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚ĐĩĐŗĐžĐ˛", + "LOG": "Đ›ĐžĐŗ", + "EXCLUDES": "Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚", + "MATCHES": "ĐĄĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚", + "REPO": " Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "EXC": " Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ ", + "MAT": " ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ", + "AND": " и", + "WITH": " ҁ ", + "WITHOUT": " ĐąĐĩС ", + "LOWER_LABELS": " ĐŧĐĩŅ‚Đēи", + "WITH_CONDITION": " ҁ", + "LOWER_TAGS": " Ņ‚ĐĩĐŗĐ¸", + "TRIGGER": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "RETAINED": "ĐĨŅ€Đ°ĐŊĐ¸Ņ‚ŅŅ", + "TOTAL": "Đ’ŅĐĩĐŗĐž", + "NONE": " ĐŊĐĩŅ‚", + "RULE_NAME_6": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ, ҁĐēĐ°Ņ‡Đ°ĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ {{number}} Đ´ĐŊĐĩĐš", + "RULE_NAME_7": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ, ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ {{number}} Đ´ĐŊĐĩĐš", + "RULE_TEMPLATE_6": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ, ҁĐēĐ°Ņ‡Đ°ĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ # Đ´ĐŊĐĩĐš", + "RULE_TEMPLATE_7": " Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ, ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ # Đ´ĐŊĐĩĐš", + "SCHEDULE": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "SCHEDULE_WARNING": "Đ’Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ Đē ĐŊĐĩĐžĐąŅ€Đ°Ņ‚Đ¸ĐŧĐžĐŧ҃ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸ŅŽ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ иС ĐŋŅ€ĐžĐĩĐēŅ‚Đ° Harbor. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, дваĐļĐ´Ņ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ Đ˛ŅĐĩ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи ĐŋĐĩŅ€ĐĩĐ´ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ.", + "EXISTING_RULE": "ĐĄŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "ILLEGAL_RULE": "НĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧĐžĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "INVALID_RULE": "НĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "COUNT_LARGE": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ \"КОЛИЧЕСĐĸВО\" ҁĐģĐ¸ŅˆĐēĐžĐŧ вĐĩĐģиĐē", + "DAYS_LARGE": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ \"ДНЕЙ\" ҁĐģĐ¸ŅˆĐēĐžĐŧ вĐĩĐģиĐē", + "EXECUTION_TYPE": "ĐĸиĐŋ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "ACTION": "ДЕЙСĐĸВИЕ", + "YES": "Да", + "NO": "НĐĩŅ‚" + }, + "IMMUTABLE_TAG": { + "IMMUTABLE_RULES": "ĐŸŅ€Đ°Đ˛Đ¸Đģа ĐŊĐĩиСĐŧĐĩĐŊŅĐĩĐŧĐžŅŅ‚Đ¸", + "ADD_RULE": "ДОБАВИĐĸĐŦ ПРАВИЛО", + "ADD_RULE_HELP_1": "НаĐļĐŧĐ¸Ņ‚Đĩ ĐēĐŊĐžĐŋĐē҃ ДОБАВИĐĸĐŦ ПРАВИЛО, Ņ‡Ņ‚ĐžĐąŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž.", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DISABLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "ENABLE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "ADD_TITLE": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐŊĐĩиСĐŧĐĩĐŊŅĐĩĐŧĐžŅŅ‚Đ¸ Ņ‚ĐĩĐŗĐžĐ˛", + "ADD_SUBTITLE": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐŊĐĩиСĐŧĐĩĐŊŅĐĩĐŧĐžŅŅ‚Đ¸ Ņ‚ĐĩĐŗĐžĐ˛ Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°. ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŊĐĩиСĐŧĐĩĐŊŅĐĩĐŧĐžŅŅ‚Đ¸ Ņ‚ĐĩĐŗĐžĐ˛ ҁĐŊĐ°Ņ‡Đ°Đģа Ņ€Đ°ŅŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž, а ĐˇĐ°Ņ‚ĐĩĐŧ ĐžĐąŅŠĐĩдиĐŊŅŅŽŅ‚ŅŅ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° ĐŊĐĩиСĐŧĐĩĐŊŅĐĩĐŧҋ҅ Ņ‚ĐĩĐŗĐžĐ˛.", + "IN_REPOSITORIES": "ДĐģŅ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв", + "REP_SEPARATOR": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đĩв ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ, repo*, иĐģи **", + "TAGS": "ĐĸĐĩĐŗĐ¸", + "TAG_SEPARATOR": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ‚ĐĩĐŗĐžĐ˛ ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ, tag*, иĐģи **.", + "EDIT_TITLE": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐŊĐĩиСĐŧĐĩĐŊŅĐĩĐŧĐžŅŅ‚Đ¸ Ņ‚ĐĩĐŗĐžĐ˛", + "EXC": " Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ ", + "MAT": " ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ", + "AND": " и", + "WITH": " ҁ ", + "WITHOUT": " ĐąĐĩС ", + "LOWER_LABELS": " ĐŧĐĩŅ‚Đēи", + "LOWER_TAGS": " Ņ‚ĐĩĐŗĐ¸", + "NONE": " ĐŊĐĩŅ‚", + "EXISTING_RULE": "ĐĄŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž", + "ACTION": "ДЕЙСĐĸВИЕ" + }, + "SCANNER": { + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ҁĐēаĐŊĐĩŅ€ {{param}}?", + "SKIP_CERT_VERIFY": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅŅ‚ĐžŅ‚ Ņ„ĐģаĐļĐžĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°, ĐēĐžĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš Ņ€ĐĩĐĩҁ҂Ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš иĐģи ĐŊĐĩĐŊадĐĩĐļĐŊŅ‹Đš ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚.", + "NAME": "ИĐŧŅ", + "NAME_EXISTS": "ИĐŧŅ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚", + "NAME_REQUIRED": "ИĐŧŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "NAME_REX": "ИĐŧŅ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ 2 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ._- и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа", + "ENDPOINT_EXISTS": "EndpointUrl ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚", + "ENDPOINT_REQUIRED": "EndpointUrl ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "ILLEGAL_ENDPOINT": "EndpointUrl ĐŊĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸Đŧ", + "AUTH": "ĐĐ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ", + "NONE": "НĐĩŅ‚", + "BASIC": "Đ‘Đ°ĐˇĐžĐ˛Đ°Ņ", + "BEARER": "Bearer", + "API_KEY": "APIKey", + "USERNAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "USERNAME_REQUIRED": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "PASSWORD": "ĐŸĐ°Ņ€ĐžĐģҌ", + "PASSWORD_REQUIRED": "ĐŸĐ°Ņ€ĐžĐģҌ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "TOKEN": "ĐĸĐžĐēĐĩĐŊ", + "TOKEN_REQUIRED": "ĐĸĐžĐēĐĩĐŊ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "API_KEY_REQUIRED": "APIKey ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "SKIP": "ĐŸŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°", + "ADD_SCANNER": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ҁĐēаĐŊĐĩŅ€", + "EDIT_SCANNER": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁĐēаĐŊĐĩŅ€", + "TEST_CONNECTION": "ПРОВЕРИĐĸĐŦ СОЕДИНЕНИЕ", + "ADD_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž дОйавĐģĐĩĐŊĐž ", + "TEST_PASS": "ĐĸĐĩҁ҂ ĐŋŅ€ĐžĐšĐ´ĐĩĐŊ", + "TEST_FAILED": "Ping: Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ {{name}}:{{url}} ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊа", + "UPDATE_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊĐž", + "SCANNER_COLON": "ĐĄĐēаĐŊĐĩŅ€:", + "NAME_COLON": "ИĐŧŅ:", + "VENDOR_COLON": "ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē:", + "VERSION_COLON": "ВĐĩŅ€ŅĐ¸Ņ:", + "CAPABILITIES": "ВозĐŧĐžĐļĐŊĐžŅŅ‚Đ¸", + "CONSUMES_MIME_TYPES_COLON": "ĐĸиĐŋŅ‹ MIME Đ´ĐģŅ ĐŋĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊĐ¸Ņ:", + "PRODUCTS_MIME_TYPES_COLON": "ĐĸиĐŋŅ‹ MIME Đ´ĐģŅ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´ŅŅ‚Đ˛Đ°:", + "PROPERTIES": "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đ°", + "NEW_SCANNER": "НОВĐĢЙ СКАНЕР", + "SET_AS_DEFAULT": "ĐŖĐĄĐĸАНОВИĐĸĐŦ ПО ĐŖĐœĐžĐ›Đ§ĐĐĐ˜ĐŽ", + "HEALTH": "Đ—Đ´ĐžŅ€ĐžĐ˛ŅŒĐĩ", + "DISABLED": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "NO_SCANNER": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŊĐ°ĐšŅ‚Đ¸ ĐŊи ОдĐŊĐžĐŗĐž ҁĐēаĐŊĐĩŅ€Đ°", + "DEFAULT": "По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "HEALTHY": "Đ—Đ´ĐžŅ€ĐžĐ˛", + "UNHEALTHY": "НĐĩĐˇĐ´ĐžŅ€ĐžĐ˛", + "SCANNERS": "ĐĄĐēаĐŊĐĩҀҋ", + "SCANNER": "ĐĄĐēаĐŊĐĩŅ€", + "EDIT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "NOT_AVAILABLE": "НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐž", + "ADAPTER": "АдаĐŋŅ‚ĐĩŅ€", + "VENDOR": "ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē", + "VERSION": "ВĐĩŅ€ŅĐ¸Ņ", + "SELECT_SCANNER": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ҁĐēаĐŊĐĩŅ€", + "ENABLED": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "ENABLE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DISABLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐž", + "TOTAL": "Đ’ŅĐĩĐŗĐž", + "FIXABLE": "Đ˜ŅĐŋŅ€Đ°Đ˛Đ¸ĐŧĐž", + "DURATION": "ДĐģĐ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ:", + "OPTIONS": "ОĐŋŅ†Đ¸Đ¸", + "USE_INNER": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ вĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊиК Đ°Đ´Ņ€Đĩҁ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ°", + "USE_INNER_TIP": "Đ•ŅĐģи ŅŅ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ, ҁĐēаĐŊĐĩŅ€ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ вĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊиК Đ°Đ´Ņ€Đĩҁ Ņ€ĐĩĐĩŅŅ‚Ņ€Đ° Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đŧ ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚Đ°Đŧ.", + "VULNERABILITY_SEVERITY": "ĐĄĐĩŅ€ŅŒĐĩСĐŊĐžŅŅ‚ŅŒ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸:", + "CONFIRM_DELETION": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ ҁĐēаĐŊĐĩŅ€Đ°", + "NO_PROJECT_SCANNER": "НĐĩŅ‚ ҁĐēаĐŊĐĩŅ€Đ°", + "SET_UNHEALTHY_SCANNER": "Đ’Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đš ҁĐēаĐŊĐĩŅ€:{{name}} ĐŊĐĩĐˇĐ´ĐžŅ€ĐžĐ˛", + "SCANNED_BY": "ĐŸŅ€ĐžŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž:", + "IMAGE_SCANNERS": "ĐĄĐēаĐŊĐĩҀҋ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиК", + "VIEW_DOC": "ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŽ", + "ALL_SCANNERS": "Đ’ŅĐĩ ҁĐēаĐŊĐĩҀҋ", + "HELP_INFO_1": "ĐĄĐēаĐŊĐĩŅ€ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ. Đ§Ņ‚ĐžĐąŅ‹ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ҁĐēаĐŊĐĩҀҋ, ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē ", + "HELP_INFO_2": "Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸.", + "NO_DEFAULT_SCANNER": "НĐĩŅ‚ ҁĐēаĐŊĐĩŅ€Đ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ" + }, + "DISTRIBUTION": { + "FILTER_INSTANCE_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Ņ‹", + "FILTER_HISTORIES_PLACEHOLDER": "ФиĐģŅŒŅ‚Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ¸ŅŅ‚ĐžŅ€Đ¸Đ¸", + "ADD_ACTION": "НОВĐĢЙ Đ­ĐšĐ—Đ•ĐœĐŸĐ›Đ¯Đ ", + "PREHEAT_ACTION": "ĐŸŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐŊĐ°ĐŗŅ€Đĩв", + "EDIT_ACTION": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "ENABLE_ACTION": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DISABLE_ACTION": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "DELETE_ACTION": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "NOT_FOUND": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊи ОдĐŊĐžĐŗĐž ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°!", + "NAME": "ИĐŧŅ", + "ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа", + "STATUS": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", + "ENABLED": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "SETUP_TIMESTAMP": "Đ’Ņ€ĐĩĐŧŅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи", + "PROVIDER": "ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē", + "DELETION_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°", + "DELETION_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹) {{param}}?", + "ENABLE_TITLE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹)", + "ENABLE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹) {{param}}?", + "DISABLE_TITLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹)", + "DISABLE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹) {{param}}?", + "IMAGE": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", + "START_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐŊĐ°Ņ‡Đ°Đģа", + "FINISH_TIME": "Đ’Ņ€ĐĩĐŧŅ ĐžĐēĐžĐŊŅ‡Đ°ĐŊĐ¸Ņ", + "INSTANCE": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€", + "HISTORIES": "Đ˜ŅŅ‚ĐžŅ€Đ¸Đ¸", + "CREATE_SUCCESS": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊ", + "CREATE_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ŅĐžĐˇĐ´Đ°ĐŊии ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°", + "DELETED_SUCCESS": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹) ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊ(Ņ‹)", + "DELETED_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ŅƒĐ´Đ°ĐģĐĩĐŊии ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°(Ов)", + "ENABLE_SUCCESS": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹) ҃ҁĐŋĐĩ҈ĐŊĐž аĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ(Ņ‹)", + "ENABLE_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ аĐēŅ‚Đ¸Đ˛Đ°Ņ†Đ¸Đ¸ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°(Ов)", + "DISABLE_SUCCESS": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€(Ņ‹) ҃ҁĐŋĐĩ҈ĐŊĐž Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ(Ņ‹)", + "DISABLE_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ°Ņ†Đ¸Đ¸ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°(Ов)", + "UPDATE_SUCCESS": "Đ­ĐēСĐĩĐŧĐŋĐģŅŅ€ ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊ", + "UPDATE_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°", + "REQUEST_PREHEAT_SUCCESS": "ЗаĐŋŅ€ĐžŅ ĐŊа ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐŊĐ°ĐŗŅ€Đĩв ҃ҁĐŋĐĩ҈ĐŊĐž Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊ", + "REQUEST_PREHEAT_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ СаĐŋŅ€ĐžŅĐĩ ĐŊа ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐŊĐ°ĐŗŅ€Đĩв", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "AUTH_MODE": "Đ ĐĩĐļиĐŧ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸", + "USERNAME": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "PASSWORD": "ĐŸĐ°Ņ€ĐžĐģҌ", + "TOKEN": "ĐĸĐžĐēĐĩĐŊ", + "SETUP_NEW_INSTANCE": "ĐĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ŅĐēСĐĩĐŧĐŋĐģŅŅ€", + "EDIT_INSTANCE": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€", + "SETUP": { + "NAME_PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ иĐŧŅ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°", + "DESCRIPTION_PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°", + "ENDPOINT_PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ ŅĐēСĐĩĐŧĐŋĐģŅŅ€Đ°", + "USERNAME_PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "PASSWORD_PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ", + "TOKEN_PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Ņ‚ĐžĐēĐĩĐŊ" + }, + "MAINTAINER": "ĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš(Đĩ)", + "SOURCE": "Đ˜ŅŅ‚ĐžŅ‡ĐŊиĐē", + "VERSION": "ВĐĩŅ€ŅĐ¸Ņ", + "SET_AS_DEFAULT": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "DELETE_INSTANCE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€", + "ENABLE_INSTANCE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€", + "DISABLE_INSTANCE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€", + "SET_DEFAULT_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "SET_DEFAULT_FAILED": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ŅƒŅŅ‚Đ°ĐŊОвĐēĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "UPDATE_INSTANCE": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€", + "CREATE_INSTANCE": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ŅĐēСĐĩĐŧĐŋĐģŅŅ€" + }, + "P2P_PROVIDER": { + "P2P_PROVIDER": "P2P ĐŸŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐŊĐ°ĐŗŅ€Đĩв", + "POLICIES": "ПоĐģĐ¸Ņ‚Đ¸Đēи", + "NEW_POLICY": "ĐĐžĐ’ĐĐ¯ ПОЛИĐĸИКА", + "NAME": "ИĐŧŅ", + "ENABLED": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", + "PROVIDER": "ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē", + "FILTERS": "ФиĐģŅŒŅ‚Ņ€Ņ‹", + "TRIGGER": "ĐĸŅ€Đ¸ĐŗĐŗĐĩŅ€", + "CREATED": "Đ’Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ", + "DESCRIPTION": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "NO_POLICY": "НĐĩŅ‚ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи", + "ENABLED_POLICY_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ {{name}}?", + "DISABLED_POLICY_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ {{name}}?", + "ENABLED_POLICY_TITLE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ПоĐģĐ¸Ņ‚Đ¸Đē҃", + "DISABLED_POLICY_TITLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ПоĐģĐ¸Ņ‚Đ¸Đē҃", + "DELETE_POLICY_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ {{names}}?", + "EDIT_POLICY": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ P2P ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đēа", + "ADD_POLICY": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ P2P ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đēа", + "NAME_REQUIRED": "ИĐŧŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "PROVIDER_REQUIRED": "ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "ADDED_SUCCESS": "ПоĐģĐ¸Ņ‚Đ¸Đēа ҃ҁĐŋĐĩ҈ĐŊĐž дОйавĐģĐĩĐŊа", + "UPDATED_SUCCESS": "ПоĐģĐ¸Ņ‚Đ¸Đēа ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊа", + "EXECUTE": "ВĐĢПОЛНИĐĸĐŦ", + "EXECUTE_SUCCESSFULLY": "ĐŖŅĐŋĐĩ҈ĐŊĐž Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐž", + "EXECUTE_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи", + "EXECUTE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē҃ {{param}}?", + "STOP_TITLE": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "STOP_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи {{param}}?", + "STOP_SUCCESSFULLY": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "STATUS_MSG": "ĐĄĐžĐžĐąŅ‰ĐĩĐŊиĐĩ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ", + "JOB_PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиК", + "PROVIDER_TYPE": "ĐŸĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē", + "ID": "ID Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "NO_PROVIDER": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ҁĐŊĐ°Ņ‡Đ°Đģа Đ´ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ ĐŋĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đēа", + "ARTIFACT": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚", + "DIGEST": "ДайдĐļĐĩҁ҂", + "TYPE": "ĐĸиĐŋ", + "TASKS": "Đ—Đ°Đ´Đ°Ņ‡Đ¸", + "TASKS_PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐˇĐ°Đ´Đ°Ņ‡", + "SEVERITY_WARNING": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚ĐĩĐš СдĐĩҁҌ ĐēĐžĐŊŅ„ĐģиĐēŅ‚ŅƒŅŽŅ‚ ҁ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐš ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐĩĐš ĐŋŅ€ĐžĐĩĐēŅ‚Đ°, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи СдĐĩҁҌ", + "REPOS": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đ¸", + "TAGS": "ĐĸĐĩĐŗĐ¸", + "CRITERIA": "ĐšŅ€Đ¸Ņ‚ĐĩŅ€Đ¸Đ¸", + "ONLY_SIGNED": "ĐĸĐžĐģҌĐēĐž ĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅ€Đ°ĐˇŅ‹", + "PREHEAT_ON_PUSH": "ĐŸŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐŊĐ°ĐŗŅ€Đĩв ĐŋŅ€Đ¸ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēĐĩ", + "START_TEXT": "НĐĩŅ‚ ŅƒŅĐˇĐ˛Đ¸ĐŧĐžŅŅ‚Đ¸ ҁĐĩŅ€ŅŒĐĩСĐŊĐžŅŅ‚Đ¸", + "EDN_TEXT": "и Đ˛Ņ‹ŅˆĐĩ", + "LABELS": "МĐĩŅ‚Đēи", + "SCHEDULE": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ", + "TEST_FAILED": "ĐĸĐĩҁ҂ ĐŊĐĩ ĐŋŅ€ĐžĐšĐ´ĐĩĐŊ", + "MANUAL": "Đ ŅƒŅ‡ĐŊОК", + "SCHEDULED": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš", + "EVENT_BASED": "ĐĄĐžĐąŅ‹Ņ‚Đ¸ĐšĐŊĐž-ĐžŅ€Đ¸ĐĩĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš", + "EVENT_BASED_EXPLAIN_LINE1": "ПоĐģĐ¸Ņ‚Đ¸Đēа ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐ¸Đ˛Đ°Ņ‚ŅŒŅŅ Đ˛ŅŅĐēиК Ņ€Đ°Đˇ, ĐēĐžĐŗĐ´Đ° ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´ŅŅ‚ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ŅĐžĐąŅ‹Ņ‚Đ¸Ņ:", + "EVENT_BASED_EXPLAIN_LINE2": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊ", + "EVENT_BASED_EXPLAIN_LINE3": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ĐŋĐžĐŧĐĩ҇ĐĩĐŊ", + "EVENT_BASED_EXPLAIN_LINE4": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ĐŋŅ€ĐžŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "REPO_REQUIRED": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "TAG_REQUIRED": "ĐĸĐĩĐŗ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ", + "DELETE_SUCCESSFULLY": "ПоĐģĐ¸Ņ‚Đ¸Đēа ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊа", + "UPDATED_SUCCESSFULLY": "ПоĐģĐ¸Ņ‚Đ¸Đēа ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊа", + "EXECUTIONS": "Đ’Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "TAG_SEPARATOR": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ‚ĐĩĐŗĐžĐ˛, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ СаĐŋŅŅ‚Ņ‹Đŧи, tag*, иĐģи **", + "CONTENT_WARNING": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи дОвĐĩŅ€Đ¸Ņ Đē ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐŧ҃ СдĐĩҁҌ ĐēĐžĐŊŅ„ĐģиĐēŅ‚ŅƒŅŽŅ‚ ҁ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐš ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐĩĐš ĐŋŅ€ĐžĐĩĐēŅ‚Đ°, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи СдĐĩҁҌ", + "PREHEAT_EXPLAIN": "ĐŸŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐŊĐ°ĐŗŅ€Đĩв ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩŅ‚ ĐžĐąŅ€Đ°Đˇ в ҁĐĩŅ‚ŅŒ p2p", + "CRITERIA_EXPLAIN": "КаĐē ҃ĐēаСаĐŊĐž в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ 'БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐŊĐ¸Ņ' вĐēĐģадĐēи КоĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ", + "SKIP_CERT_VERIFY": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅŅ‚ĐžŅ‚ Ņ„ĐģаĐļĐžĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°, ĐēĐžĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš ĐŋĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš иĐģи ĐŊĐĩĐŊадĐĩĐļĐŊŅ‹Đš ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚.", + "NAME_TOOLTIP": "ИĐŧŅ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ 2 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ._- и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "NEED_HELP": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐžĐŧ҃ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Ņƒ, Ņ‡Ņ‚ĐžĐąŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đēа" + }, + "PAGINATION": { + "PAGE_SIZE": "РаСĐŧĐĩŅ€ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹" + }, + "SYSTEM_ROBOT": { + "READ": "Đ§Ņ‚ĐĩĐŊиĐĩ", + "CREATE": "ХОСдаĐŊиĐĩ", + "ARTIFACT": "ĐŅ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚", + "HELM": "Helm Chart", + "HELM_VERSION": "ВĐĩŅ€ŅĐ¸Ņ Helm Chart", + "ADD_ROBOT": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ ĐžĐąĐžŅ‚Đ°", + "UPDATE_ROBOT": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ ĐžĐąĐžŅ‚Đ°", + "UPDATE_ROBOT_SUCCESSFULLY": "Đ ĐžĐąĐžŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊ", + "PLACEHOLDER": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš ҁĐĩĐēŅ€ĐĩŅ‚", + "SECRET": "ĐĄĐĩĐēŅ€ĐĩŅ‚ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ Đ´ĐģиĐŊОК ĐžŅ‚ 8 Đ´Đž 20 ŅĐ¸ĐŧвОĐģОв ҁ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊОК ĐˇĐ°ĐŗĐģавĐŊОК ĐąŅƒĐēвОК, ОдĐŊОК ŅŅ‚Ņ€ĐžŅ‡ĐŊОК ĐąŅƒĐēвОК и ОдĐŊОК Ņ†Đ¸Ņ„Ņ€ĐžĐš.", + "REFRESH_SECRET": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐĄĐĩĐēŅ€ĐĩŅ‚", + "REFRESH_SECRET_SUCCESS": "ĐĄĐĩĐēŅ€ĐĩŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊ", + "DELETE_ROBOT": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ ĐžĐąĐžŅ‚Đ°", + "DELETE_ROBOT_SUCCESS": "Đ ĐžĐąĐžŅ‚(Ņ‹) ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊ(Ņ‹)", + "ENABLE_TITLE": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ ĐžĐąĐžŅ‚Đ°", + "ENABLE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Đ° {{param}}?", + "DISABLE_TITLE": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ ĐžĐąĐžŅ‚Đ°", + "DISABLE_SUMMARY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Đ° {{param}}?", + "ENABLE_ROBOT_SUCCESSFULLY": "Đ ĐžĐąĐžŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž аĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "DISABLE_ROBOT_SUCCESSFULLY": "Đ ĐžĐąĐžŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "ROBOT_ACCOUNT": "АĐēĐēĐ°ŅƒĐŊŅ‚ Đ ĐžĐąĐžŅ‚Đ°", + "PROJECTS": "ĐŸŅ€ĐžĐĩĐē҂ҋ", + "ALL_PROJECTS": "Đ’ŅĐĩ ĐŋŅ€ĐžĐĩĐē҂ҋ ҁ", + "PERMISSIONS": "ПРАВА ДОСĐĸĐŖĐŸĐ", + "REFRESH_SECRET_SUMMARY": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ҁĐĩĐēŅ€ĐĩŅ‚ аĐēĐēĐ°ŅƒĐŊŅ‚Đ° Ņ€ĐžĐąĐžŅ‚Đ° иĐģи, ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐžŅ‚ĐēŅ€ĐžĐšŅ‚Đĩ Đ´ĐĩŅ‚Đ°Đģи, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Ņ€ŅƒŅ‡ĐŊŅƒŅŽ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ҁĐĩĐēŅ€ĐĩŅ‚", + "TOKEN": "ĐĄĐĩĐēŅ€ĐĩŅ‚", + "NEW_TOKEN": "ĐĐžĐ˛Ņ‹Đš ĐĄĐĩĐēŅ€ĐĩŅ‚", + "REFRESH": "ОБНОВИĐĸĐŦ", + "PROJECTS_MODAL_TITLE": "ĐŸŅ€ĐžĐĩĐē҂ҋ Đ´ĐģŅ АĐēĐēĐ°ŅƒĐŊŅ‚Đ° Đ ĐžĐąĐžŅ‚Đ°", + "PROJECTS_MODAL_SUMMARY": "Đ­Ņ‚Đž ĐŋŅ€ĐžĐĩĐē҂ҋ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐžŅ…Đ˛Đ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ ŅŅ‚Đ¸Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐŧ Ņ€ĐžĐąĐžŅ‚Đ°.", + "CREATE_ROBOT": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš АĐēĐēĐ°ŅƒĐŊŅ‚ Đ ĐžĐąĐžŅ‚Đ°", + "CREATE_ROBOT_SUMMARY": "ĐĄĐžĐˇĐ´Đ°ĐšŅ‚Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš аĐēĐēĐ°ŅƒĐŊŅ‚ Ņ€ĐžĐąĐžŅ‚Đ°, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ…Đ˛Đ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋŅ€ĐžĐĩĐē҂ҋ. Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ \"ĐžŅ…Đ˛Đ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ ĐŋŅ€ĐžĐĩĐē҂ҋ\", Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€Đ¸ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐēĐž Đ˛ŅĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đŧ и ĐąŅƒĐ´ŅƒŅ‰Đ¸Đŧ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Đŧ", + "EDIT_ROBOT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš АĐēĐēĐ°ŅƒĐŊŅ‚ Đ ĐžĐąĐžŅ‚Đ°", + "EDIT_ROBOT_SUMMARY": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš аĐēĐēĐ°ŅƒĐŊŅ‚ Ņ€ĐžĐąĐžŅ‚Đ°. Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ \"ĐžŅ…Đ˛Đ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ ĐŋŅ€ĐžĐĩĐē҂ҋ\", Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€Đ¸ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐēĐž Đ˛ŅĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đŧ и ĐąŅƒĐ´ŅƒŅ‰Đ¸Đŧ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Đŧ", + "EXPIRATION_TIME": "Đ’Ņ€ĐĩĐŧŅ Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ", + "EXPIRATION_TIME_EXPLAIN": "Đ’Ņ€ĐĩĐŧŅ Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ (в Đ´ĐŊŅŅ…, ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐŊОК Ņ‚ĐžŅ‡ĐēОК ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ˛Ņ€ĐĩĐŧŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ) Ņ‚ĐžĐēĐĩĐŊа аĐēĐēĐ°ŅƒĐŊŅ‚Đ° Ņ€ĐžĐąĐžŅ‚Đ°. ДĐģŅ Ņ‚ĐžĐŗĐž, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŊ ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ Đ¸ŅŅ‚ĐĩĐēаĐģ, ввĐĩĐ´Đ¸Ņ‚Đĩ \"-1\".", + "EXPIRATION_DEFAULT": "Đ´ĐŊĐĩĐš(ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ)", + "EXPIRATION_DAYS": "ĐŖĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ´ĐŊĐĩĐš", + "EXPIRATION_NEVER": "НиĐēĐžĐŗĐ´Đ°", + "EXPIRATION_REQUIRED": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ", + "COVER_ALL": "ĐžŅ…Đ˛Đ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ ĐŋŅ€ĐžĐĩĐē҂ҋ", + "COVER_ALL_EXPLAIN": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Ņ„ĐģаĐļĐžĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€Đ¸ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐēĐž Đ˛ŅĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đŧ и ĐąŅƒĐ´ŅƒŅ‰Đ¸Đŧ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Đŧ", + "COVER_ALL_SUMMARY": "Đ’Ņ‹ĐąŅ€Đ°ĐŊŅ‹ Đ˛ŅĐĩ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đĩ и ĐąŅƒĐ´ŅƒŅ‰Đ¸Đĩ ĐŋŅ€ĐžĐĩĐē҂ҋ.", + "RESET_PERMISSION": "СБРОСИĐĸĐŦ ПРАВА ДОСĐĸĐŖĐŸĐ", + "PERMISSION_COLUMN": "ĐŸŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋа", + "EXPIRES_AT": "Đ˜ŅŅ‚ĐĩĐēаĐĩŅ‚ в", + "VIEW_SECRET": "ОБНОВИĐĸĐŦ СЕКРЕĐĸ", + "LEGACY": "ĐŖŅŅ‚Đ°Ņ€ĐĩĐ˛ŅˆĐ¸Đš", + "CREATE_PROJECT_ROBOT": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ АĐēĐēĐ°ŅƒĐŊŅ‚ Đ ĐžĐąĐžŅ‚Đ°", + "CREATE_PROJECT_ROBOT_SUMMARY": "ĐĄĐžĐˇĐ´Đ°ĐšŅ‚Đĩ аĐēĐēĐ°ŅƒĐŊŅ‚ Ņ€ĐžĐąĐžŅ‚Đ° Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "EDIT_PROJECT_ROBOT": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ АĐēĐēĐ°ŅƒĐŊŅ‚ Đ ĐžĐąĐžŅ‚Đ°", + "EDIT_PROJECT_ROBOT_SUMMARY": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ аĐēĐēĐ°ŅƒĐŊŅ‚ Ņ€ĐžĐąĐžŅ‚Đ° Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°", + "NOT_FOUND": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Ņ€ĐžĐąĐžŅ‚ĐžĐ˛!", + "SELECT_ALL": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Đ˛ŅĐĩ", + "UNSELECT_ALL": "ĐĄĐŊŅŅ‚ŅŒ Đ˛Ņ‹ĐąĐžŅ€ ŅĐž Đ˛ŅĐĩĐŗĐž", + "ROBOT_ACCOUNT_NAV": "АĐēĐēĐ°ŅƒĐŊ҂ҋ Đ ĐžĐąĐžŅ‚ĐžĐ˛", + "COVERED_PROJECTS": "ПРОЕКĐĸ(ĐĢ)", + "CONFIRM_SECRET": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐĄĐĩĐēŅ€ĐĩŅ‚", + "SECRET_AGAIN": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ҁĐĩĐēŅ€ĐĩŅ‚ Đĩ҉Đĩ Ņ€Đ°Đˇ", + "INCONSISTENT": "Два ҁĐĩĐēŅ€ĐĩŅ‚Đ° ĐŊĐĩ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚", + "NAME_TOOLTIP": "ИĐŧŅ Ņ€ĐžĐąĐžŅ‚Đ° Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ Đ´ĐģиĐŊОК ĐžŅ‚ 1 Đ´Đž 255 ŅĐ¸ĐŧвОĐģОв ҁ ĐŊиĐļĐŊиĐŧи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Đŧи, Ņ†Đ¸Ņ„Ņ€Đ°Đŧи и ._- и Đ´ĐžĐģĐļĐŊĐž ĐŊĐ°Ņ‡Đ¸ĐŊĐ°Ņ‚ŅŒŅŅ ҁ ŅĐ¸ĐŧвОĐģОв иĐģи Ņ†Đ¸Ņ„Ņ€.", + "ENABLE_NEW_SECRET": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Ņ€ŅƒŅ‡ĐŊŅƒŅŽ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ҁĐĩĐēŅ€ĐĩŅ‚", + "DELETE": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", + "ARTIFACT_LABEL": "МĐĩŅ‚Đēа Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Đ°", + "SCAN": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", + "SCANNER_PULL": "ĐĄĐēаĐŊĐĩŅ€ ĐŸŅƒĐģĐģ", + "SEARCH_BY_NAME": "ĐŸĐžĐ¸ŅĐē ĐŋĐž иĐŧĐĩĐŊи (ĐąĐĩС ĐŋŅ€ĐĩŅ„Đ¸ĐēŅĐ°)", + "FINAL_PROJECT_NAME_TIP": "ФиĐŊаĐģҌĐŊĐžĐĩ иĐŧŅ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° Ņ€ĐžĐąĐžŅ‚Đ° ŅĐžŅŅ‚ĐžĐ¸Ņ‚ иС ĐŋŅ€ĐĩŅ„Đ¸ĐēŅĐ°, иĐŧĐĩĐŊи ĐŋŅ€ĐžĐĩĐēŅ‚Đ°, СĐŊаĐēа ĐŋĐģŅŽŅ и Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ввĐĩĐ´ĐĩĐŊĐŊĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "FINAL_SYSTEM_NAME_TIP": "ФиĐŊаĐģҌĐŊĐžĐĩ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐžĐĩ иĐŧŅ Ņ€ĐžĐąĐžŅ‚Đ° ŅĐžŅŅ‚ĐžĐ¸Ņ‚ иС ĐŋŅ€ĐĩŅ„Đ¸ĐēŅĐ° и Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ввĐĩĐ´ĐĩĐŊĐŊĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ", + "PUSH_AND_PULL": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ", + "PUSH_PERMISSION_TOOLTIP": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ ĐŊа ĐžŅ‚ĐŋŅ€Đ°Đ˛Đē҃ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ ĐžŅ‚Đ´ĐĩĐģҌĐŊĐž, ĐžĐŊĐž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ вĐŧĐĩҁ҂Đĩ ҁ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩĐŧ ĐŊа ҁĐēĐ°Ņ‡Đ¸Đ˛Đ°ĐŊиĐĩ", + "STOP": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", + "LIST": "ĐĄĐŋĐ¸ŅĐžĐē", + "REPOSITORY": "Đ ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Đš", + "HELM_LABEL": "МĐĩŅ‚Đēа Helm Chart", + "EXPIRES_IN": "Đ˜ŅŅ‚ĐĩĐēаĐĩŅ‚ ҇ĐĩŅ€ĐĩС", + "EXPIRED": "Đ˜ŅŅ‚ĐĩĐē" + }, + "ACCESSORY": { + "DELETION_TITLE_ACCESSORY": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "DELETION_SUMMARY_ACCESSORY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Đ° {{param}}?", + "DELETION_SUMMARY_ONE_ACCESSORY": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиĐĩ(Ņ) {{param}}?", + "DELETE_ACCESSORY": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "DELETED_SUCCESS": "ДоĐŋĐžĐģĐŊĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐž", + "DELETED_FAILED": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "CO_SIGNED": "ПодĐŋĐ¸ŅĐ°ĐŊĐž Cosign", + "NOTARY_SIGNED": "ПодĐŋĐ¸ŅĐ°ĐŊĐž Notary", + "ACCESSORY": "ДоĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "ACCESSORIES": "ДоĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "SUBJECT_ARTIFACT": "ĐžŅĐŊОвĐŊОК Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚", + "CO_SIGN": "Cosign", + "NOTARY": "Notary", + "PLACEHOLDER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиК!" + }, + "CLEARANCES": { + "CLEARANCES": "ĐžŅ‡Đ¸ŅŅ‚Đēа", + "AUDIT_LOG": "ĐĄĐŧĐĩĐŊа ĐļŅƒŅ€ĐŊаĐģа", + "LAST_COMPLETED": "ĐŸĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ", + "NEXT_SCHEDULED_TIME": "ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ", + "SCHEDULE_TO_PURGE": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžŅ‡Đ¸ŅŅ‚Đē҃", + "KEEP_IN": "ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ СаĐŋĐ¸ŅĐ¸ в", + "KEEP_IN_TOOLTIP": "ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ СаĐŋĐ¸ŅĐ¸ в ŅŅ‚ĐžĐŧ иĐŊŅ‚ĐĩŅ€Đ˛Đ°ĐģĐĩ", + "KEEP_IN_ERROR": "ЗĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ° Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ҆ĐĩĐģŅ‹Đŧ Ņ‡Đ¸ŅĐģĐžĐŧ, а Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ йОĐģҌ҈Đĩ 0 и ĐŧĐĩĐŊҌ҈Đĩ 10000 Đ´ĐŊĐĩĐš", + "DAYS": "ДĐŊи", + "HOURS": "Đ§Đ°ŅŅ‹", + "INCLUDED_OPERATIONS": "ВĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸", + "INCLUDED_OPERATION_TOOLTIP": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐļŅƒŅ€ĐŊаĐģŅ‹ Đ°ŅƒĐ´Đ¸Ņ‚Đ° Đ´ĐģŅ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊҋ҅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đš", + "INCLUDED_OPERATION_ERROR": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, Đ˛Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ", + "PURGE_NOW": "ОЧИСĐĸИĐĸĐŦ СЕЙЧАС", + "PURGE_NOW_SUCCESS": "ĐžŅ‡Đ¸ŅŅ‚Đēа ҃ҁĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊа", + "PURGE_SCHEDULE_RESET": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ ĐžŅ‡Đ¸ŅŅ‚Đēи ĐąŅ‹ĐģĐž ŅĐąŅ€ĐžŅˆĐĩĐŊĐž", + "PURGE_HISTORY": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ĐžŅ‡Đ¸ŅŅ‚Đēи", + "FORWARD_ENDPOINT": "КоĐŊĐĩ҇ĐŊĐ°Ņ Ņ‚ĐžŅ‡Đēа ĐŋĐĩŅ€ĐĩҁҋĐģĐēи ĐļŅƒŅ€ĐŊаĐģа Đ°ŅƒĐ´Đ¸Ņ‚Đ° Syslog", + "FORWARD_ENDPOINT_TOOLTIP": "ПĐĩŅ€ĐĩҁҋĐģĐ°Ņ‚ŅŒ ĐļŅƒŅ€ĐŊаĐģŅ‹ Đ°ŅƒĐ´Đ¸Ņ‚Đ° ĐŊа ĐēĐžĐŊĐĩ҇ĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ syslog, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€: harbor-log:10514", + "SKIP_DATABASE": "ĐŸŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐąĐ°ĐˇŅƒ даĐŊĐŊҋ҅ ĐļŅƒŅ€ĐŊаĐģа Đ°ŅƒĐ´Đ¸Ņ‚Đ°", + "SKIP_DATABASE_TOOLTIP": "ĐŸŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ СаĐŋĐ¸ŅŅŒ ĐļŅƒŅ€ĐŊаĐģа Đ°ŅƒĐ´Đ¸Ņ‚Đ° в ĐąĐ°ĐˇŅƒ даĐŊĐŊҋ҅, Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐŊĐŊОК ĐēĐžĐŊĐĩ҇ĐŊОК Ņ‚ĐžŅ‡ĐēĐĩ ĐŋĐĩŅ€ĐĩҁҋĐģĐēи ĐļŅƒŅ€ĐŊаĐģа Đ°ŅƒĐ´Đ¸Ņ‚Đ°", + "STOP_GC_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐēа ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ GC", + "STOP_PURGE_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐēа ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐžŅ‡Đ¸ŅŅ‚Đēи", + "NO_GC_RECORDS": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ¸ŅŅ‚ĐžŅ€Đ¸Đš GC!", + "NO_PURGE_RECORDS": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đ¸ŅŅ‚ĐžŅ€Đ¸Đš ĐžŅ‡Đ¸ŅŅ‚Đēи!" + }, + "CVE_EXPORT": { + "EXPORT_SOME_PROJECTS": "Đ­ĐēҁĐŋĐžŅ€Ņ‚ CVE", + "ALL_PROJECTS": "Đ’ŅĐĩ ĐŋŅ€ĐžĐĩĐē҂ҋ", + "EXPORT_TITLE": "Đ­ĐēҁĐŋĐžŅ€Ņ‚ CVE", + "EXPORT_SUBTITLE": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ҃ҁĐģĐžĐ˛Đ¸Ņ ŅĐēҁĐŋĐžŅ€Ņ‚Đ°", + "EXPORT_CVE_FILTER_HELP_TEXT": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ĐžĐ˛ CVE, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ СаĐŋŅŅ‚Ņ‹Đŧи", + "CVE_IDS": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Ņ‹ CVE", + "EXPORT_BUTTON": "ЭКСПОРĐĸ", + "JOB_NAME": "ИĐŧŅ СадаĐŊĐ¸Ņ", + "JOB_NAME_REQUIRED": "ИĐŧŅ СадаĐŊĐ¸Ņ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž", + "JOB_NAME_EXISTING": "ИĐŧŅ СадаĐŊĐ¸Ņ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚", + "TRIGGER_EXPORT_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž СаĐŋŅƒŅ‰ĐĩĐŊ ŅĐēҁĐŋĐžŅ€Ņ‚ CVE!" + }, + "JOB_SERVICE_DASHBOARD": { + "SCHEDULE_PAUSED": "ЗаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž(ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž)", + "SCHEDULE_BEEN_PAUSED": "{{param}} ĐąŅ‹ĐģĐž ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "PENDING_JOBS": "ОĐļĐ¸Đ´Đ°ŅŽŅ‰Đ¸Đĩ СадаĐŊĐ¸Ņ в ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŅ…", + "OTHERS": "Đ”Ņ€ŅƒĐŗĐ¸Đĩ", + "STOP_ALL": "ОСĐĸАНОВИĐĸĐŦ ВСЕ", + "CONFIRM_STOP_ALL": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ˛ŅĐĩŅ…", + "CONFIRM_STOP_ALL_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК?", + "STOP_ALL_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹ Đ˛ŅĐĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК", + "STOP_BTN": "ОСĐĸАНОВИĐĸĐŦ", + "PAUSE_BTN": "ПРИОСĐĸАНОВИĐĸĐŦ", + "RESUME_BTN": "ВОЗОБНОВИĐĸĐŦ", + "JOB_TYPE": "ĐĸиĐŋ СадаĐŊĐ¸Ņ", + "PENDING_COUNT": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐžĐļĐ¸Đ´Đ°ŅŽŅ‰Đ¸Ņ…", + "LATENCY": "ЗадĐĩŅ€ĐļĐēа", + "PAUSED": "ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "NO_JOB_QUEUE": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… ĐžŅ‡ĐĩŅ€ĐĩĐ´ĐĩĐš СадаĐŊиК", + "CONFIRM_STOPPING_JOBS": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐžŅŅ‚Đ°ĐŊОвĐē҃ СадаĐŊиК", + "CONFIRM_STOPPING_JOBS_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ СадаĐŊĐ¸Ņ {{param}}?", + "CONFIRM_PAUSING_JOBS": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐē҃ СадаĐŊиК", + "CONFIRM_PAUSING_JOBS_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ СадаĐŊĐ¸Ņ {{param}}?", + "CONFIRM_RESUMING_JOBS": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ вОСОйĐŊОвĐģĐĩĐŊиĐĩ СадаĐŊиК", + "CONFIRM_RESUMING_JOBS_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ вОСОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ СадаĐŊĐ¸Ņ {{param}}?", + "STOP_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹ СадаĐŊĐ¸Ņ", + "PAUSE_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹ СадаĐŊĐ¸Ņ", + "RESUME_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž вОСОйĐŊОвĐģĐĩĐŊŅ‹ СадаĐŊĐ¸Ņ", + "SCHEDULES": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ", + "RUNNING_STATUS": "Đ’Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ", + "RESUME_ALL_BTN_TEXT": "ВОЗОБНОВИĐĸĐŦ ВСЕ", + "PAUSE_ALL_BTN_TEXT": "ПРИОСĐĸАНОВИĐĸĐŦ ВСЕ", + "CONFIRM_PAUSING_ALL": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ˛ŅĐĩŅ…", + "CONFIRM_PAUSING_ALL_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ СадаĐŊиК?", + "CONFIRM_RESUMING_ALL": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ вОСОйĐŊОвĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ…", + "CONFIRM_RESUMING_ALL_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ вОСОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ СадаĐŊиК?", + "PAUSE_ALL_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ", + "RESUME_ALL_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž вОСОйĐŊОвĐģĐĩĐŊŅ‹ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ", + "VENDOR_TYPE": "ĐĸиĐŋ ĐŋĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đēа", + "VENDOR_ID": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐŋĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đēа", + "NO_SCHEDULE": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊиК", + "WORKERS": "Đ Đ°ĐąĐžŅ‡Đ¸Đĩ", + "FREE_ALL": "ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ", + "CONFIRM_FREE_ALL": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐžŅĐ˛ĐžĐąĐžĐļĐ´ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ…", + "CONFIRM_FREE_ALL_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ Đ˛ŅĐĩŅ… Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…?", + "CONFIRM_FREE_WORKERS": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ ĐžŅĐ˛ĐžĐąĐžĐļĐ´ĐĩĐŊиĐĩ Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "CONFIRM_FREE_WORKERS_CONTENT": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ… {{param}}?", + "FREE_WORKER_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžŅĐ˛ĐžĐąĐžĐļĐ´ĐĩĐŊŅ‹ Ņ€Đ°ĐąĐžŅ‡Đ¸Đĩ", + "FREE_ALL_SUCCESS": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžŅĐ˛ĐžĐąĐžĐļĐ´ĐĩĐŊŅ‹ Đ˛ŅĐĩ Ņ€Đ°ĐąĐžŅ‡Đ¸Đĩ", + "WORKER_POOL": "ĐŸŅƒĐģ Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "WORKER_POOL_ID": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ Đŋ҃Đģа Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "PID": "Pid", + "START_AT": "ĐĐ°Ņ‡Đ°Ņ‚Đž в", + "HEARTBEAT_AT": "ĐŸĐžŅĐģĐĩĐ´ĐŊиК Đŋ҃ĐģҌҁ в", + "CONCURRENCY": "ĐŸĐ°Ņ€Đ°ĐģĐģĐĩĐģиСĐŧ", + "NO_WORKER_POOL": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Đŋ҃ĐģОв Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "FREE": "ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ", + "WORKER_ID": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ Ņ€Đ°ĐąĐžŅ‡ĐĩĐŗĐž", + "JOB_ID": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ СадаĐŊĐ¸Ņ", + "CHECK_IN_AT": "Đ—Đ°Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊ в", + "NO_WORKER": "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŊĐ°ĐšŅ‚Đ¸ ĐŊиĐēаĐēĐ¸Ņ… Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "JOB_QUEUE": "ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК", + "JOB_SERVICE_DASHBOARD": "ПаĐŊĐĩĐģҌ ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁĐĩŅ€Đ˛Đ¸ŅĐžĐŧ СадаĐŊиК", + "OPERATION_STOP_ALL_QUEUES": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК", + "OPERATION_STOP_SPECIFIED_QUEUES": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊŅ‹Đĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК", + "OPERATION_PAUSE_SPECIFIED_QUEUES": "ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊŅ‹Đĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК", + "OPERATION_RESUME_SPECIFIED_QUEUES": "ВозобĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊŅ‹Đĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК", + "OPERATION_PAUSE_SCHEDULE": "ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ", + "OPERATION_RESUME_SCHEDULE": "ВозобĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ", + "OPERATION_FREE_ALL": "ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ Đ˛ŅĐĩŅ… Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "OPERATION_FREE_SPECIFIED_WORKERS": "ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊҋ҅ Ņ€Đ°ĐąĐžŅ‡Đ¸Ņ…", + "QUEUE_STOP_BTN_INFO": "ОСĐĸАНОВИĐĸĐŦ — ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ и ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ СадаĐŊĐ¸Ņ в Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊҋ҅ ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŅ….", + "QUEUE_PAUSE_BTN_INFO": "ПРИОСĐĸАНОВИĐĸĐŦ — ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ СадаĐŊиК в ŅŅ‚ĐžĐŧ Ņ‚Đ¸ĐŋĐĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК. ЗадаĐŊĐ¸Ņ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊŅ‹ в ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŒ, ĐēĐžĐŗĐ´Đ° ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŒ ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа.", + "QUEUE_RESUME_BTN_INFO": "ВОЗОБНОВИĐĸĐŦ — ВозобĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ СадаĐŊиК в ŅŅ‚ĐžĐŧ Ņ‚Đ¸ĐŋĐĩ ĐžŅ‡ĐĩŅ€Đĩди СадаĐŊиК.", + "SCHEDULE_PAUSE_BTN_INFO": "ПРИОСĐĸАНОВИĐĸĐŦ — ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ Đ´ĐģŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ.", + "SCHEDULE_RESUME_BTN_INFO": "ВОЗОБНОВИĐĸĐŦ — ВозобĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ Ņ€Đ°ŅĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ Đ´ĐģŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ.", + "WORKER_FREE_BTN_INFO": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩĐŧĐžĐĩ СадаĐŊиĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‡ĐĩĐŗĐž", + "CRON": "Cron" + } +} From 0a3c06d89ca9923ffd1d96beb2c69145d22f9a06 Mon Sep 17 00:00:00 2001 From: miner Date: Thu, 3 Jul 2025 15:33:25 +0800 Subject: [PATCH 52/55] add dockernetwork parameter for build process (#22138) add dockernetwork parameter for makefile Signed-off-by: my036811 --- Makefile | 2 ++ make/photon/Makefile | 6 +++--- make/photon/registry/builder | 3 ++- make/photon/trivy-adapter/builder.sh | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index a0b17eaae93..822aa0e583f 100644 --- a/Makefile +++ b/Makefile @@ -130,6 +130,7 @@ endef # docker parameters DOCKERCMD=$(shell which docker) DOCKERBUILD=$(DOCKERCMD) build +DOCKERNETWORK=default DOCKERRMIMAGE=$(DOCKERCMD) rmi DOCKERPULL=$(DOCKERCMD) pull DOCKERIMAGES=$(DOCKERCMD) images @@ -395,6 +396,7 @@ build: -e REGISTRYVERSION=$(REGISTRYVERSION) -e REGISTRY_SRC_TAG=$(REGISTRY_SRC_TAG) -e DISTRIBUTION_SRC=$(DISTRIBUTION_SRC)\ -e TRIVYVERSION=$(TRIVYVERSION) -e TRIVYADAPTERVERSION=$(TRIVYADAPTERVERSION) \ -e VERSIONTAG=$(VERSIONTAG) \ + -e DOCKERNETWORK=$(DOCKERNETWORK) \ -e BUILDREG=$(BUILDREG) -e BUILDTRIVYADP=$(BUILDTRIVYADP) \ -e NPM_REGISTRY=$(NPM_REGISTRY) -e BASEIMAGETAG=$(BASEIMAGETAG) -e IMAGENAMESPACE=$(IMAGENAMESPACE) -e BASEIMAGENAMESPACE=$(BASEIMAGENAMESPACE) \ -e REGISTRYURL=$(REGISTRYURL) \ diff --git a/make/photon/Makefile b/make/photon/Makefile index ff4aa8180f2..d4a67210b67 100644 --- a/make/photon/Makefile +++ b/make/photon/Makefile @@ -18,7 +18,7 @@ TIMESTAMP=$(shell date +"%Y%m%d") # docker parameters DOCKERCMD=$(shell which docker) -DOCKERBUILD=$(DOCKERCMD) build --no-cache +DOCKERBUILD=$(DOCKERCMD) build --no-cache --network=$(DOCKERNETWORK) DOCKERBUILD_WITH_PULL_PARA=$(DOCKERBUILD) --pull=$(PULL_BASE_FROM_DOCKERHUB) DOCKERRMIMAGE=$(DOCKERCMD) rmi DOCKERIMAGES=$(DOCKERCMD) images @@ -154,7 +154,7 @@ _build_trivy_adapter: $(call _extract_archive, $(TRIVY_ADAPTER_DOWNLOAD_URL), $(DOCKERFILEPATH_TRIVY_ADAPTER)/binary/) ; \ else \ echo "Building Trivy adapter $(TRIVYADAPTERVERSION) from sources..." ; \ - cd $(DOCKERFILEPATH_TRIVY_ADAPTER) && $(DOCKERFILEPATH_TRIVY_ADAPTER)/builder.sh $(TRIVYADAPTERVERSION) $(GOBUILDIMAGE) && cd - ; \ + cd $(DOCKERFILEPATH_TRIVY_ADAPTER) && $(DOCKERFILEPATH_TRIVY_ADAPTER)/builder.sh $(TRIVYADAPTERVERSION) $(GOBUILDIMAGE) $(DOCKERNETWORK) && cd - ; \ fi ; \ echo "Building Trivy adapter container for photon..." ; \ $(DOCKERBUILD_WITH_PULL_PARA) --build-arg harbor_base_image_version=$(BASEIMAGETAG) \ @@ -178,7 +178,7 @@ _build_registry: rm -rf $(DOCKERFILEPATH_REG)/binary && mkdir -p $(DOCKERFILEPATH_REG)/binary && \ $(call _get_binary, $(REGISTRYURL), $(DOCKERFILEPATH_REG)/binary/registry); \ else \ - cd $(DOCKERFILEPATH_REG) && $(DOCKERFILEPATH_REG)/builder $(REGISTRY_SRC_TAG) $(DISTRIBUTION_SRC) $(GOBUILDIMAGE) && cd - ; \ + cd $(DOCKERFILEPATH_REG) && $(DOCKERFILEPATH_REG)/builder $(REGISTRY_SRC_TAG) $(DISTRIBUTION_SRC) $(GOBUILDIMAGE) $(DOCKERNETWORK) && cd - ; \ fi @echo "building registry container for photon..." @chmod 655 $(DOCKERFILEPATH_REG)/binary/registry && $(DOCKERBUILD_WITH_PULL_PARA) --build-arg harbor_base_image_version=$(BASEIMAGETAG) --build-arg harbor_base_namespace=$(BASEIMAGENAMESPACE) -f $(DOCKERFILEPATH_REG)/$(DOCKERFILENAME_REG) -t $(DOCKERIMAGENAME_REG):$(VERSIONTAG) . diff --git a/make/photon/registry/builder b/make/photon/registry/builder index 6e6a8280e4e..94901ab2bb3 100755 --- a/make/photon/registry/builder +++ b/make/photon/registry/builder @@ -15,6 +15,7 @@ fi VERSION="$1" DISTRIBUTION_SRC="$2" GOBUILDIMAGE="$3" +DOCKERNETWORK="$4" set -e @@ -33,7 +34,7 @@ cd $cur echo 'build the registry binary ...' cp Dockerfile.binary $TEMP -docker build --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t registry-golang $TEMP +docker build --network=$DOCKERNETWORK --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t registry-golang $TEMP echo 'copy the registry binary to local...' ID=$(docker create registry-golang) diff --git a/make/photon/trivy-adapter/builder.sh b/make/photon/trivy-adapter/builder.sh index 9b48a2e0402..0f89a28de8e 100755 --- a/make/photon/trivy-adapter/builder.sh +++ b/make/photon/trivy-adapter/builder.sh @@ -9,6 +9,7 @@ fi VERSION="$1" GOBUILDIMAGE="$2" +DOCKERNETWORK="$3" set -e @@ -22,7 +23,7 @@ cd $TEMP; git checkout $VERSION; cd - echo "Building Trivy adapter binary ..." cp Dockerfile.binary $TEMP -docker build --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t trivy-adapter-golang $TEMP +docker build --network=$DOCKERNETWORK --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t trivy-adapter-golang $TEMP echo "Copying Trivy adapter binary from the container to the local directory..." ID=$(docker create trivy-adapter-golang) From 25654917582a403279ab3eb3a762d8bc3b2c666a Mon Sep 17 00:00:00 2001 From: miner Date: Thu, 3 Jul 2025 18:23:17 +0800 Subject: [PATCH 53/55] add BUILD_INSTALLER parameter for optionally build prepare and log container (#22148) add BUILD_INSTALLER parameter to optionally build prepare and log container only when we need to build offline_installer Signed-off-by: my036811 --- Makefile | 40 ++++++++++++++++++++++++++++------------ make/photon/Makefile | 9 ++++++++- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 822aa0e583f..1fa25a01544 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,12 @@ VERSIONTAG=dev BUILD_BASE=true PUSHBASEIMAGE=false BASEIMAGETAG=dev -BUILDBASETARGET=trivy-adapter core db jobservice log nginx portal prepare redis registry registryctl exporter +# for skip build prepare and log container while BUILD_INSTALLER=false +BUILD_INSTALLER=true +BUILDBASETARGET=trivy-adapter core db jobservice nginx portal redis registry registryctl exporter +ifeq ($(BUILD_INSTALLER), true) + BUILDBASETARGET += prepare log +endif IMAGENAMESPACE=goharbor BASEIMAGENAMESPACE=goharbor # #input true/false only @@ -240,10 +245,8 @@ REGISTRYUSER= REGISTRYPASSWORD= # cmds -DOCKERSAVE_PARA=$(DOCKER_IMAGE_NAME_PREPARE):$(VERSIONTAG) \ - $(DOCKERIMAGENAME_PORTAL):$(VERSIONTAG) \ +DOCKERSAVE_PARA=$(DOCKERIMAGENAME_PORTAL):$(VERSIONTAG) \ $(DOCKERIMAGENAME_CORE):$(VERSIONTAG) \ - $(DOCKERIMAGENAME_LOG):$(VERSIONTAG) \ $(DOCKERIMAGENAME_DB):$(VERSIONTAG) \ $(DOCKERIMAGENAME_JOBSERVICE):$(VERSIONTAG) \ $(DOCKERIMAGENAME_REGCTL):$(VERSIONTAG) \ @@ -251,6 +254,18 @@ DOCKERSAVE_PARA=$(DOCKER_IMAGE_NAME_PREPARE):$(VERSIONTAG) \ $(IMAGENAMESPACE)/nginx-photon:$(VERSIONTAG) \ $(IMAGENAMESPACE)/registry-photon:$(VERSIONTAG) +ifeq ($(BUILD_INSTALLER), true) + DOCKERSAVE_PARA+= $(DOCKER_IMAGE_NAME_PREPARE):$(VERSIONTAG) \ + $(DOCKERIMAGENAME_LOG):$(VERSIONTAG) +endif + +ifeq ($(TRIVYFLAG), true) + DOCKERSAVE_PARA+= $(IMAGENAMESPACE)/trivy-adapter-photon:$(VERSIONTAG) +endif +ifeq ($(EXPORTERFLAG), true) + DOCKERSAVE_PARA+= $(DOCKERIMAGENAME_EXPORTER):$(VERSIONTAG) +endif + PACKAGE_OFFLINE_PARA=-zcvf harbor-offline-installer-$(PKGVERSIONTAG).tgz \ $(HARBORPKG)/$(DOCKERIMGFILE).$(VERSIONTAG).tar.gz \ $(HARBORPKG)/prepare \ @@ -267,13 +282,6 @@ PACKAGE_ONLINE_PARA=-zcvf harbor-online-installer-$(PKGVERSIONTAG).tgz \ DOCKERCOMPOSE_FILE_OPT=-f $(DOCKERCOMPOSEFILEPATH)/$(DOCKERCOMPOSEFILENAME) -ifeq ($(TRIVYFLAG), true) - DOCKERSAVE_PARA+= $(IMAGENAMESPACE)/trivy-adapter-photon:$(VERSIONTAG) -endif -ifeq ($(EXPORTERFLAG), true) - DOCKERSAVE_PARA+= $(DOCKERIMAGENAME_EXPORTER):$(VERSIONTAG) -endif - RUNCONTAINER=$(DOCKERCMD) run --rm -u $(shell id -u):$(shell id -g) -v $(BUILDPATH):$(BUILDPATH) -w $(BUILDPATH) # $1 the name of the docker image @@ -398,6 +406,7 @@ build: -e VERSIONTAG=$(VERSIONTAG) \ -e DOCKERNETWORK=$(DOCKERNETWORK) \ -e BUILDREG=$(BUILDREG) -e BUILDTRIVYADP=$(BUILDTRIVYADP) \ + -e BUILD_INSTALLER=$(BUILD_INSTALLER) \ -e NPM_REGISTRY=$(NPM_REGISTRY) -e BASEIMAGETAG=$(BASEIMAGETAG) -e IMAGENAMESPACE=$(IMAGENAMESPACE) -e BASEIMAGENAMESPACE=$(BASEIMAGENAMESPACE) \ -e REGISTRYURL=$(REGISTRYURL) \ -e TRIVY_DOWNLOAD_URL=$(TRIVY_DOWNLOAD_URL) -e TRIVY_ADAPTER_DOWNLOAD_URL=$(TRIVY_ADAPTER_DOWNLOAD_URL) \ @@ -444,7 +453,14 @@ package_online: update_prepare_version @rm -rf $(HARBORPKG) @echo "Done." -package_offline: update_prepare_version compile build +.PHONY: check_buildinstaller +check_buildinstaller: + @if [ "$(BUILD_INSTALLER)" != "true" ]; then \ + echo "Must set BUILD_INSTALLER as true while triggering package_offline build" ; \ + exit 1; \ + fi + +package_offline: check_buildinstaller update_prepare_version compile build @echo "packing offline package ..." @cp -r make $(HARBORPKG) diff --git a/make/photon/Makefile b/make/photon/Makefile index d4a67210b67..23684c6ff46 100644 --- a/make/photon/Makefile +++ b/make/photon/Makefile @@ -233,10 +233,17 @@ define _build_base fi endef -build: _build_prepare _build_db _build_portal _build_core _build_jobservice _build_log _build_nginx _build_registry _build_registryctl _build_trivy_adapter _build_redis _compile_and_build_exporter +ifeq ($(BUILD_INSTALLER), true) +buildcompt: _build_prepare _build_db _build_portal _build_core _build_jobservice _build_log _build_nginx _build_registry _build_registryctl _build_trivy_adapter _build_redis _compile_and_build_exporter +else +buildcompt: _build_db _build_portal _build_core _build_jobservice _build_nginx _build_registry _build_registryctl _build_trivy_adapter _build_redis _compile_and_build_exporter +endif + +build: buildcompt @if [ -n "$(REGISTRYUSER)" ] && [ -n "$(REGISTRYPASSWORD)" ] ; then \ docker logout ; \ fi + cleanimage: @echo "cleaning image for photon..." - $(DOCKERRMIMAGE) -f $(DOCKERIMAGENAME_PORTAL):$(VERSIONTAG) From 278f495afc867dbbab6fa8a2ffe1b09d2a7e7cfe Mon Sep 17 00:00:00 2001 From: James Strain Date: Mon, 7 Jul 2025 14:29:49 +1000 Subject: [PATCH 54/55] fix: ci (#10) --- .github/auto-assignees.yml | 15 -- .github/release.tpl | 19 --- .github/release.yml | 36 ----- .github/workflows/CI.yml | 66 ++++---- .github/workflows/auto_assign_prs.yml | 18 --- .github/workflows/build-package.yml | 140 +++++++++-------- .github/workflows/codeql-analysis.yml | 54 ------- .github/workflows/conformance_test.yml | 19 +-- .../housekeeping-stale-issues-prs.yaml | 26 ---- .github/workflows/label_check.yaml | 23 --- .github/workflows/nightly-trivy-scan.yml | 41 ----- .github/workflows/pass-CI.yml | 60 -------- .github/workflows/publish_release.yml | 145 ++++++++++++------ 13 files changed, 208 insertions(+), 454 deletions(-) delete mode 100644 .github/auto-assignees.yml delete mode 100644 .github/release.tpl delete mode 100644 .github/release.yml delete mode 100644 .github/workflows/auto_assign_prs.yml delete mode 100644 .github/workflows/codeql-analysis.yml delete mode 100644 .github/workflows/housekeeping-stale-issues-prs.yaml delete mode 100644 .github/workflows/label_check.yaml delete mode 100644 .github/workflows/nightly-trivy-scan.yml delete mode 100644 .github/workflows/pass-CI.yml diff --git a/.github/auto-assignees.yml b/.github/auto-assignees.yml deleted file mode 100644 index 222704c8b37..00000000000 --- a/.github/auto-assignees.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# This assigns a PR to its author -addAssignees: true - -addReviewers: false - -assignees: - - wy65701436 - - Vad1mo - - OrlinVasilev - - stonezdj - - chlins - - MinerYang - -numberOfAssignees: 3 diff --git a/.github/release.tpl b/.github/release.tpl deleted file mode 100644 index 2db6df21fea..00000000000 --- a/.github/release.tpl +++ /dev/null @@ -1,19 +0,0 @@ -// publish release writes the following to release notes. -{"buildNo":"${buildNo}","preTag":"${preTag}"} -// buildNo is required,buildNo is used to specify the installer package. -// buildNo is found at https://github.com/goharbor/harbor/actions/workflows/build-package.yml -// preTag is not required, preTag is used to specify the previous tag, and generates release notes between previous tag and current tag. If preTag is not specified, previous tag will be automatically calculated. - -// Example 1 -// current tag:v2.5.0-rc1 -{"buildNo":"build.1250","preTag":"v2.4.0"} -// Specify the installer package built by Build Package Workflow #1272 as release asset. -// Specify the previous tag as v2.4.0 - -// Example 2 -// current tag:v2.5.0 -{"buildNo":"rc1"} -// Specify the installer package of v2.5.0-rc1 as the release asset of v2.5.0. -// Unspecified preTag automatically calculates preTag for v2.4.0 - -// If the wrong buildNo is specified and the Workflow fails to run, please modify the buildNo and re run \ No newline at end of file diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index 0cd23c92ad8..00000000000 --- a/.github/release.yml +++ /dev/null @@ -1,36 +0,0 @@ -# .github/release.yml - -changelog: - exclude: - labels: - - release-note/ignore-for-release - authors: - - octocat - categories: - - title: Exciting New Features 🎉 - labels: - - release-note/new-feature - - title: Enhancement 🚀 - labels: - - release-note/enhancement - - title: Component updates âŦ†ī¸ - labels: - - release-note/update - - title: Docs update đŸ—„ī¸ - labels: - - release-note/docs - - title: Community update 🧑đŸģ‍🤝‍🧑🏾 - labels: - - release-note/community - - - title: Breaking Changes 🛠 - labels: - - release-note/breaking-change - - - title: Deprecations ❌ - labels: - - release-note/deprecation - - - title: Other Changes - labels: - - "*" \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 3dba1f98c71..8c343d22ffe 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -48,20 +48,20 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env #sudo apt install -y xvfb @@ -77,7 +77,7 @@ jobs: sudo service docker restart - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h bash ./tests/showtime.sh ./tests/ci/ut_install.sh @@ -85,13 +85,13 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/ut_run.sh $IP df -h - name: Codecov For BackEnd uses: codecov/codecov-action@v5 with: - files: ./src/github.com/goharbor/harbor/profile.cov + files: ./src/github.com/groq/harbor/profile.cov flags: unittests APITEST_DB: @@ -109,23 +109,23 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV IP=`hostname -I | awk '{print $1}'` echo "IP=$IP" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -136,14 +136,14 @@ jobs: sudo mv docker-compose /usr/local/bin - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h docker system prune -a -f bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP DB - name: script run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor echo IP: $IP df -h bash ./tests/showtime.sh ./tests/ci/api_run.sh DB $IP @@ -164,23 +164,23 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV IP=`hostname -I | awk '{print $1}'` echo "IP=$IP" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -191,14 +191,14 @@ jobs: sudo mv docker-compose /usr/local/bin - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h docker system prune -a -f bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP DB - name: script run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor echo IP: $IP df -h bash ./tests/showtime.sh ./tests/ci/api_run.sh PROXY_CACHE $IP @@ -219,22 +219,22 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV IP=`hostname -I | awk '{print $1}'` echo "IP=$IP" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -245,7 +245,7 @@ jobs: sudo mv docker-compose /usr/local/bin - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP LDAP @@ -253,7 +253,7 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/api_run.sh LDAP $IP df -h @@ -272,21 +272,21 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd docker version go env echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -305,7 +305,7 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/distro_installer.sh df -h @@ -322,16 +322,16 @@ jobs: node-version: '18' - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: script run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/ui_ut_run.sh df -h - name: Codecov For UI uses: codecov/codecov-action@v5 with: - files: ./src/github.com/goharbor/harbor/src/portal/coverage/lcov.info + files: ./src/github.com/groq/harbor/src/portal/coverage/lcov.info flags: unittests diff --git a/.github/workflows/auto_assign_prs.yml b/.github/workflows/auto_assign_prs.yml deleted file mode 100644 index 7331fd620ec..00000000000 --- a/.github/workflows/auto_assign_prs.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: "Auto Assign" - -# pull_request_target means that this will run on pull requests, but in -# the context of the base repo. This should mean PRs from forks are supported. -on: - pull_request_target: - types: [opened, reopened, ready_for_review] - -jobs: - # Automatically assigns reviewers and owner - add-reviews: - runs-on: ubuntu-latest - steps: - - name: Set the author of a PR as the assignee - uses: kentaro-m/auto-assign-action@v2.0.0 - with: - configuration-path: ".github/auto-assignees.yml" diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index 9091965e81b..2ce5f1caf2d 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -1,11 +1,12 @@ name: "Build Package Workflow" env: DOCKER_COMPOSE_VERSION: 1.23.0 + REGISTRY: ghcr.io on: push: branches: - - main + - groq_release - release-* jobs: @@ -14,64 +15,35 @@ jobs: BUILD_PACKAGE: true runs-on: - ubuntu-22.04 + permissions: + contents: read + packages: write + steps: - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4.2.1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - name: Set up Go 1.22 uses: actions/setup-go@v5 with: go-version: 1.23.2 id: go - - name: Setup Docker - uses: docker-practice/actions-setup-docker@master - with: - docker_version: 20.10 - docker_channel: stable - - uses: actions/checkout@v3 - - uses: jitterbit/get-changed-files@v1 - id: changed-files - with: - format: space-delimited - token: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/checkout@v3 + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + - uses: actions/checkout@v4 + - name: Log in to Container Registry + uses: docker/login-action@v3 with: - path: src/github.com/goharbor/harbor - - name: Build Base Image - if: | - contains(steps.changed-files.outputs.modified, 'Dockerfile.base') || - contains(steps.changed-files.outputs.modified, 'VERSION') || - contains(steps.changed-files.outputs.modified, '.buildbaselog') || - github.ref == 'refs/heads/main' + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Set version variables run: | - set -x - echo "BUILD_BASE=true" >> $GITHUB_ENV - - name: Build Package - run: | - set -x - env - df -h - harbor_target_bucket="" target_branch="$(echo ${GITHUB_REF#refs/heads/})" - harbor_offline_build_bundle="" - harbor_online_build_bundle="" - harbor_logs_bucket="harbor-ci-logs" - harbor_builds_bucket="harbor-builds" - harbor_releases_bucket="harbor-releases" - harbor_ci_pipeline_store_bucket="harbor-ci-pipeline-store/latest" - # the target release version is the version of next release(RC or GA). It needs to be updated on creating new release branch. target_release_version=$(cat ./VERSION) Harbor_Package_Version=$target_release_version-'build.'$GITHUB_RUN_NUMBER - if [[ $target_branch == "main" ]]; then + if [[ $target_branch == "groq_release" ]]; then Harbor_Assets_Version=$Harbor_Package_Version - harbor_target_bucket=$harbor_builds_bucket else Harbor_Assets_Version=$target_release_version - harbor_target_bucket=$harbor_releases_bucket/$target_branch fi if [[ $target_branch == "release-"* ]]; then @@ -79,28 +51,64 @@ jobs: else Harbor_Build_Base_Tag=dev fi + + echo "HARBOR_ASSETS_VERSION=$Harbor_Assets_Version" >> $GITHUB_ENV + echo "HARBOR_PACKAGE_VERSION=$Harbor_Package_Version" >> $GITHUB_ENV + echo "HARBOR_BUILD_BASE_TAG=$Harbor_Build_Base_Tag" >> $GITHUB_ENV + echo "TARGET_BRANCH=$target_branch" >> $GITHUB_ENV + echo "REGISTRY_PREFIX=${{ env.REGISTRY }}/${{ github.repository }}/" >> $GITHUB_ENV + + - name: Build Harbor Images + run: | + sudo make build \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.HARBOR_BUILD_BASE_TAG }} \ + VERSIONTAG=${{ env.HARBOR_ASSETS_VERSION }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + PULL_BASE_FROM_DOCKERHUB=true \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - build_base_params=" BUILD_BASE=false" - cd src/github.com/goharbor/harbor - if [ -z "$BUILD_BASE" ] || [ "$BUILD_BASE" != "true" ]; then - echo "Do not need to build base images!" - else - build_base_params=" BUILD_BASE=true PUSHBASEIMAGE=true REGISTRYUSER=\"${{ secrets.DOCKER_HUB_USERNAME }}\" REGISTRYPASSWORD=\"${{ secrets.DOCKER_HUB_PASSWORD }}\"" - fi - sudo make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= ${build_base_params} - sudo make package_online GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= ${build_base_params} - harbor_offline_build_bundle=$(basename harbor-offline-installer-*.tgz) - harbor_online_build_bundle=$(basename harbor-online-installer-*.tgz) - echo "Package name is: $harbor_offline_build_bundle" - echo "Package name is: $harbor_online_build_bundle" + - name: Push Harbor Images to GHCR + run: | + # Get list of built images + images=$(docker images --format "table {{.Repository}}:{{.Tag}}" | grep "${{ env.REGISTRY }}/${{ github.repository }}" | grep "${{ env.HARBOR_ASSETS_VERSION }}" | awk '{print $1}') + + # Push each image + for image in $images; do + echo "Pushing $image" + docker push $image + done + + - name: Create offline installer package + run: | + sudo make package_offline \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.HARBOR_BUILD_BASE_TAG }} \ + VERSIONTAG=${{ env.HARBOR_ASSETS_VERSION }} \ + PKGVERSIONTAG=${{ env.HARBOR_PACKAGE_VERSION }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - source tests/ci/build_util.sh - cp ${harbor_offline_build_bundle} harbor-offline-installer-latest.tgz - cp ${harbor_online_build_bundle} harbor-online-installer-latest.tgz - uploader ${harbor_offline_build_bundle} $harbor_target_bucket - uploader ${harbor_online_build_bundle} $harbor_target_bucket - uploader harbor-offline-installer-latest.tgz $harbor_target_bucket - uploader harbor-online-installer-latest.tgz $harbor_target_bucket - echo "BUILD_BUNDLE=$harbor_offline_build_bundle" >> $GITHUB_ENV + - name: Create online installer package + run: | + sudo make package_online \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.HARBOR_BUILD_BASE_TAG }} \ + VERSIONTAG=${{ env.HARBOR_ASSETS_VERSION }} \ + PKGVERSIONTAG=${{ env.HARBOR_PACKAGE_VERSION }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - publishImage $target_branch $Harbor_Assets_Version "${{ secrets.DOCKER_HUB_USERNAME }}" "${{ secrets.DOCKER_HUB_PASSWORD }}" + - name: Upload packages as artifacts + uses: actions/upload-artifact@v4 + with: + name: harbor-packages-${{ env.HARBOR_PACKAGE_VERSION }} + path: | + harbor-offline-installer-*.tgz + harbor-online-installer-*.tgz diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index f97fcebcda0..00000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: "Code scanning - action" - -on: - push: - pull_request: - schedule: - - cron: '0 16 * * 6' - -jobs: - CodeQL-Build: - - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - # Override language selection by uncommenting this and choosing your languages - # with: - # languages: go, javascript, csharp, python, cpp, java - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - #- name: Autobuild - # uses: github/codeql-action/autobuild@v1 - - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - # to make sure autobuild success, specifify golang version in go.mod - # https://github.com/github/codeql/issues/15647#issuecomment-2003768106 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/conformance_test.yml b/.github/workflows/conformance_test.yml index 7923fc19111..420914ab954 100644 --- a/.github/workflows/conformance_test.yml +++ b/.github/workflows/conformance_test.yml @@ -17,12 +17,6 @@ jobs: #- self-hosted - ubuntu-latest steps: - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4.2.1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - name: Set up Go 1.21 uses: actions/setup-go@v5 with: @@ -30,11 +24,11 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -49,7 +43,7 @@ jobs: sudo service docker restart - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP DB @@ -57,11 +51,6 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/conformance_test.sh $IP df -h - - name: upload test result to gs - run: | - cd src/github.com/goharbor/harbor - aws s3 cp ./distribution-spec/conformance/report.html s3://harbor-conformance-test/report.html - if: always() diff --git a/.github/workflows/housekeeping-stale-issues-prs.yaml b/.github/workflows/housekeeping-stale-issues-prs.yaml deleted file mode 100644 index a44665e22ef..00000000000 --- a/.github/workflows/housekeeping-stale-issues-prs.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Housekeeping - Close stale issues and PRs -on: - schedule: - - cron: '0 9 * * *' - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v9.1.0 - with: - stale-issue-message: 'This issue is being marked stale due to a period of inactivity. If this issue is still relevant, please comment or remove the stale label. Otherwise, this issue will close in 30 days.' - stale-pr-message: 'This PR is being marked stale due to a period of inactivty. If this PR is still relevant, please comment or remove the stale label. Otherwise, this PR will close in 30 days.' - close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity. If this issue is still relevant, please re-open a new issue.' - close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity. If this PR is still relevant, please re-open a new PR against main.' - days-before-issue-stale: 60 - days-before-pr-stale: 60 - days-before-issue-close: 30 - days-before-pr-close: 30 - # Don't add stale label to PRs / issues with milestones "upcoming" attached. - exempt-milestones: "upcoming" - # Don't add stale label to PRs / issues with this label - exempt-issue-labels: 'never-stale, kind/requirement' - exempt-pr-labels: 'never-stale, kind/requirement' - # Make it 1000 to clean up a bit then wen can lower it - operations-per-run: 1000 diff --git a/.github/workflows/label_check.yaml b/.github/workflows/label_check.yaml deleted file mode 100644 index 6c2cd53adcc..00000000000 --- a/.github/workflows/label_check.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: Release Note Label Check - -# Trigger the workflow on pull requests only -on: - pull_request: - types: [opened, labeled, unlabeled, synchronize] - -env: - GOPROXY: https://proxy.golang.org/ - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} -jobs: - # Ensures correct release-note labels are set: - # - At least one label - # - At most one two the main category labels - check-label: - name: Check release-note label set - runs-on: ubuntu-latest - steps: - - uses: mheap/github-action-required-labels@v5 - with: - mode: minimum - count: 1 - labels: "release-note/ignore-for-release, release-note/new-feature, release-note/update, release-note/enhancement, release-note/community, release-note/breaking-change, release-note/docs, release-note/infra, release-note/deprecation" diff --git a/.github/workflows/nightly-trivy-scan.yml b/.github/workflows/nightly-trivy-scan.yml deleted file mode 100644 index 9f390f5e872..00000000000 --- a/.github/workflows/nightly-trivy-scan.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Trivy Nightly Scan -on: - schedule: - - cron: '0 2 * * *' # run at 2 AM UTC - - -jobs: - nightly-scan: - name: Trivy Scan nightly - strategy: - fail-fast: false - matrix: - # maintain the versions of harbor that need to be actively - # security scanned - versions: [dev, v2.12.0-dev] - # list of images that need to be scanned - images: [harbor-core, harbor-db, harbor-exporter, harbor-jobservice, harbor-log, harbor-portal, harbor-registryctl, prepare] - permissions: - security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@master - with: - image-ref: 'docker.io/goharbor/${{ matrix.images }}:${{ matrix.versions }}' - severity: 'CRITICAL,HIGH' - format: 'template' - template: '@/contrib/sarif.tpl' - output: 'trivy-results.sarif' - env: - # Use AWS' ECR mirror for the trivy-db image, as GitHub's Container - # Registry is returning a TOOMANYREQUESTS error. - # Ref: https://github.com/aquasecurity/trivy-action/issues/389 - TRIVY_DB_REPOSITORY: 'public.ecr.aws/aquasecurity/trivy-db:2' - - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: 'trivy-results.sarif' diff --git a/.github/workflows/pass-CI.yml b/.github/workflows/pass-CI.yml deleted file mode 100644 index d335d1b96e8..00000000000 --- a/.github/workflows/pass-CI.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: CI - -on: - pull_request: - paths: - - 'docs/**' - - '**.md' - - 'tests/**' - - '!tests/**.sh' - - '!tests/apitests/**' - - '!tests/ci/**' - - '!tests/resources/**' - - '!tests/robot-cases/**' - push: - paths: - - 'docs/**' - - '**.md' - - 'tests/**' - - '!tests/**.sh' - - '!tests/apitests/**' - - '!tests/ci/**' - - '!tests/resources/**' - - '!tests/robot-cases/**' - -jobs: - UTTEST: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - APITEST_DB: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - APITEST_DB_PROXY_CACHE: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - APITEST_LDAP: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - OFFLINE: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - UI_UT: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 8967322ea44..2aaa602a4b8 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -5,80 +5,129 @@ on: tags: - 'v*.*.*' +env: + REGISTRY: ghcr.io + jobs: release: runs-on: ubuntu-22.04 + permissions: + contents: write + packages: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup env run: | echo "CUR_TAG=${{ github.ref_name }}" >> $GITHUB_ENV echo "BASE_TAG=$(cat ./VERSION)" >> $GITHUB_ENV - release=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/goharbor/harbor/releases/tags/${{ github.ref_name }}) - echo "BUILD_NO=$(echo $release | jq -r '.body' | jq -r '.buildNo')" >> $GITHUB_ENV - echo "PRE_TAG=$(echo $release | jq -r '.body' | jq -r '.preTag')" >> $GITHUB_ENV - echo "BRANCH=$(echo $release | jq -r '.target_commitish')" >> $GITHUB_ENV - echo "PRERELEASE=$(echo $release | jq -r '.prerelease')" >> $GITHUB_ENV - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4.2.1 + echo "PRERELEASE=$(echo ${{ github.ref_name }} | grep -q 'rc\|alpha\|beta' && echo 'true' || echo 'false')" >> $GITHUB_ENV + + - name: Set up Go + uses: actions/setup-go@v5 with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - name: Prepare Assets - run: | - if [ ! ${{ env.BUILD_NO }} -o ${{ env.BUILD_NO }} = "null" ] - then - echo "missing required parameter buildNo." - exit 1 - fi - echo "buildNo:${{ env.BUILD_NO }}" - echo "preTag:${{ env.PRE_TAG }}" + go-version: 1.23.2 - src_offline_package=harbor-offline-installer-${{ env.BASE_TAG }}-${{ env.BUILD_NO }}.tgz - src_online_package=harbor-online-installer-${{ env.BASE_TAG }}-${{ env.BUILD_NO }}.tgz - dst_offline_package=harbor-offline-installer-${{ env.CUR_TAG }}.tgz - dst_online_package=harbor-online-installer-${{ env.CUR_TAG }}.tgz - aws s3 cp s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_offline_package} s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_offline_package} - aws s3 cp s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_online_package} s3://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_online_package} + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 - assets_path=$(pwd)/assets - source tools/release/release_utils.sh && getAssets ${{ secrets.HARBOR_RELEASE_BUILD }} ${{ env.BRANCH }} $dst_offline_package $dst_online_package ${{ env.PRERELEASE }} $assets_path - echo "OFFLINE_PACKAGE_PATH=$assets_path/$dst_offline_package" >> $GITHUB_ENV - echo "ONLINE_PACKAGE_PATH=$assets_path/$dst_online_package" >> $GITHUB_ENV - echo "MD5SUM_PATH=$assets_path/md5sum" >> $GITHUB_ENV - - name: Setup Docker - uses: docker-practice/actions-setup-docker@master + - name: Log in to Container Registry + uses: docker/login-action@v3 with: - docker_version: 20.10 - docker_channel: stable - - name: Publish Images + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build Harbor Images + run: | + sudo make build \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.BASE_TAG }} \ + VERSIONTAG=${{ env.CUR_TAG }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + PULL_BASE_FROM_DOCKERHUB=true \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} + + - name: Push Harbor Images to GHCR + run: | + # Get list of built images + images=$(docker images --format "table {{.Repository}}:{{.Tag}}" | grep "${{ env.REGISTRY }}/${{ github.repository }}" | grep "${{ env.CUR_TAG }}" | awk '{print $1}') + + # Push each image + for image in $images; do + echo "Pushing $image" + docker push $image + done + + - name: Create offline installer package run: | - tar -zxf ${{ env.OFFLINE_PACKAGE_PATH }} - docker load -i ./harbor/harbor.${{ env.BASE_TAG }}.tar.gz - images="$(docker images --format "{{.Repository}}" --filter=reference='goharbor/*:${{ env.BASE_TAG }}' | xargs)" - source tools/release/release_utils.sh - publishImages ${{ env.CUR_TAG }} ${{ env.BASE_TAG }} "${{ secrets.DOCKER_HUB_USERNAME }}" "${{ secrets.DOCKER_HUB_PASSWORD }}" $images - publishPackages ${{ env.CUR_TAG }} ${{ env.BASE_TAG }} ${{ github.actor }} ${{ secrets.GITHUB_TOKEN }} $images + sudo make package_offline \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.BASE_TAG }} \ + VERSIONTAG=${{ env.CUR_TAG }} \ + PKGVERSIONTAG=${{ env.CUR_TAG }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} + + - name: Create online installer package + run: | + sudo make package_online \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.BASE_TAG }} \ + VERSIONTAG=${{ env.CUR_TAG }} \ + PKGVERSIONTAG=${{ env.CUR_TAG }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} + + - name: Generate checksums + run: | + offline_package=$(ls harbor-offline-installer-*.tgz) + online_package=$(ls harbor-online-installer-*.tgz) + + echo "Generating checksums..." + md5sum $offline_package > checksums.txt + md5sum $online_package >> checksums.txt + sha256sum $offline_package >> checksums.txt + sha256sum $online_package >> checksums.txt + + echo "OFFLINE_PACKAGE=$offline_package" >> $GITHUB_ENV + echo "ONLINE_PACKAGE=$online_package" >> $GITHUB_ENV + - name: Generate release notes run: | release_notes_path=$(pwd)/release-notes.txt - source tools/release/release_utils.sh && generateReleaseNotes ${{ env.CUR_TAG }} ${{ env.PRE_TAG }} ${{ secrets.GITHUB_TOKEN }} $release_notes_path + + # Generate release notes using GitHub API + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \ + -d '{"tag_name":"${{ env.CUR_TAG }}"}' \ + | jq -r '.body' > $release_notes_path + echo "RELEASE_NOTES_PATH=$release_notes_path" >> $GITHUB_ENV + - name: RC Release uses: softprops/action-gh-release@v2 if: ${{ env.PRERELEASE == 'true' }} with: body_path: ${{ env.RELEASE_NOTES_PATH }} + prerelease: true files: | - ${{ env.OFFLINE_PACKAGE_PATH }} - ${{ env.MD5SUM_PATH }} + ${{ env.OFFLINE_PACKAGE }} + checksums.txt + - name: GA Release uses: softprops/action-gh-release@v2 if: ${{ env.PRERELEASE == 'false' }} with: body_path: ${{ env.RELEASE_NOTES_PATH }} files: | - ${{ env.OFFLINE_PACKAGE_PATH }} - ${{ env.ONLINE_PACKAGE_PATH }} - ${{ env.MD5SUM_PATH }} + ${{ env.OFFLINE_PACKAGE }} + ${{ env.ONLINE_PACKAGE }} + checksums.txt From 19cd5351fb24e5847f6d5c90e5d7e8f75f446b87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 05:15:24 +0000 Subject: [PATCH 55/55] chore(deps): bump dompurify and ngx-markdown in /src/portal --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.2.6 dependency-type: indirect - dependency-name: ngx-markdown dependency-version: 20.0.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/portal/package-lock.json | 825 +++++++++++++++++++++++++++++++---- src/portal/package.json | 2 +- 2 files changed, 737 insertions(+), 90 deletions(-) diff --git a/src/portal/package-lock.json b/src/portal/package-lock.json index b61f9c47152..5e7730ab704 100644 --- a/src/portal/package-lock.json +++ b/src/portal/package-lock.json @@ -29,7 +29,7 @@ "js-yaml": "^4.1.0", "ngx-clipboard": "^15.1.0", "ngx-cookie": "^6.0.1", - "ngx-markdown": "16.0.0", + "ngx-markdown": "20.0.0", "rxjs": "^7.4.0", "tslib": "^2.7.0", "zone.js": "^0.13.3" @@ -779,6 +779,28 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "optional": true, + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", @@ -2608,9 +2630,9 @@ } }, "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", "optional": true }, "node_modules/@cds/city": { @@ -2633,6 +2655,45 @@ "modern-normalize": "1.1.0" } }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "optional": true, + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "optional": true, + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "optional": true + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "optional": true + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "optional": true + }, "node_modules/@clr/angular": { "version": "15.4.0", "resolved": "https://registry.npmjs.org/@clr/angular/-/angular-15.4.0.tgz", @@ -3275,6 +3336,57 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "optional": true + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "optional": true, + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@iconify/utils/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3496,6 +3608,15 @@ "@lit-labs/ssr-dom-shim": "^1.0.0" } }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.0.tgz", + "integrity": "sha512-7DNESgpyZ5WG1SIkrYafVBhWmImtmQuoxOO1lawI3gQYWxBX3v1FW3IyuuRfKJAO06XrZR71W0Kif5VEGGd4VA==", + "optional": true, + "dependencies": { + "langium": "3.3.1" + } + }, "node_modules/@ngtools/webpack": { "version": "16.2.16", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.16.tgz", @@ -4256,6 +4377,259 @@ "@types/node": "*" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "optional": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "optional": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "optional": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "optional": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "optional": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "optional": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "optional": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "optional": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "optional": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "optional": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "optional": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "optional": true + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "optional": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "optional": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "optional": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "optional": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "optional": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "optional": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "optional": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "optional": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "optional": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "optional": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "optional": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "optional": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "optional": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "optional": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "optional": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/eslint": { "version": "8.56.12", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", @@ -4296,6 +4670,12 @@ "@types/send": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "optional": true + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -4323,12 +4703,6 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/@types/marked": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", - "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", - "peer": true - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -5044,10 +5418,10 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -6080,6 +6454,32 @@ "node": ">= 0.8.0" } }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "optional": true, + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "optional": true, + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -6416,6 +6816,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "optional": true + }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -7076,9 +7482,9 @@ } }, "node_modules/cytoscape": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", - "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz", + "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==", "optional": true, "engines": { "node": ">=0.10" @@ -7427,6 +7833,46 @@ "node": ">=12" } }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "optional": true, + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "optional": true, + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "optional": true + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "optional": true, + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "optional": true + }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -7546,12 +7992,12 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", - "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", "optional": true, "dependencies": { - "d3": "^7.8.2", + "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, @@ -7989,10 +8435,13 @@ } }, "node_modules/dompurify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", - "optional": true + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/domutils": { "version": "3.1.0", @@ -8085,21 +8534,15 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==" }, - "node_modules/elkjs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", - "optional": true - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/emoji-toolkit": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-7.0.1.tgz", - "integrity": "sha512-l5aJyAhpC5s4mDuoVuqt4SzVjwIsIvakPh4ZGJJE4KWuWFCEHaXacQFkStVdD9zbRR+/BbRXob7u99o0lQFr8A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-9.0.1.tgz", + "integrity": "sha512-sMMNqKNLVHXJfIKoPbrRJwtYuysVNC9GlKetr72zE3SSVbHqoeDLWVrxP0uM0AE0qvdl3hbUk+tJhhwXZrDHaw==", "optional": true }, "node_modules/emojis-list": { @@ -8990,6 +9433,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "optional": true + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -9830,6 +10279,12 @@ "typescript": ">=3.7.5" } }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "optional": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -11756,6 +12211,28 @@ "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", "dev": true }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "optional": true + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "optional": true, + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/launch-editor": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", @@ -11996,6 +12473,23 @@ "node": ">= 12.13.0" } }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "optional": true, + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12574,15 +13068,14 @@ } }, "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "peer": true, + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/matcher": { @@ -12756,40 +13249,44 @@ } }, "node_modules/mermaid": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", - "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.8.0.tgz", + "integrity": "sha512-uAZUwnBiqREZcUrFw3G5iQ5Pj3hTYUP95EZc3ec/nGBzHddJZydzYGE09tGZDBS1VoSoDn0symZ85FmypSTo5g==", "optional": true, "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "cytoscape": "^3.23.0", + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.6.0", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "dagre-d3-es": "7.0.9", - "dayjs": "^1.11.7", - "dompurify": "2.4.3", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.5", + "katex": "^0.16.9", + "khroma": "^2.1.0", "lodash-es": "^4.17.21", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2", + "marked": "^15.0.7", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" + "uuid": "^11.1.0" } }, "node_modules/mermaid/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "optional": true, "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/methods": { @@ -13159,6 +13656,35 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "optional": true, + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "optional": true + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "optional": true, + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/modern-normalize": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", @@ -13353,27 +13879,26 @@ } }, "node_modules/ngx-markdown": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-16.0.0.tgz", - "integrity": "sha512-/rlbXi+HBscJCDdwaTWIUrRkvwJicPnuAgeugOCZa0UbZ4VCWV3U0+uB1Zv6krRDF6FXJNXNLTUrMZV7yH8I6A==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-20.0.0.tgz", + "integrity": "sha512-AtB0EhYlfZbNBFzzhOkqxw5tIX+Z1rLqkRP207ee8c3QHQTn/uRmVVTMwE7LenF2ZOW11Brq/O8h6VfLy9FG+w==", "dependencies": { "tslib": "^2.3.0" }, "optionalDependencies": { "clipboard": "^2.0.11", - "emoji-toolkit": "^7.0.0", + "emoji-toolkit": ">= 8.0.0 < 10.0.0", "katex": "^0.16.0", - "mermaid": "^9.1.2", - "prismjs": "^1.28.0" + "mermaid": ">= 10.6.0 < 12.0.0", + "prismjs": "^1.30.0" }, "peerDependencies": { - "@angular/common": "^16.0.0", - "@angular/core": "^16.0.0", - "@angular/platform-browser": "^16.0.0", - "@types/marked": "^4.3.0", - "marked": "^4.3.0", + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "marked": "^15.0.0", "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" + "zone.js": "~0.15.0" } }, "node_modules/ngx-window-token": { @@ -13462,12 +13987,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, - "node_modules/non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", - "optional": true - }, "node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -14359,6 +14878,12 @@ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "optional": true + }, "node_modules/pacote": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", @@ -14489,6 +15014,12 @@ "node": ">= 0.8" } }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "optional": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14559,6 +15090,12 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "optional": true + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -14707,6 +15244,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pkg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz", + "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", + "optional": true, + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "optional": true + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "optional": true, + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -14995,9 +15559,9 @@ } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "optional": true, "engines": { "node": ">=6" @@ -15124,6 +15688,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "optional": true + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -15710,6 +16290,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "optional": true, + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -17092,9 +17684,9 @@ } }, "node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "optional": true }, "node_modules/supports-hyperlinks": { @@ -17492,6 +18084,12 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", "optional": true }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "optional": true + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -17851,6 +18449,12 @@ "node": "*" } }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "optional": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", @@ -18135,6 +18739,55 @@ "node": ">=0.10.0" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "optional": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "optional": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "optional": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "optional": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "optional": true + }, "node_modules/vue-eslint-parser": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", @@ -18212,12 +18865,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-worker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", - "optional": true - }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", diff --git a/src/portal/package.json b/src/portal/package.json index a3ca026be50..0d1647578c4 100644 --- a/src/portal/package.json +++ b/src/portal/package.json @@ -47,7 +47,7 @@ "js-yaml": "^4.1.0", "ngx-clipboard": "^15.1.0", "ngx-cookie": "^6.0.1", - "ngx-markdown": "16.0.0", + "ngx-markdown": "20.0.0", "rxjs": "^7.4.0", "tslib": "^2.7.0", "zone.js": "^0.13.3"