Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion pkg/microservice/aslan/core/common/service/kube/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const (
envRegexString = `\$EnvName\$`
productRegexString = `\$Product\$`
serviceRegexString = `\$Service\$`
clusterRegexString = `\$ClusterName\$`
)

var (
Expand All @@ -41,13 +42,15 @@ var (
productRegex = regexp.MustCompile(productRegexString)
envNameRegex = regexp.MustCompile(envRegexString)
serviceRegex = regexp.MustCompile(serviceRegexString)
clusterRegex = regexp.MustCompile(clusterRegexString)
)

// ParseSysKeys 渲染系统变量键值
func ParseSysKeys(namespace, envName, productName, serviceName, ori string) string {
func ParseSysKeys(namespace, envName, productName, serviceName, clusterName, ori string) string {
ori = envNameRegex.ReplaceAllLiteralString(ori, strings.ToLower(envName))
ori = namespaceRegex.ReplaceAllLiteralString(ori, strings.ToLower(namespace))
ori = productRegex.ReplaceAllLiteralString(ori, strings.ToLower(productName))
ori = serviceRegex.ReplaceAllLiteralString(ori, strings.ToLower(serviceName))
ori = clusterRegex.ReplaceAllLiteralString(ori, strings.ToLower(clusterName))
return ori
}
51 changes: 43 additions & 8 deletions pkg/microservice/aslan/core/common/service/kube/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,12 @@ func FetchCurrentAppliedYaml(option *GeneSvcYamlOption) (string, int, error) {
return "", 0, errors.Wrapf(err, "failed to find product %s", option.ProductName)
}

// get cluster name by cluster id
clusterName, err := GetClusterNameByID(productInfo.ClusterID)
Comment thread
leebrouse marked this conversation as resolved.
Outdated
if err != nil {
return "", 0, err
}

curProductSvc := productInfo.GetServiceMap()[option.ServiceName]

// service not installed, nothing to return
Expand Down Expand Up @@ -412,7 +418,7 @@ func FetchCurrentAppliedYaml(option *GeneSvcYamlOption) (string, int, error) {
if err != nil {
return "", 0, err
}
fullRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, fullRenderedYaml)
fullRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, clusterName, fullRenderedYaml)
mergedContainers := mergeContainers(prodSvcTemplate.Containers, curProductSvc.Containers)
fullRenderedYaml, _, err = ReplaceWorkloadImages(fullRenderedYaml, mergedContainers)
if err != nil {
Expand All @@ -430,7 +436,12 @@ func FetchImportedAllManifests(envInfo *models.Product, serviceTmp *models.Servi
if err != nil {
return "", nil, err
}
fullRenderedYaml = ParseSysKeys(envInfo.Namespace, envInfo.EnvName, envInfo.ProductName, serviceTmp.ServiceName, fullRenderedYaml)
// get cluster name by cluster id
clusterName, err := GetClusterNameByID(envInfo.ClusterID)
if err != nil {
return "", nil, err
}
fullRenderedYaml = ParseSysKeys(envInfo.Namespace, envInfo.EnvName, envInfo.ProductName, serviceTmp.ServiceName, clusterName, fullRenderedYaml)

manifests := util.SplitManifestsOrdered(fullRenderedYaml)

Expand Down Expand Up @@ -686,7 +697,12 @@ func FetchImportedManifests(option *GeneSvcYamlOption, productInfo *models.Produ
if err != nil {
return "", nil, err
}
fullRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, fullRenderedYaml)
// get cluster name by id
clusterName, err := GetClusterNameByID(productInfo.ClusterID)
if err != nil {
return "", nil, err
}
fullRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, clusterName, fullRenderedYaml)

manifests := releaseutil.SplitManifests(fullRenderedYaml)

Expand Down Expand Up @@ -770,6 +786,12 @@ func GenerateRenderedYaml(option *GeneSvcYamlOption) (string, int, []*WorkloadRe
return "", 0, nil, errors.Wrapf(err, "failed to find product %s", option.ProductName)
}

// get cluster name by id
clusterName, err := GetClusterNameByID(productInfo.ClusterID)
if err != nil {
return "", 0, nil, err
}

curProductSvc := productInfo.GetServiceMap()[option.ServiceName]

// nothing to render when trying to uninstall a service which is not deployed
Expand Down Expand Up @@ -831,7 +853,7 @@ func GenerateRenderedYaml(option *GeneSvcYamlOption) (string, int, []*WorkloadRe
if renderErr != nil {
return "", 0, nil, fmt.Errorf("failed to render current service yaml: %v", renderErr)
}
currentRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, currentRenderedYaml)
currentRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, clusterName, currentRenderedYaml)
currentBaseReplicaMap, err = ExtractWorkloadReplicas(currentRenderedYaml)
if err != nil {
return "", 0, nil, fmt.Errorf("failed to extract workload replicas: %v", err)
Expand Down Expand Up @@ -860,7 +882,7 @@ func GenerateRenderedYaml(option *GeneSvcYamlOption) (string, int, []*WorkloadRe
if err != nil {
return "", 0, nil, fmt.Errorf("failed to render service yaml: %v", err)
}
fullRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, fullRenderedYaml)
fullRenderedYaml = ParseSysKeys(productInfo.Namespace, productInfo.EnvName, option.ProductName, option.ServiceName, clusterName, fullRenderedYaml)

// service may not be deployed in environment, we need to extract containers again, since image related variables may be changed
latestSvcTemplate.KubeYamls = util.SplitYaml(fullRenderedYaml)
Expand Down Expand Up @@ -971,20 +993,33 @@ func RenderEnvService(prod *commonmodels.Product, serviceRender *template.Servic
return "", err
}

return RenderEnvServiceWithTempl(prod, serviceRender, service, svcTmpl)
// get cluster name by cluster id
clusterName, err := GetClusterNameByID(prod.ClusterID)
if err != nil {
return "", err
}
return RenderEnvServiceWithTempl(prod, serviceRender, service, svcTmpl, clusterName)
}

func RenderEnvServiceWithTempl(prod *commonmodels.Product, serviceRender *template.ServiceRender, service *commonmodels.ProductService, svcTmpl *commonmodels.Service) (yaml string, err error) {
func RenderEnvServiceWithTempl(prod *commonmodels.Product, serviceRender *template.ServiceRender, service *commonmodels.ProductService, svcTmpl *commonmodels.Service, clusterName string) (yaml string, err error) {
// Note only the keys in TemplateService.ServiceVar can work
parsedYaml, err := RenderServiceYaml(svcTmpl.Yaml, prod.ProductName, svcTmpl.ServiceName, serviceRender)
if err != nil {
log.Errorf("failed to render service yaml, err: %s", err)
return "", err
}
parsedYaml = ParseSysKeys(prod.Namespace, prod.EnvName, prod.ProductName, service.ServiceName, parsedYaml)
parsedYaml = ParseSysKeys(prod.Namespace, prod.EnvName, prod.ProductName, service.ServiceName, clusterName, parsedYaml)
parsedYaml, _, err = ReplaceWorkloadImages(parsedYaml, service.Containers)
if err != nil {
return "", err
}
return ApplyReplicaOverrides(parsedYaml, service.WorkLoads)
}

func GetClusterNameByID(clusterID string) (string, error) {
cluster, err := commonrepo.NewK8SClusterColl().FindByID(clusterID)
if err != nil {
return "", errors.Wrapf(err, "failed to find cluster by id %s", clusterID)
}
return cluster.Name, nil
}
11 changes: 9 additions & 2 deletions pkg/microservice/aslan/core/common/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,12 @@ func GetServiceImpl(serviceName string, serviceTmpl *commonmodels.Service, workL
err = nil

namespace := env.Namespace
// get cluster name by id
clusterName, err := kube.GetClusterNameByID(env.ClusterID)
if err != nil {
log.Errorf("", err)
return nil, err
}
switch env.Source {
case setting.SourceFromHelm:
k8sServices, _ := getter.ListServicesWithCache(nil, inf)
Expand Down Expand Up @@ -1421,8 +1427,9 @@ func GetServiceImpl(serviceName string, serviceTmpl *commonmodels.Service, workL
log.Errorf("failed to render service yaml, err: %s", err)
return nil, err
}
// 渲染系统变量键值
parsedYaml = kube.ParseSysKeys(namespace, envName, productName, service.ServiceName, parsedYaml)

// render system kv value
parsedYaml = kube.ParseSysKeys(namespace, envName, productName, service.ServiceName, clusterName, parsedYaml)

manifests := releaseutil.SplitManifests(parsedYaml)
for _, item := range manifests {
Expand Down
8 changes: 7 additions & 1 deletion pkg/microservice/aslan/core/environment/service/configmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,14 +204,20 @@ func UpdateConfigMap(args *models.CreateUpdateCommonEnvCfgArgs, userName string,
return e.ErrUpdateConfigMap.AddErr(err)
}

// get clusterName by id
clusterName, err := kube.GetClusterNameByID(product.ClusterID)
if err != nil {
return e.ErrUpdateConfigMap.AddErr(err)
}

namespace := product.Namespace

for key, value := range cm.Data {
// TODO need fill variable yaml?
//for _, kv := range renderSet.KVs {
// value = strings.Replace(value, kv.Alias, kv.Value, -1)
//}
value = kube.ParseSysKeys(product.Namespace, product.EnvName, product.ProductName, args.ServiceName, value)
value = kube.ParseSysKeys(product.Namespace, product.EnvName, product.ProductName, args.ServiceName, clusterName, value)
cm.Data[key] = value
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4310,6 +4310,13 @@ func EnvSleep(productName, envName string, isEnable, isProduction bool, log *zap
log.Error(err)
return e.ErrEnvSleep.AddErr(err)
}
clusterName, err := kube.GetClusterNameByID(prod.ClusterID)
if err != nil {
wrapErr := fmt.Errorf("failed to get cluster name for cluster %s, err: %v", prod.ClusterID, err)
log.Error(wrapErr)
return e.ErrEnvSleep.AddErr(wrapErr)
}

if prod.Production != isProduction {
err = fmt.Errorf("Insufficient permissions: %s/%s, is production %v", productName, envName, prod.Production)
log.Error(err)
Expand Down Expand Up @@ -4404,7 +4411,7 @@ func EnvSleep(productName, envName string, isEnable, isProduction bool, log *zap
return e.ErrEnvSleep.AddErr(wrapErr)
}

parsedYaml, err := kube.RenderEnvServiceWithTempl(prod, prodSvc.GetServiceRender(), prodSvc, svc)
parsedYaml, err := kube.RenderEnvServiceWithTempl(prod, prodSvc.GetServiceRender(), prodSvc, svc, clusterName)
if err != nil {
return e.ErrEnvSleep.AddErr(fmt.Errorf("failed to render service %s, err: %s", svc.ServiceName, err))
}
Expand Down
6 changes: 5 additions & 1 deletion pkg/microservice/aslan/core/environment/service/kube.go
Original file line number Diff line number Diff line change
Expand Up @@ -934,6 +934,10 @@ func getWorkloadDetail(ns, resType, name string, kc client.Client, cs *kubernete

func GetResourceDeployStatus(productName string, request *K8sDeployStatusCheckRequest, production bool, log *zap.SugaredLogger) ([]*ServiceDeployStatus, error) {
clusterID, namespace := request.ClusterID, request.Namespace
clusterName, err := kube.GetClusterNameByID(clusterID)
if err != nil {
return nil, e.ErrGetResourceDeployInfo.AddErr(fmt.Errorf("failed to get cluster name by id: %s, err: %s", clusterID, err))
}

svcSet := sets.NewString()
for _, svc := range request.Services {
Expand Down Expand Up @@ -983,7 +987,7 @@ func GetResourceDeployStatus(productName string, request *K8sDeployStatusCheckRe
if err != nil {
return nil, e.ErrGetResourceDeployInfo.AddErr(fmt.Errorf("failed to render service yaml, serviceName:%s, err: %w", svc.ServiceName, err))
}
rederedYaml = kube.ParseSysKeys(request.Namespace, request.EnvName, productName, svc.ServiceName, rederedYaml)
rederedYaml = kube.ParseSysKeys(request.Namespace, request.EnvName, productName, svc.ServiceName, clusterName, rederedYaml)

manifests := releaseutil.SplitManifests(rederedYaml)
resources := make([]*ResourceDeployStatus, 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,14 @@ func renderServiceWithOverrides(prod *commonmodels.Product, service *commonmodel
return "", fmt.Errorf("service is nil")
}
serviceCopy.WorkLoads = cloneWorkLoads(overrides)
return kube.RenderEnvServiceWithTempl(prod, serviceCopy.GetServiceRender(), serviceCopy, tmpl)

// get clusterName
clusterName, err := kube.GetClusterNameByID(prod.ClusterID)
if err != nil {
return "", fmt.Errorf("failed to get cluster name for cluster %s: %w", prod.ClusterID, err)
}

return kube.RenderEnvServiceWithTempl(prod, serviceCopy.GetServiceRender(), serviceCopy, tmpl, clusterName)
}

func serviceReplicaStateChanged(currentSvc, candidateSvc *commonmodels.ProductService) bool {
Expand Down
3 changes: 2 additions & 1 deletion pkg/microservice/aslan/core/environment/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,15 @@ func GetService(envName, productName, serviceName string, production bool, workL
func GetServiceWorkloads(svcTmpl *commonmodels.Service, env *commonmodels.Product, inf informers.SharedInformerFactory, log *zap.SugaredLogger) ([]*commonservice.Workload, error) {
ret := make([]*commonservice.Workload, 0)
envName, productName, namespace := env.EnvName, env.ProductName, env.Namespace
clusterName, err := kube.GetClusterNameByID(env.ClusterID)

svcRender := env.GetSvcRender(svcTmpl.ServiceName)
parsedYaml, err := kube.RenderServiceYaml(svcTmpl.Yaml, productName, svcTmpl.ServiceName, svcRender)
if err != nil {
log.Errorf("failed to render service yaml, err: %s", err)
return nil, err
}
parsedYaml = kube.ParseSysKeys(namespace, envName, productName, svcTmpl.ServiceName, parsedYaml)
parsedYaml = kube.ParseSysKeys(namespace, envName, productName, svcTmpl.ServiceName, clusterName, parsedYaml)

manifests := releaseutil.SplitManifests(parsedYaml)
for _, item := range manifests {
Expand Down
Loading
Loading