diff --git a/internal/delivery/http/policy-template.go b/internal/delivery/http/policy-template.go index 4fba4a3a..5b895d95 100644 --- a/internal/delivery/http/policy-template.go +++ b/internal/delivery/http/policy-template.go @@ -716,7 +716,7 @@ func (h *PolicyTemplateHandler) Admin_DeletePolicyTemplateVersion(w http.Respons // Admin_ExistsPolicyTemplateName godoc // // @Tags PolicyTemplate -// @Summary [Admin_ExistsPolicyTemplateName] 정책 템플릿 아름 존재 여부 확인 +// @Summary [Admin_ExistsPolicyTemplateName] 정책 템플릿 이름 존재 여부 확인 // @Description 해당 이름을 가진 정책 템플릿이 이미 존재하는지 확인한다. // @Accept json // @Produce json @@ -1624,7 +1624,7 @@ func (h *PolicyTemplateHandler) DeletePolicyTemplateVersion(w http.ResponseWrite // ExistsPolicyTemplateName godoc // // @Tags PolicyTemplate -// @Summary [ExistsPolicyTemplateName] 정책 템플릿 아름 존재 여부 확인 +// @Summary [ExistsPolicyTemplateName] 정책 템플릿 이름 존재 여부 확인 // @Description 해당 이름을 가진 정책 템플릿이 이미 존재하는지 확인한다. // @Accept json // @Produce json diff --git a/internal/policy-template/policy-template-rego.go b/internal/policy-template/policy-template-rego.go index de39beb0..028f0137 100644 --- a/internal/policy-template/policy-template-rego.go +++ b/internal/policy-template/policy-template-rego.go @@ -23,7 +23,7 @@ const ( obj_get_pattern = `object\.get\((input|input\.parameters|input\.parameters\.[^,]+), \"([^\"]+)\", [^\)]+\)` ref_by_key_pattern = `\[\"([\w-]+)\"\]` package_name_regex = `package ([\w\.]+)[\n\r]+` - import_regex = `import ([\w\.]+)[\n\r]+` + lib_import_regex = `import data\.lib\.([\w\.]+)[\n\r]+` ) var ( @@ -620,11 +620,28 @@ func MergeRegoAndLibs(rego string, libs []string) string { return rego } - var re = regexp.MustCompile(import_regex) + var re = regexp.MustCompile(lib_import_regex) var re2 = regexp.MustCompile(package_name_regex) + // data.lib import 모두 제거 result := re.ReplaceAllString(rego, "") + lib_imports := re.FindAllStringSubmatch(rego, -1) + + // data.lib import 시 data.lib.<라이브러리 이름>인 경우 소스에서 <라이브러리 이름>.<정책 이름>으로 참조됨 + // 이 경우 임프로를 제거했으므로 <라이브러리 이름>.<정책 이름>을 <정책 이름>으로 바꾸기 위해 제거 + // <라이브러리 이름>.<정책 이름>.<규칙 이름> 등의 형식은 <규칙 이름>으로 참조되기 때문에 처리할 필요 없음 + for _, lib_import := range lib_imports { + lib_and_rule := lib_import[1] + + if !strings.Contains(lib_and_rule, ".") { + remove_lib_prefix := lib_and_rule + "." + fmt.Printf("'%s'\n", remove_lib_prefix) + result = strings.ReplaceAll(result, remove_lib_prefix, "") + } + } + // "<라이브러리 이름>." 제거 로직 끝 + for _, lib := range processLibs(libs) { result += re2.ReplaceAllString(lib, "") } diff --git a/internal/repository/policy-template.go b/internal/repository/policy-template.go index 1071f813..80d0f885 100644 --- a/internal/repository/policy-template.go +++ b/internal/repository/policy-template.go @@ -137,7 +137,7 @@ func (r *PolicyTemplateRepository) FetchForOrganization(ctx context.Context, org _, res := pg.Fetch(r.db.WithContext(ctx). Preload("SupportedVersions", func(db *gorm.DB) *gorm.DB { // 최신 버전만 - return db.Order("policy_template_supported_versions.version DESC") + return db.Order("policy_template_supported_versions.created_at DESC") }). Preload("Creator").Preload("Updator"). // organization을 기준으로 조회할 때에는 PermittedOrganizations는 로딩하지 않아도 됨 Model(&model.PolicyTemplate{}). @@ -274,7 +274,7 @@ func (r *PolicyTemplateRepository) GetBy(ctx context.Context, key string, value res := r.db.WithContext(ctx). Preload("SupportedVersions", func(db *gorm.DB) *gorm.DB { // 최신 버전만 - return db.Order("policy_template_supported_versions.version DESC").Limit(1) + return db.Order("policy_template_supported_versions.created_at DESC").Limit(1) }). Preload("PermittedOrganizations").Preload("Creator").Preload("Updator"). Where(query, value). diff --git a/internal/usecase/policy-template.go b/internal/usecase/policy-template.go index 7f850349..e8b5d78c 100644 --- a/internal/usecase/policy-template.go +++ b/internal/usecase/policy-template.go @@ -318,6 +318,33 @@ func (u *PolicyTemplateUsecase) Get(ctx context.Context, organizationId *string, } } + if organizationId != nil { + (*policyTemplate).LatestVersion = policyTemplate.Version + + var primaryClusterId string + + org, err := u.organizationRepo.Get(ctx, *organizationId) + + if err != nil { + log.Errorf(ctx, "error is :%s(%T)", err.Error(), err) + } else { + // 에러 없이 primaryClusterId를 가져왔을 때만 처리 + primaryClusterId = org.PrimaryClusterId + + templateCR, err := policytemplate.GetTksPolicyTemplateCR(ctx, primaryClusterId, policyTemplate.ResoureName()) + + if err == nil && templateCR != nil { + (*policyTemplate).CurrentVersion = templateCR.Spec.Version + } else if errors.IsNotFound(err) || templateCR == nil { + // 템플릿이 존재하지 않으면 최신 버전으로 배포되므로 + (*policyTemplate).CurrentVersion = policyTemplate.LatestVersion + } else { + // 통신 실패 등 기타 에러, 버전을 세팅하지 않아 에러임을 알수 있도록 로그를 남김 + log.Errorf(ctx, "error is :%s(%T)", err.Error(), err) + } + } + } + return policyTemplate, nil } diff --git a/pkg/domain/policy-template.go b/pkg/domain/policy-template.go index 7f4919c7..2045ee80 100644 --- a/pkg/domain/policy-template.go +++ b/pkg/domain/policy-template.go @@ -115,7 +115,7 @@ type CreatePolicyTemplateVersionResponse struct { } type GetPolicyTemplateResponse struct { - PolicyTemplate PolicyTemplateResponse `json:"policyTemplate"` + PolicyTemplate PolicyTemplateTwoVersionResponse `json:"policyTemplate"` } type ListPolicyTemplateResponse struct {