Files
devstar/modules/k8s/controller/devcontainer/utils/template_utils.go
panshuxiao 33a4a54e85 !68 添加了devcontainer在k8s下的重启、暂停、webTerminal功能
* 修复k8s/devcontainer/suite_test
* 改进了DevStar Controller Manager镜像相关代码
* 修改了Dockerfile.rootless以解决go版本问题
* 移动Dockerfile.cotroller-manager位置
* Merge remote-tracking branch 'origin/dev' into devcontainer-on-k8s
* Merge remote-tracking branch 'origin/add_k8s' into AppOnK8s
* Merge remote-tracking branch 'origin/add-dockerfile-method-and-start-s…
*  添加了k8s下的停止、重启devcontainer和webterminal
* Merge branch 'add-dockerfile-method-and-start-stop-container' of https…
* 更新了容器镜像方式的构建、安装和使用方法,但是devcontainer功能还有问题
* fix run postCreateCommand bug
* sh文件方式管理启动脚本
* Merge branch 'add-dockerfile-method-and-start-stop-container' of https…
* add restart command and fix bug
* chore: 补充添加k8s controller的go.mod和go.sum文件
* Merge branch 'add-dockerfile-method-and-start-stop-container' of https…
* 为devstar添加k8s上的controller-manager
* add dockerfile method to create container and save container .restart …
2025-05-13 10:50:26 +00:00

94 lines
2.3 KiB
Go

package utils
import (
"bytes"
"fmt"
"os"
"path/filepath"
"runtime"
"text/template"
devcontainer_apps_v1 "code.gitea.io/gitea/modules/k8s/api/v1"
app_v1 "k8s.io/api/apps/v1"
core_v1 "k8s.io/api/core/v1"
yaml_util "k8s.io/apimachinery/pkg/util/yaml"
)
// const (
// TemplatePath = "modules/k8s/controller/devcontainer/templates/"
// )
// parseTemplate 解析 Go Template 模板文件
func parseTemplate(templateName string, app *devcontainer_apps_v1.DevcontainerApp) []byte {
// 获取当前代码文件的绝对路径
_, filename, _, ok := runtime.Caller(0)
if !ok {
panic("无法获取当前文件路径")
}
// 通过当前代码文件的位置计算模板文件的位置
// utils 目录
utilsDir := filepath.Dir(filename)
// controller/devcontainer 目录
controllerDir := filepath.Dir(utilsDir)
// templates 目录
templatesDir := filepath.Join(controllerDir, "templates")
// 完整模板文件路径
templatePath := filepath.Join(templatesDir, templateName+".yaml")
// 打印调试信息
fmt.Printf("当前代码文件: %s\n", filename)
fmt.Printf("模板目录: %s\n", templatesDir)
fmt.Printf("使用模板文件: %s\n", templatePath)
// 检查模板文件是否存在
if _, err := os.Stat(templatePath); os.IsNotExist(err) {
panic(fmt.Errorf("模板文件不存在: %s", templatePath))
}
// 解析模板
tmpl, err := template.
New(filepath.Base(templatePath)).
Funcs(template.FuncMap{"default": DefaultFunc}).
ParseFiles(templatePath)
if err != nil {
panic(err)
}
b := new(bytes.Buffer)
err = tmpl.Execute(b, app)
if err != nil {
panic(err)
}
return b.Bytes()
}
// NewStatefulSet 创建 StatefulSet
func NewStatefulSet(app *devcontainer_apps_v1.DevcontainerApp) *app_v1.StatefulSet {
statefulSet := &app_v1.StatefulSet{}
err := yaml_util.Unmarshal(parseTemplate("statefulset", app), statefulSet)
if err != nil {
panic(err)
}
return statefulSet
}
// NewService 创建 Service
func NewService(app *devcontainer_apps_v1.DevcontainerApp) *core_v1.Service {
service := &core_v1.Service{}
err := yaml_util.Unmarshal(parseTemplate("service", app), service)
if err != nil {
panic(err)
}
return service
}
// DefaultFunc 函数用于实现默认值
func DefaultFunc(value interface{}, defaultValue interface{}) interface{} {
if value == nil || value == "" {
return defaultValue
}
return value
}