package maker import ( "context" "fmt" "os" "path/filepath" "yizhisec.com/hsv2/forge/pkg/downloader" "yizhisec.com/hsv2/forge/pkg/logger" "yizhisec.com/hsv2/forge/pkg/model" ) func (m *maker) Longhorn(ctx context.Context, replica int) error { const ( valuesContent = `# 设置 Longhorn 数据存储路径 defaultSettings: defaultDataPath: "/data/longhorn" # 设置默认副本数 persistence: reclaimPolicy: Retain defaultClassReplicaCount: %d ` ) var ( err error chartURL = "https://artifactory.yizhisec.com:443/artifactory/filestore/hsv3/charts/longhorn-1.10.0.tgz" location = filepath.Join(m.workdir, "dependency", "longhorn") chartFile = filepath.Join(location, "longhorn-1.10.0.tgz") valuesFile = filepath.Join(location, "values.yaml") ) logger.Info("☑️ 开始准备 Longhorn 资源...") logger.Debug("下载地址: %s", chartURL) logger.Debug("目标目录: %s", location) if err = os.MkdirAll(filepath.Join(m.workdir, "dependency", "longhorn"), 0755); err != nil { return err } // Download the chart file if err = downloader.Download( ctx, chartURL, chartFile, downloader.WithInsecureSkipVerify(), ); err != nil { logger.Info("❌ 下载 Longhorn chart 失败") return err } // Create values.yaml file bs := []byte(fmt.Sprintf(valuesContent, replica)) if err := os.WriteFile(valuesFile, bs, 0644); err != nil { logger.Debug("创建 values.yaml 失败: %v", err) logger.Info("❌ 创建 values.yaml 失败") return err } var images = []*model.Image{ {Name: "docker.io/longhornio/longhorn-engine:v1.10.0", Fallback: "docker-mirror.yizhisec.com/longhornio/longhorn-engine:v1.10.0", Save: "longhorn.longhorn-engine.tar"}, {Name: "docker.io/longhornio/longhorn-manager:v1.10.0", Fallback: "docker-mirror.yizhisec.com/longhornio/longhorn-manager:v1.10.0", Save: "longhorn.longhorn-manager.tar"}, {Name: "docker.io/longhornio/longhorn-instance-manager:v1.10.0", Fallback: "docker-mirror.yizhisec.com/longhornio/longhorn-instance-manager:v1.10.0", Save: "longhorn.longhorn-instance-manager.tar"}, {Name: "docker.io/longhornio/longhorn-share-manager:v1.10.0", Fallback: "docker-mirror.yizhisec.com/longhornio/longhorn-share-manager:v1.10.0", Save: "longhorn.longhorn-share-manager.tar"}, {Name: "docker.io/longhornio/longhorn-ui:v1.10.0", Fallback: "docker-mirror.yizhisec.com/longhornio/longhorn-ui:v1.10.0", Save: "longhorn.longhorn-ui.tar"}, {Name: "docker.io/longhornio/csi-snapshotter:v8.3.0-20250826", Fallback: "docker-mirror.yizhisec.com/longhornio/csi-snapshotter:v8.3.0-20250826", Save: "longhorn.csi-snapshotter.tar"}, {Name: "docker.io/longhornio/csi-resizer:v1.14.0-20250826", Fallback: "docker-mirror.yizhisec.com/longhornio/csi-resizer:v1.14.0-20250826", Save: "longhorn.csi-resizer.tar"}, {Name: "docker.io/longhornio/csi-provisioner:v5.3.0-20250826", Fallback: "docker-mirror.yizhisec.com/longhornio/csi-provisioner:v5.3.0-20250826", Save: "longhorn.csi-provisioner.tar"}, {Name: "docker.io/longhornio/livenessprobe:v2.16.0-20250826", Fallback: "docker-mirror.yizhisec.com/longhornio/livenessprobe:v2.16.0-20250826", Save: "longhorn.livenessprobe.tar"}, {Name: "docker.io/longhornio/csi-node-driver-registrar:v2.14.0-20250826", Fallback: "docker-mirror.yizhisec.com/longhornio/csi-node-driver-registrar:v2.14.0-20250826", Save: "longhorn.csi-node-driver-registrar.tar"}, {Name: "docker.io/longhornio/csi-attacher:v4.9.0-20250826", Fallback: "docker-mirror.yizhisec.com/longhornio/csi-attacher:v4.9.0-20250826", Save: "longhorn.csi-attacher.tar"}, } logger.Debug("MakeLonghorn: 开始获取镜像...") for _, image := range images { opts := []ImageOpt{ WithImageFallback(image.Fallback), WithImageSave(filepath.Join(location, image.Save)), WithImageForcePull(image.Force), } if err := m.Image(ctx, image.Name, opts...); err != nil { logger.Error("❌ MakeLonghorn: 获取镜像失败: %s, 可以手动获取后重试", image.Name) logger.Debug("❌ MakeLonghorn: 获取镜像失败: %s, %v", image.Name, err) return err } } logger.Debug("MakeLonghorn: 获取镜像成功!!!") logger.Info("✅ 成功创建 longhorn 资源!!!") return nil }