Skip to content

Commit

Permalink
fix: refactor template rendering logic, abstract common func
Browse files Browse the repository at this point in the history
  • Loading branch information
LZiHaN committed Nov 2, 2023
1 parent 7c1f2cf commit 7a8da07
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 142 deletions.
15 changes: 9 additions & 6 deletions pkg/buildah/create.go
Expand Up @@ -20,6 +20,8 @@ import (
"os"
"os/exec"

stringsutil "github.com/labring/sealos/pkg/utils/strings"

"github.com/containers/buildah/pkg/parse"
"github.com/containers/storage/pkg/unshare"
"github.com/labring/sreg/pkg/utils/file"
Expand Down Expand Up @@ -76,18 +78,19 @@ func newCreateCmd() *cobra.Command {
if err != nil {
return err
}
if !opts.short {
logger.Info("Mount point: %s", info.MountPoint)
} else {
fmt.Println(info.MountPoint)
}

if len(opts.env) > 0 {
if err := runRender([]string{info.MountPoint}, opts.env); err != nil {
return err
}
}

if !opts.short {
logger.Info("Mount point: %s", info.MountPoint)
} else {
fmt.Println(info.MountPoint)
}

if !unshare.IsRootless() {
return nil
}
Expand Down Expand Up @@ -131,7 +134,7 @@ func runRender(mountPoints []string, env []string) error {
logger.Debug("MountPoint %s does not exist, skipping", mp)
return nil
}
return RenderTemplatesWithEnv(mp, envs)
return stringsutil.RenderTemplatesWithEnv(mp, envs)
})
}

Expand Down
73 changes: 0 additions & 73 deletions pkg/buildah/util.go
Expand Up @@ -15,23 +15,11 @@
package buildah

import (
"errors"
"fmt"
"os"
"path/filepath"
"strings"

"github.com/containers/common/libimage"

"github.com/labring/sealos/pkg/constants"
"github.com/labring/sealos/pkg/template"
"github.com/labring/sealos/pkg/utils/logger"

"github.com/labring/sealos/pkg/utils/file"
)

const templateSuffix = ".tmpl"

func PreloadIfTarFile(images []string, transport string) ([]string, error) {
r, err := getRuntime(nil)
if err != nil {
Expand All @@ -52,64 +40,3 @@ func PreloadIfTarFile(images []string, transport string) ([]string, error) {
}
return ret, nil
}

func RenderTemplatesWithEnv(filePaths string, envs map[string]string) error {
var (
renderEtc = filepath.Join(filePaths, constants.EtcDirName)
renderScripts = filepath.Join(filePaths, constants.ScriptsDirName)
renderManifests = filepath.Join(filePaths, constants.ManifestsDirName)
)

for _, dir := range []string{renderEtc, renderScripts, renderManifests} {
logger.Debug("render env dir: %s", dir)
if !file.IsExist(dir) {
logger.Debug("Directory %s does not exist, skipping", dir)
continue
}

if err := filepath.Walk(dir, func(path string, info os.FileInfo, errIn error) error {
if errIn != nil {
return errIn
}
if info.IsDir() || !strings.HasSuffix(info.Name(), templateSuffix) {
return nil
}

fileName := strings.TrimSuffix(path, templateSuffix)
if file.IsExist(fileName) {
if err := os.Remove(fileName); err != nil {
logger.Warn("failed to remove existing file [%s]: %v", fileName, err)
}
}

writer, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, os.ModePerm)
if err != nil {
return fmt.Errorf("failed to open file [%s] for rendering: %v", path, err)
}
defer writer.Close()

body, err := file.ReadAll(path)
if err != nil {
return err
}

t, isOk, err := template.TryParse(string(body))
if isOk {
if err != nil {
return fmt.Errorf("failed to create template: %s %v", path, err)
}
if err := t.Execute(writer, envs); err != nil {
return fmt.Errorf("failed to render env template: %s %v", path, err)
}
} else {
return errors.New("parse template failed")
}

return nil
}); err != nil {
return fmt.Errorf("failed to render templates in directory %s: %v", dir, err)
}
}

return nil
}
2 changes: 2 additions & 0 deletions pkg/constants/consts.go
Expand Up @@ -18,6 +18,8 @@ const (
DefaultClusterFileName = "Clusterfile"
)

const TemplateSuffix = ".tmpl"

