Files

1 line
56 KiB
JSON

{"repo": "caoyingjunz/pixiu", "files": {"cmd/app/options/bootstrap.go": {"a5afd16bbd1f63a4225ecb8328452521e07479b7": {"t": 1785746076.2273467, "n": 6275, "h": "12eb8d6b79c5b3f9", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.3\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky10.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultAIProviderCatalog = []pixiuModel.AIProvider{\n\t{\n\t\tName: \"openai\",\n\t\tBaseURL: \"https://api.openai.com\",\n\t\tProtocol: \"openai_responses\",\n\t\tDescription: \"OpenAI official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"deepseek\",\n\t\tBaseURL: \"https://api.deepseek.com\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"DeepSeek official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"siliconflow\",\n\t\tBaseURL: \"https://api.siliconflow.cn/v1\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"SiliconFlow official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"zhipu\",\n\t\tBaseURL: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"Zhipu GLM official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\tif err := o.bootstrapAIProviders(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (o *Options) bootstrapAIProviders(ctx context.Context) error {\n\tfor i := range defaultAIProviderCatalog {\n\t\tprovider := defaultAIProviderCatalog[i]\n\t\tif err := o.Factory.Assistant().Provider().EnsureBuiltin(ctx, &provider); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to initialize ai provider %s: %v\", provider.Name, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"operating system initialization completed\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"runner initialization completed\")\n\treturn nil\n}\n"}, "9334e5109b0bdeaba074886d5f7b15dccc18a5f9": {"t": 1785759554.5481403, "n": 6185, "h": "135269cc16bcc5d7", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.3\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultAIProviderCatalog = []pixiuModel.AIProvider{\n\t{\n\t\tName: \"openai\",\n\t\tBaseURL: \"https://api.openai.com\",\n\t\tProtocol: \"openai_responses\",\n\t\tDescription: \"OpenAI official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"deepseek\",\n\t\tBaseURL: \"https://api.deepseek.com\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"DeepSeek official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"siliconflow\",\n\t\tBaseURL: \"https://api.siliconflow.cn/v1\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"SiliconFlow official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"zhipu\",\n\t\tBaseURL: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"Zhipu GLM official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\tif err := o.bootstrapAIProviders(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (o *Options) bootstrapAIProviders(ctx context.Context) error {\n\tfor i := range defaultAIProviderCatalog {\n\t\tprovider := defaultAIProviderCatalog[i]\n\t\tif err := o.Factory.Assistant().Provider().EnsureBuiltin(ctx, &provider); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to initialize ai provider %s: %v\", provider.Name, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"operating system initialization completed\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"runner initialization completed\")\n\treturn nil\n}\n"}, "c517a5abec2bb08af59362e5952680717e46f893": {"t": 1785759555.8659208, "n": 6151, "h": "284a4baa3eb24ad5", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.3\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultAIProviderCatalog = []pixiuModel.AIProvider{\n\t{\n\t\tName: \"openai\",\n\t\tBaseURL: \"https://api.openai.com\",\n\t\tProtocol: \"openai_responses\",\n\t\tDescription: \"OpenAI official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"deepseek\",\n\t\tBaseURL: \"https://api.deepseek.com\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"DeepSeek official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"siliconflow\",\n\t\tBaseURL: \"https://api.siliconflow.cn/v1\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"SiliconFlow official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n\t{\n\t\tName: \"zhipu\",\n\t\tBaseURL: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\tProtocol: \"openai_chat\",\n\t\tDescription: \"Zhipu GLM official API\",\n\t\tMaxTokens: 4096,\n\t\tBuiltin: true,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\tif err := o.bootstrapAIProviders(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (o *Options) bootstrapAIProviders(ctx context.Context) error {\n\tfor i := range defaultAIProviderCatalog {\n\t\tprovider := defaultAIProviderCatalog[i]\n\t\tif err := o.Factory.Assistant().Provider().EnsureBuiltin(ctx, &provider); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to initialize ai provider %s: %v\", provider.Name, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 operating system 的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner 的初始化\")\n\treturn nil\n}\n"}, "0db7d1e96700e0be880fee3609905dcaf9b17f7c": {"t": 1785759558.1219592, "n": 4899, "h": "6f8999e798128704", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.3\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 operating system 的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner 的初始化\")\n\treturn nil\n}\n"}, "8366e67a35a2a241fdd2a03b56fd385c5dd66469": {"t": 1785759559.695104, "n": 4885, "h": "c22f5c9cc9181ea6", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.3\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成支持系统的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner 的初始化\")\n\treturn nil\n}\n"}, "f87325e0e4948ffa6898d15ea726504fc470ade5": {"t": 1785759561.476308, "n": 4891, "h": "cd879cea12183ae6", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.3\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成支持系统的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner agent 的初始化\")\n\treturn nil\n}\n"}, "fcee77bfc732b079361efa42d915f360a12e29e3": {"t": 1785759563.6521, "n": 4891, "h": "6299626e7002097b", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.2\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成支持系统的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnstart,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner agent 的初始化\")\n\treturn nil\n}\n"}, "ecfc42828ee79a0bdf725ea4e914d4878e3a5a11": {"t": 1785759565.2262294, "n": 4891, "h": "4f0352b15030b91d", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.2\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t}, {\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu24.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成支持系统的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnknown,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner agent 的初始化\")\n\treturn nil\n}\n"}, "ea685b325e96a616b70dc219c6ae6d2b946c5fab": {"t": 1785759566.5357158, "n": 4799, "h": "146c457af07a2852", "c": "package options\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tpixiuModel \"github.com/caoyingjunz/pixiu/pkg/db/model\"\n\t\"github.com/caoyingjunz/pixiu/pkg/types\"\n\t\"k8s.io/klog/v2\"\n)\n\nconst (\n\tRunnerAgentV2 = \"runner-agent-v2\"\n\tRunnerAgentV3 = \"runner-agent-v3\"\n\n\tRunnerAgentV2Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v2.0.2\"\n\tRunnerAgentV3Image = \"ccr.ccs.tencentyun.com/pixiucloud/kubez-ansible:v3.0.2\"\n)\n\nconst (\n\tdistributionFamilyCentos = \"CentOS\"\n\tdistributionFamilyUbuntu = \"Ubuntu\"\n\tdistributionFamilyDebian = \"Debian\"\n\tdistributionFamilyOpenEuler = \"OpenEuler\"\n\tdistributionFamilyRocky = \"RockyLinux\"\n)\n\nvar defaultDistributionCatalog = []struct {\n\tfamily string\n\tname string\n\trunner string\n}{\n\t{\n\t\tfamily: distributionFamilyCentos,\n\t\tname: \"centos7\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu18.04\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu20.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyUbuntu,\n\t\tname: \"ubuntu22.04\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian10\",\n\t\trunner: RunnerAgentV2,\n\t},\n\t{\n\t\tfamily: distributionFamilyDebian,\n\t\tname: \"debian11\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler22.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyOpenEuler,\n\t\tname: \"openEuler24.03\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky8.5\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.2\",\n\t\trunner: RunnerAgentV3,\n\t},\n\t{\n\t\tfamily: distributionFamilyRocky,\n\t\tname: \"rocky9.3\",\n\t\trunner: RunnerAgentV3,\n\t},\n}\n\nvar defaultRunners = []struct {\n\tname string\n\tengineImage string\n\tdesc string\n}{\n\t{\n\t\tname: RunnerAgentV2,\n\t\tengineImage: RunnerAgentV2Image,\n\t\tdesc: \"操作系统默认 python2\",\n\t},\n\t{\n\t\tname: RunnerAgentV3,\n\t\tengineImage: RunnerAgentV3Image,\n\t\tdesc: \"操作系统默认 python3\",\n\t},\n}\n\n// bootstrapDatabase 启动时集中初始化所有数据库相关资源\nfunc (o *Options) bootstrapDatabase() error {\n\tctx := context.Background()\n\n\t// 初始化超级管理员\n\tif err := o.bootstrapRootUser(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化操作系统\n\tif err := o.bootstrapDistributions(ctx); err != nil {\n\t\treturn err\n\t}\n\t// 初始化 Runner\n\tif err := o.bootstrapRunners(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// bootstrapRootUser 启动时自动初始化超级管理员账户\n// 若超管已存在则跳过,若不存在则使用配置文件中的用户名和密码创建\n// 密码经由 Controller.User().Create() 内部调用 util.EncryptUserPassword() 加密后入库\nfunc (o *Options) bootstrapRootUser(ctx context.Context) error {\n\troot, err := o.Factory.User().GetRoot(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to check root user: %v\", err)\n\t}\n\tif root != nil {\n\t\tklog.Info(\"root user already exists, skipping\")\n\t\treturn nil\n\t}\n\n\tadminUser := o.ComponentConfig.Default.AdminUser\n\tadminPassword := o.ComponentConfig.Default.AdminPassword\n\tklog.Infof(\"initializing root user: %s\", adminUser)\n\n\treturn o.Controller.User().Create(ctx, &types.CreateUserRequest{\n\t\tName: adminUser,\n\t\tPassword: adminPassword,\n\t\tRole: pixiuModel.RoleRoot,\n\t})\n}\n\nfunc (o *Options) bootstrapDistributions(ctx context.Context) error {\n\texistsDistros, err := o.Factory.Distribution().ListDistributions(ctx)\n\tif err != nil {\n\t\tklog.Errorf(\"failed to list runners: %v\", err)\n\t\treturn err\n\t}\n\n\t// 构建已存在 Distro 的 map,用于快速查找\n\texistingDistroMap := make(map[string]bool)\n\tfor _, d := range existsDistros {\n\t\texistingDistroMap[d.Name] = true\n\t}\n\n\tfor _, distro := range defaultDistributionCatalog {\n\t\tif existingDistroMap[distro.name] {\n\t\t\tcontinue\n\t\t}\n\n\t\tobject := &pixiuModel.Distribution{\n\t\t\tFamily: distro.family,\n\t\t\tName: distro.name,\n\t\t\tRunner: distro.runner,\n\t\t}\n\t\tif _, err = o.Factory.Distribution().CreateDistribution(ctx, object); err != nil {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tklog.Infof(\"完成支持系统的初始化\")\n\treturn nil\n}\n\n// bootstrapRunners 启动时自动初始化默认 Runner\nfunc (o *Options) bootstrapRunners(ctx context.Context) error {\n\t// 先获取所有已存在的 runners\n\texistingRunners, err := o.Factory.Runner().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list runners: %v\", err)\n\t}\n\n\t// 构建已存在 runner 的 map,用于快速查找\n\texistingRunnerMap := make(map[string]bool)\n\tfor _, r := range existingRunners {\n\t\texistingRunnerMap[r.Name] = true\n\t}\n\n\tfor _, dr := range defaultRunners {\n\t\tif existingRunnerMap[dr.name] {\n\t\t\tklog.V(1).Infof(\"runner %s already exists, skipping\", dr.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err = o.Controller.Runner().Create(ctx, &types.CreateRunnerRequest{\n\t\t\tName: dr.name,\n\t\t\tEngineImage: dr.engineImage,\n\t\t\tStatus: pixiuModel.RunnerStatusUnknown,\n\t\t\tDescription: dr.desc,\n\t\t}); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to bootstrap runner %s: %v\", dr.name, err)\n\t\t}\n\t}\n\n\tklog.Infof(\"完成 runner agent 的初始化\")\n\treturn nil\n}\n"}}}}