diff --git a/charts/artifact-hub/values-production.yaml b/charts/artifact-hub/values-production.yaml index b9a6bf0366..ba2d1472bf 100644 --- a/charts/artifact-hub/values-production.yaml +++ b/charts/artifact-hub/values-production.yaml @@ -119,7 +119,7 @@ tracker: requests: cpu: 2 memory: 4000Mi - repositoryTimeout: 25m + repositoryTimeout: 45m trivy: deploy: diff --git a/database/migrations/functions/repositories/get_repository_by_id.sql b/database/migrations/functions/repositories/get_repository_by_id.sql index 51d3662c6d..c890fee154 100644 --- a/database/migrations/functions/repositories/get_repository_by_id.sql +++ b/database/migrations/functions/repositories/get_repository_by_id.sql @@ -22,6 +22,7 @@ returns setof json as $$ 'last_tracking_ts', floor(extract(epoch from r.last_tracking_ts)), 'last_tracking_errors', r.last_tracking_errors, 'data', r.data, + 'packages_deletion_protection', r.packages_deletion_protection, 'user_alias', u.alias, 'organization_name', o.name, 'organization_display_name', o.display_name diff --git a/database/migrations/functions/repositories/search_repositories.sql b/database/migrations/functions/repositories/search_repositories.sql index e7bfc373fd..d6f1de573a 100644 --- a/database/migrations/functions/repositories/search_repositories.sql +++ b/database/migrations/functions/repositories/search_repositories.sql @@ -40,6 +40,7 @@ begin r.last_tracking_ts, r.last_tracking_errors, r.data as repository_data, + r.packages_deletion_protection, u.alias as user_alias, o.name as organization_name, o.display_name as organization_display_name @@ -86,6 +87,7 @@ begin 'last_tracking_ts', floor(extract(epoch from last_tracking_ts)), 'last_tracking_errors', last_tracking_errors, 'data', repository_data, + 'packages_deletion_protection', packages_deletion_protection, 'user_alias', user_alias, 'organization_name', organization_name, 'organization_display_name', organization_display_name diff --git a/database/migrations/schema/061_packages_deletion_protection.sql b/database/migrations/schema/061_packages_deletion_protection.sql new file mode 100644 index 0000000000..3bf3ffddea --- /dev/null +++ b/database/migrations/schema/061_packages_deletion_protection.sql @@ -0,0 +1,5 @@ +alter table repository add column packages_deletion_protection boolean; + + ---- create above / drop below ---- + +alter table repository drop column packages_deletion_protection; diff --git a/database/tests/functions/repositories/get_repository_by_id.sql b/database/tests/functions/repositories/get_repository_by_id.sql index f126340c40..ed90ba8df7 100644 --- a/database/tests/functions/repositories/get_repository_by_id.sql +++ b/database/tests/functions/repositories/get_repository_by_id.sql @@ -31,7 +31,8 @@ insert into repository ( last_scanning_errors, last_tracking_ts, last_tracking_errors, - data + data, + packages_deletion_protection ) values ( :'repo1ID', @@ -48,7 +49,8 @@ values ( 'error1\nerror2\n', '2020-06-16 11:20:34+02', 'error1\nerror2\n', - '{"k1": "v1"}' + '{"k1": "v1"}', + true ); insert into repository ( repository_id, @@ -100,7 +102,8 @@ select is( "last_tracking_ts": 1592299234, "last_tracking_errors": "error1\\nerror2\\n", "user_alias": "user1", - "data": {"k1": "v1"} + "data": {"k1": "v1"}, + "packages_deletion_protection": true }'::jsonb, 'Repository 1 returned as a json object (without credentials)' ); @@ -126,7 +129,8 @@ select is( "last_tracking_ts": 1592299234, "last_tracking_errors": "error1\\nerror2\\n", "user_alias": "user1", - "data": {"k1": "v1"} + "data": {"k1": "v1"}, + "packages_deletion_protection": true }'::jsonb, 'Repository 1 is returned as a json object (with credentials)' ); diff --git a/database/tests/functions/repositories/search_repositories.sql b/database/tests/functions/repositories/search_repositories.sql index 8d814ec166..5577810055 100644 --- a/database/tests/functions/repositories/search_repositories.sql +++ b/database/tests/functions/repositories/search_repositories.sql @@ -43,6 +43,7 @@ insert into repository ( auth_pass, last_tracking_ts, last_tracking_errors, + packages_deletion_protection, repository_kind_id, organization_id ) values ( @@ -55,6 +56,7 @@ insert into repository ( 'pass', '1970-01-01 00:00:00 UTC', 'error1\nerror2\nerror3', + true, 0, :'org1ID' ); @@ -126,6 +128,7 @@ select results_eq( "scanner_disabled": false, "last_tracking_ts": 0, "last_tracking_errors": "error1\\nerror2\\nerror3", + "packages_deletion_protection": true, "organization_name": "org1", "organization_display_name": "Organization 1" }, @@ -358,6 +361,7 @@ select results_eq( "scanner_disabled": false, "last_tracking_ts": 0, "last_tracking_errors": "error1\\nerror2\\nerror3", + "packages_deletion_protection": true, "organization_name": "org1", "organization_display_name": "Organization 1" } diff --git a/database/tests/schema/schema.sql b/database/tests/schema/schema.sql index b9c540258e..a58b035c70 100644 --- a/database/tests/schema/schema.sql +++ b/database/tests/schema/schema.sql @@ -184,6 +184,7 @@ select columns_are('repository', array[ 'digest', 'created_at', 'data', + 'packages_deletion_protection', 'repository_kind_id', 'user_id', 'organization_id' diff --git a/internal/hub/repo.go b/internal/hub/repo.go index 3842587658..16b650229a 100644 --- a/internal/hub/repo.go +++ b/internal/hub/repo.go @@ -274,29 +274,30 @@ type Owner struct { // Repository represents a packages repository. type Repository struct { - RepositoryID string `json:"repository_id"` - Name string `json:"name"` - DisplayName string `json:"display_name"` - URL string `json:"url"` - Branch string `json:"branch"` - Private bool `json:"private"` - AuthUser string `json:"auth_user"` - AuthPass string `json:"auth_pass"` - Digest string `json:"digest"` - Kind RepositoryKind `json:"kind"` - UserID string `json:"user_id"` - UserAlias string `json:"user_alias"` - OrganizationID string `json:"organization_id"` - OrganizationName string `json:"organization_name"` - OrganizationDisplayName string `json:"organization_display_name"` - LastScanningErrors string `json:"last_scanning_errors"` - LastTrackingErrors string `json:"last_tracking_errors"` - VerifiedPublisher bool `json:"verified_publisher"` - Official bool `json:"official"` - CNCF bool `json:"cncf"` - Disabled bool `json:"disabled"` - ScannerDisabled bool `json:"scanner_disabled"` - Data json.RawMessage `json:"data,omitempty"` + RepositoryID string `json:"repository_id"` + Name string `json:"name"` + DisplayName string `json:"display_name"` + URL string `json:"url"` + Branch string `json:"branch"` + Private bool `json:"private"` + AuthUser string `json:"auth_user"` + AuthPass string `json:"auth_pass"` + Digest string `json:"digest"` + Kind RepositoryKind `json:"kind"` + UserID string `json:"user_id"` + UserAlias string `json:"user_alias"` + OrganizationID string `json:"organization_id"` + OrganizationName string `json:"organization_name"` + OrganizationDisplayName string `json:"organization_display_name"` + LastScanningErrors string `json:"last_scanning_errors"` + LastTrackingErrors string `json:"last_tracking_errors"` + VerifiedPublisher bool `json:"verified_publisher"` + Official bool `json:"official"` + CNCF bool `json:"cncf"` + Disabled bool `json:"disabled"` + ScannerDisabled bool `json:"scanner_disabled"` + Data json.RawMessage `json:"data,omitempty"` + PackagesDeletionProtection bool `json:"packages_deletion_protection"` } // RepositoryCloner describes the methods a RepositoryCloner implementation diff --git a/internal/tracker/tracker.go b/internal/tracker/tracker.go index 68078dc808..80f2be7cac 100644 --- a/internal/tracker/tracker.go +++ b/internal/tracker/tracker.go @@ -125,7 +125,7 @@ func (t *Tracker) Run() error { } // Unregister packages not available anymore - if len(packagesAvailable) > 0 { + if len(packagesAvailable) > 0 && !t.r.PackagesDeletionProtection { for key := range packagesRegistered { // Return ASAP if context is cancelled select {