diff --git a/Wire.go b/Wire.go index 6d1c6e7295..7fc361014e 100644 --- a/Wire.go +++ b/Wire.go @@ -960,7 +960,7 @@ func InitializeApp() (*App, error) { wire.Bind(new(repository9.DevtronResourceSearchableKeyRepository), new(*repository9.DevtronResourceSearchableKeyRepositoryImpl)), devtronResource.NewDevtronResourceSearchableKeyServiceImpl, - wire.Bind(new(devtronResource.DevtronResourceService), new(*devtronResource.DevtronResourceSearchableKeyServiceImpl)), + wire.Bind(new(devtronResource.DevtronResourceSearchableKeyService), new(*devtronResource.DevtronResourceSearchableKeyServiceImpl)), argocdServer.NewArgoClientWrapperServiceImpl, wire.Bind(new(argocdServer.ArgoClientWrapperService), new(*argocdServer.ArgoClientWrapperServiceImpl)), diff --git a/pkg/devtronResource/DevtronResourceService.go b/pkg/devtronResource/DevtronResourceSearchableKeyService.go similarity index 98% rename from pkg/devtronResource/DevtronResourceService.go rename to pkg/devtronResource/DevtronResourceSearchableKeyService.go index d77c9c85f3..dde7bfba7c 100644 --- a/pkg/devtronResource/DevtronResourceService.go +++ b/pkg/devtronResource/DevtronResourceSearchableKeyService.go @@ -6,7 +6,7 @@ import ( "go.uber.org/zap" ) -type DevtronResourceService interface { +type DevtronResourceSearchableKeyService interface { GetAllSearchableKeyNameIdMap() map[bean.DevtronResourceSearchableKeyName]int GetAllSearchableKeyIdNameMap() map[int]bean.DevtronResourceSearchableKeyName } diff --git a/pkg/resourceGroup/ResourceGroupService.go b/pkg/resourceGroup/ResourceGroupService.go index 5f5c106e50..2dda5b3417 100644 --- a/pkg/resourceGroup/ResourceGroupService.go +++ b/pkg/resourceGroup/ResourceGroupService.go @@ -42,23 +42,23 @@ type ResourceGroupService interface { DeleteResourceGroup(resourceGroupId int, groupType ResourceGroupType, emailId string, checkAuthBatch func(emailId string, appObject []string, action string) map[string]bool) (bool, error) } type ResourceGroupServiceImpl struct { - logger *zap.SugaredLogger - resourceGroupRepository resourceGroup.ResourceGroupRepository - resourceGroupMappingRepository resourceGroup.ResourceGroupMappingRepository - enforcerUtil rbac.EnforcerUtil - devtronResourceService devtronResource.DevtronResourceService + logger *zap.SugaredLogger + resourceGroupRepository resourceGroup.ResourceGroupRepository + resourceGroupMappingRepository resourceGroup.ResourceGroupMappingRepository + enforcerUtil rbac.EnforcerUtil + devtronResourceSearchableKeyService devtronResource.DevtronResourceSearchableKeyService } func NewResourceGroupServiceImpl(logger *zap.SugaredLogger, resourceGroupRepository resourceGroup.ResourceGroupRepository, resourceGroupMappingRepository resourceGroup.ResourceGroupMappingRepository, enforcerUtil rbac.EnforcerUtil, - devtronResourceService devtronResource.DevtronResourceService, + devtronResourceSearchableKeyService devtronResource.DevtronResourceSearchableKeyService, ) *ResourceGroupServiceImpl { return &ResourceGroupServiceImpl{ - logger: logger, - resourceGroupRepository: resourceGroupRepository, - resourceGroupMappingRepository: resourceGroupMappingRepository, - enforcerUtil: enforcerUtil, - devtronResourceService: devtronResourceService, + logger: logger, + resourceGroupRepository: resourceGroupRepository, + resourceGroupMappingRepository: resourceGroupMappingRepository, + enforcerUtil: enforcerUtil, + devtronResourceSearchableKeyService: devtronResourceSearchableKeyService, } } @@ -129,7 +129,7 @@ type ResourceGroupDto struct { func (impl *ResourceGroupServiceImpl) CreateResourceGroup(request *ResourceGroupDto) (*ResourceGroupDto, error) { - resourceKeyToId := impl.devtronResourceService.GetAllSearchableKeyNameIdMap() + resourceKeyToId := impl.devtronResourceSearchableKeyService.GetAllSearchableKeyNameIdMap() err := impl.checkAuthForResourceGroup(request, casbin.ActionCreate) if err != nil { return nil, err @@ -195,7 +195,7 @@ func (impl *ResourceGroupServiceImpl) CreateResourceGroup(request *ResourceGroup func (impl *ResourceGroupServiceImpl) UpdateResourceGroup(request *ResourceGroupDto) (*ResourceGroupDto, error) { - resourceKeyToId := impl.devtronResourceService.GetAllSearchableKeyNameIdMap() + resourceKeyToId := impl.devtronResourceSearchableKeyService.GetAllSearchableKeyNameIdMap() // fetching existing resourceIds in resource group mappings, err := impl.resourceGroupMappingRepository.FindByResourceGroupId(request.Id) @@ -283,7 +283,7 @@ func (impl *ResourceGroupServiceImpl) UpdateResourceGroup(request *ResourceGroup } func (impl *ResourceGroupServiceImpl) GetActiveResourceGroupList(emailId string, checkAuthBatch func(emailId string, appObject []string, action string) map[string]bool, parentResourceId int, groupType ResourceGroupType) ([]*ResourceGroupDto, error) { - resourceKeyToId := impl.devtronResourceService.GetAllSearchableKeyNameIdMap() + resourceKeyToId := impl.devtronResourceSearchableKeyService.GetAllSearchableKeyNameIdMap() resourceGroupDtos := make([]*ResourceGroupDto, 0) var resourceGroupIds []int resourceGroups, err := impl.resourceGroupRepository.FindActiveListByParentResource(parentResourceId, groupType.getResourceKey(resourceKeyToId)) diff --git a/pkg/resourceQualifiers/QualifierMappingService.go b/pkg/resourceQualifiers/QualifierMappingService.go index 6c1c27d081..e503dfe972 100644 --- a/pkg/resourceQualifiers/QualifierMappingService.go +++ b/pkg/resourceQualifiers/QualifierMappingService.go @@ -14,16 +14,16 @@ type QualifierMappingService interface { } type QualifierMappingServiceImpl struct { - logger *zap.SugaredLogger - qualifierMappingRepository QualifiersMappingRepository - devtronResourceService devtronResource.DevtronResourceService + logger *zap.SugaredLogger + qualifierMappingRepository QualifiersMappingRepository + devtronResourceSearchableKeyService devtronResource.DevtronResourceSearchableKeyService } -func NewQualifierMappingServiceImpl(logger *zap.SugaredLogger, qualifierMappingRepository QualifiersMappingRepository, devtronResourceService devtronResource.DevtronResourceService) (*QualifierMappingServiceImpl, error) { +func NewQualifierMappingServiceImpl(logger *zap.SugaredLogger, qualifierMappingRepository QualifiersMappingRepository, devtronResourceSearchableKeyService devtronResource.DevtronResourceSearchableKeyService) (*QualifierMappingServiceImpl, error) { return &QualifierMappingServiceImpl{ - logger: logger, - qualifierMappingRepository: qualifierMappingRepository, - devtronResourceService: devtronResourceService, + logger: logger, + qualifierMappingRepository: qualifierMappingRepository, + devtronResourceSearchableKeyService: devtronResourceSearchableKeyService, }, nil } @@ -32,7 +32,7 @@ func (impl QualifierMappingServiceImpl) CreateQualifierMappings(qualifierMapping } func (impl QualifierMappingServiceImpl) GetQualifierMappings(resourceType ResourceType, scope *Scope, resourceIds []int) ([]*QualifierMapping, error) { - searchableKeyNameIdMap := impl.devtronResourceService.GetAllSearchableKeyNameIdMap() + searchableKeyNameIdMap := impl.devtronResourceSearchableKeyService.GetAllSearchableKeyNameIdMap() return impl.qualifierMappingRepository.GetQualifierMappings(resourceType, scope, searchableKeyNameIdMap, resourceIds) } diff --git a/pkg/variables/ScopedVariableService.go b/pkg/variables/ScopedVariableService.go index 03de59e610..161d7d2c69 100644 --- a/pkg/variables/ScopedVariableService.go +++ b/pkg/variables/ScopedVariableService.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/argoproj/argo-workflows/v3/errors" "github.com/caarlos0/env" - "github.com/devtron-labs/devtron/pkg/devtronResource" "github.com/devtron-labs/devtron/pkg/resourceQualifiers" "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/variables/cache" @@ -33,7 +32,6 @@ type ScopedVariableServiceImpl struct { logger *zap.SugaredLogger scopedVariableRepository repository2.ScopedVariableRepository qualifierMappingService resourceQualifiers.QualifierMappingService - devtronResourceService devtronResource.DevtronResourceService VariableNameConfig *VariableConfig VariableCache *cache.VariableCacheObj } diff --git a/scripts/sql/187_create_resource.down.sql b/scripts/sql/187_create_resource.down.sql new file mode 100644 index 0000000000..ca28a16021 --- /dev/null +++ b/scripts/sql/187_create_resource.down.sql @@ -0,0 +1,7 @@ +DROP TABLE "public"."devtron_resource_object_audit"; + +DROP TABLE "public"."devtron_resource_object"; + +DROP TABLE "public"."devtron_resource_schema"; + +DROP TABLE "public"."devtron_resource"; \ No newline at end of file diff --git a/scripts/sql/187_create_resource.up.sql b/scripts/sql/187_create_resource.up.sql new file mode 100644 index 0000000000..0cb6597c42 --- /dev/null +++ b/scripts/sql/187_create_resource.up.sql @@ -0,0 +1,554 @@ +CREATE SEQUENCE IF NOT EXISTS id_seq_devtron_resource; + +CREATE TABLE "public"."devtron_resource" +( + "id" int NOT NULL DEFAULT nextval('id_seq_devtron_resource'::regclass), + "kind" varchar(250) NOT NULL, + "display_name" varchar(250) NOT NULL, + "icon" text, + "parent_kind_id" int, + "deleted" boolean, + "created_on" timestamptz, + "created_by" integer, + "updated_on" timestamptz, + "updated_by" integer, + PRIMARY KEY ("id") +); + + +CREATE SEQUENCE IF NOT EXISTS id_seq_devtron_resource_schema; + +CREATE TABLE "public"."devtron_resource_schema" +( + "id" int NOT NULL DEFAULT nextval('id_seq_devtron_resource_schema'::regclass), + "devtron_resource_id" int, + "version" VARCHAR(5) NOT NULL, + "schema" jsonb, + "latest" boolean, + "created_on" timestamptz, + "created_by" integer, + "updated_on" timestamptz, + "updated_by" integer, + PRIMARY KEY ("id") +); + + +CREATE SEQUENCE IF NOT EXISTS id_seq_devtron_resource_object; + +CREATE TABLE "public"."devtron_resource_object" +( + "id" int NOT NULL DEFAULT nextval('id_seq_devtron_resource_object'::regclass), + "old_object_id" int, + "name" VARCHAR(250), + "devtron_resource_id" int, + "devtron_resource_schema_id" int, + "object_data" jsonb, + "deleted" boolean, + "created_on" timestamptz, + "created_by" integer, + "updated_on" timestamptz, + "updated_by" integer, + PRIMARY KEY ("id") +); + + +CREATE SEQUENCE IF NOT EXISTS id_seq_devtron_resource_object_audit; + +CREATE TABLE "public"."devtron_resource_object_audit" +( + "id" int NOT NULL DEFAULT nextval('id_seq_devtron_resource_object_audit'::regclass), + "devtron_resource_object_id" int, + "object_data" json, + "audit_operation" VARCHAR(10) NOT NULL, + "created_on" timestamptz, + "created_by" integer, + "updated_on" timestamptz, + "updated_by" integer, + PRIMARY KEY ("id") +); + +INSERT INTO devtron_resource(kind, display_name, icon, parent_kind_id, deleted, created_on, created_by, updated_on, + updated_by) +VALUES ('application', 'Applications', '', 0, false, now(), 1, now(), 1); + +INSERT INTO devtron_resource(kind, display_name, icon, parent_kind_id, deleted, created_on, created_by, updated_on, + updated_by) +VALUES ('devtron-application', 'Devtron applications', '', (select id from devtron_resource where kind = 'application'), + false, now(), 1, now(), 1), + ('helm-application', 'Helm applications', '', (select id from devtron_resource where kind = 'application'), + false, now(), 1, now(), 1), + ('job', 'Jobs', '', 0, false, now(), 1, now(), 1), + ('cluster', 'Clusters', '', 0, false, now(), 1, now(), 1); + +INSERT INTO devtron_resource_schema(devtron_resource_id, version, schema, latest, created_on, created_by, updated_on, + updated_by) +VALUES ((select id from devtron_resource where kind = 'devtron-application'), 'v1', + '{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Devtron Application Schema", + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "overview": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "icon": { + "type": "string", + "contentEncoding": "base64" + }, + "description": { + "type": "string" + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "object", + "refType": "#/references/users" + }, + "tags": { + "additionalProperties": { + "type": "string" + } + }, + "metadata": { + "type": "object", + "properties": { + "Owners & Pager Duty": { + "type": "object", + "properties": { + "On Pager Duty": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + }, + "Code Owners": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + } + }, + "required": [ + "Code Owners" + ] + }, + "Service Details": { + "type": "object", + "properties": { + "Framework": { + "type": "string" + }, + "Language": { + "type": "string" + }, + "Map": { + "additionalProperties": { + "type": "string" + } + }, + "Communication Method": { + "type": "string" + }, + "Internet Facing": { + "type": "boolean" + }, + "Cities": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Documentation": { + "type": "object", + "properties": { + "Service Doc": { + "type": "string" + }, + "API Contract": { + "type": "string" + }, + "Runbook": { + "type": "string" + } + } + } + }, + "required": [ + "Owners & Pager Duty" + ] + } + }, + "required": [ + "id", + "metadata" + ] + }, + "actions": { + "type": "object" + }, + "dependencies": { + "type": "object" + } + }, + "required": [ + "version", + "kind", + "overview" + ] + }', + true, now(), 1, now(), 1), + ((select id from devtron_resource where kind = 'helm-application'), 'v1', + '{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Helm Application Schema", + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "overview": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "icon": { + "type": "string", + "contentEncoding": "base64" + }, + "description": { + "type": "string" + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "object", + "refType": "#/references/users" + }, + "tags": { + "additionalProperties": { + "type": "string" + } + }, + "metadata": { + "type": "object", + "properties": { + "Owners & Pager Duty": { + "type": "object", + "properties": { + "On Pager Duty": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + }, + "Code Owners": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + } + }, + "required": [ + "Code Owners" + ] + }, + "Service Details": { + "type": "object", + "properties": { + "Framework": { + "type": "string" + }, + "Language": { + "type": "string" + }, + "Map": { + "additionalProperties": { + "type": "string" + } + }, + "Communication Method": { + "type": "string" + }, + "Internet Facing": { + "type": "boolean" + }, + "Cities": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Documentation": { + "type": "object", + "properties": { + "Service Doc": { + "type": "string", + "format": "uri" + }, + "API Contract": { + "type": "string", + "format": "uri" + }, + "Runbook": { + "type": "string", + "format": "uri" + } + } + } + }, + "required": [ + "Owners & Pager Duty" + ] + } + }, + "required": [ + "id", + "metadata" + ] + }, + "actions": { + "type": "object" + }, + "dependencies": { + "type": "object" + } + }, + "required": [ + "version", + "kind", + "overview" + ] + }', + true, now(), 1, now(), 1), + ((select id from devtron_resource where kind = 'job'), 'v1', + '{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Job Schema", + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "overview": { + "type": "object", + "properties": { + "metadata": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "icon": { + "type": "string", + "contentEncoding": "base64" + }, + "description": { + "type": "string" + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "object", + "refType": "#/references/users" + }, + "tags": { + "additionalProperties": { + "type": "string" + } + }, + "Contacts": { + "type": "object", + "properties": { + "Owners": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + }, + "POCs": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + }, + "Team": { + "type": "string" + }, + "Access Managers": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + } + } + }, + "About job": { + "type": "object", + "properties": { + "Type of job": { + "type": "string" + }, + "For environment": { + "type": "string" + }, + "Documentation": { + "type": "string", + "format": "uri" + } + } + }, + "Operational schedule": { + "type": "object", + "properties": { + "Preferred run": { + "type": "string" + }, + "Maintenance time": { + "type": "string" + } + } + } + }, + "required": [ + "Contacts" + ] + } + }, + "required": [ + "id", + "metadata" + ] + }, + "actions": { + "type": "object" + }, + "dependencies": { + "type": "object" + } + }, + "required": [ + "overview" + ] + }', + true, now(), 1, now(), 1), + ((select id from devtron_resource where kind = 'cluster'), 'v1', + '{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Cluster Schema", + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "overview": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "icon": { + "type": "string", + "contentEncoding": "base64" + }, + "description": { + "type": "string" + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "object", + "refType": "#/references/users" + }, + "tags": { + "additionalProperties": { + "type": "string" + } + }, + "metadata": { + "type": "object", + "properties": { + "POCs": { + "type": "array", + "items": { + "type": "object", + "refType": "#/references/users" + } + }, + "K8s Version": { + "type": "string" + }, + "Cluster Provider": { + "type": "string" + } + } + } + }, + "required": [ + "id", + "metadata" + ] + }, + "actions": { + "type": "object" + }, + "dependencies": { + "type": "object" + } + }, + "required": [ + "version", + "kind", + "overview" + ] + }', + true, now(), 1, now(), 1);