const (
LvsCareStaticPodName = "kube-sealos-lvscare"
YamlFileSuffix = "yaml"
Expand Down
52 changes: 5 additions & 47 deletions pkg/env/env.go
Expand Up @@ -16,16 +16,10 @@ package env

// nosemgrep: go.lang.security.audit.xss.import-text-template.import-text-template
import (
"errors"
"fmt"
"os"
"path/filepath"
"strings"
"sync"

"github.com/labring/sealos/pkg/template"
"github.com/labring/sealos/pkg/types/v1beta1"
fileutil "github.com/labring/sealos/pkg/utils/file"
"github.com/labring/sealos/pkg/utils/logger"
"github.com/labring/sealos/pkg/utils/maps"
stringsutil "github.com/labring/sealos/pkg/utils/strings"
Expand Down Expand Up @@ -73,47 +67,11 @@ func (p *processor) WrapShell(host, shell string) string {
}

func (p *processor) RenderAll(host, dir string, envs map[string]string) error {
return filepath.Walk(dir, func(path string, info os.FileInfo, errIn error) error {
if errIn != nil {
return errIn
}
if info.IsDir() || !strings.HasSuffix(info.Name(), templateSuffix) {
return nil
}
fileName := strings.TrimSuffix(path, templateSuffix)
if fileutil.IsExist(fileName) {
if err := os.Remove(fileName); err != nil {
logger.Warn(err)
}
}

writer, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, os.ModePerm)
if err != nil {
return fmt.Errorf("failed to open file [%s] when render env: %v", path, err)
}

defer writer.Close()
body, err := fileutil.ReadAll(path)
if err != nil {
return err
}

t, isOk, err := template.TryParse(string(body))
if isOk {
if err != nil {
return fmt.Errorf("failed to create template: %s %v", path, err)
}
if host != "" {
data := maps.Merge(envs, p.getHostEnvInCache(host))
if err := t.Execute(writer, data); err != nil {
return fmt.Errorf("failed to render env template: %s %v", path, err)
}
}
} else {
return errors.New("parse template failed")
}
return nil
})
data := envs
if host != "" {
data = maps.Merge(envs, p.getHostEnvInCache(host))
}
return stringsutil.RenderTemplatesWithEnv(dir, data)
}

func (p *processor) getHostEnvInCache(hostIP string) map[string]string {
Expand Down
17 changes: 1 addition & 16 deletions pkg/filesystem/rootfs/rootfs_default.go
Expand Up @@ -193,23 +193,8 @@ func (f *defaultRootfs) unmountRootfs(cluster *v2.Cluster, ipList []string) erro
}

func renderTemplatesWithEnv(mountDir string, ipList []string, p env.Interface, envs map[string]string) error {
var (
renderEtc = filepath.Join(mountDir, constants.EtcDirName)
renderScripts = filepath.Join(mountDir, constants.ScriptsDirName)
renderManifests = filepath.Join(mountDir, constants.ManifestsDirName)
)

// currently only render once
for _, dir := range []string{renderEtc, renderScripts, renderManifests} {
logger.Debug("render env dir: %s", dir)
if file.IsExist(dir) {
err := p.RenderAll(ipList[0], dir, envs)
if err != nil {
return err
}
}
}
return nil
return p.RenderAll(ipList[0], mountDir, envs)
}

func newDefaultRootfs(mounts []v2.MountImage) (filesystem.Mounter, error) {
Expand Down
68 changes: 68 additions & 0 deletions pkg/utils/strings/strings.go
Expand Up @@ -17,11 +17,18 @@ limitations under the License.
package strings

import (
"errors"
"fmt"
"os"
"path/filepath"
"regexp"
"strings"
"unicode"

"github.com/labring/sealos/pkg/constants"
"github.com/labring/sealos/pkg/template"
"github.com/labring/sealos/pkg/utils/file"

"golang.org/x/exp/slices"

"github.com/labring/sealos/pkg/utils/logger"
Expand Down Expand Up @@ -158,6 +165,67 @@ func RenderTextWithEnv(text string, envs map[string]string) string {
return text
}

func RenderTemplatesWithEnv(filePaths string, envs map[string]string) error {
var (
renderEtc = filepath.Join(filePaths, constants.EtcDirName)
renderScripts = filepath.Join(filePaths, constants.ScriptsDirName)
renderManifests = filepath.Join(filePaths, constants.ManifestsDirName)
)

for _, dir := range []string{renderEtc, renderScripts, renderManifests} {
logger.Debug("render env dir: %s", dir)
if !file.IsExist(dir) {
logger.Debug("Directory %s does not exist, skipping", dir)
continue
}

if err := filepath.Walk(dir, func(path string, info os.FileInfo, errIn error) error {
if errIn != nil {
return errIn
}
if info.IsDir() || !strings.HasSuffix(info.Name(), constants.TemplateSuffix) {
return nil
}

fileName := strings.TrimSuffix(path, constants.TemplateSuffix)
if file.IsExist(fileName) {
if err := os.Remove(fileName); err != nil {
logger.Warn("failed to remove existing file [%s]: %v", fileName, err)
}
}

writer, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, os.ModePerm)
if err != nil {
return fmt.Errorf("failed to open file [%s] for rendering: %v", path, err)
}
defer writer.Close()

body, err := file.ReadAll(path)
if err != nil {
return err
}

t, isOk, err := template.TryParse(string(body))
if isOk {
if err != nil {
return fmt.Errorf("failed to create template: %s %v", path, err)
}
if err := t.Execute(writer, envs); err != nil {
return fmt.Errorf("failed to render env template: %s %v", path, err)
}
} else {
return errors.New("parse template failed")
}

return nil
}); err != nil {
return fmt.Errorf("failed to render templates in directory %s: %v", dir, err)
}
}

return nil
}

func TrimQuotes(s string) string {
if len(s) >= 2 {
if c := s[len(s)-1]; s[0] == c && (c == '"' || c == '\'') {
Expand Down

0 comments on commit 7a8da07

Please sign in to comment.