(cmd *cobra.Command, _ []string)
| 969 | } |
| 970 | |
| 971 | func runGuestsCreateLXC(cmd *cobra.Command, _ []string) error { |
| 972 | session, err := initCLISession(cmd) |
| 973 | if err != nil { |
| 974 | return printError(err) |
| 975 | } |
| 976 | if session == nil { |
| 977 | return nil |
| 978 | } |
| 979 | |
| 980 | nodeName, _ := cmd.Flags().GetString("node") |
| 981 | hostname, _ := cmd.Flags().GetString("hostname") |
| 982 | vmid, _ := cmd.Flags().GetInt("vmid") |
| 983 | memoryMB, _ := cmd.Flags().GetInt("memory") |
| 984 | swapMB, _ := cmd.Flags().GetInt("swap") |
| 985 | cores, _ := cmd.Flags().GetInt("cores") |
| 986 | rootfsStorage, _ := cmd.Flags().GetString("rootfs-storage") |
| 987 | rootfsSize, _ := cmd.Flags().GetInt("rootfs-size") |
| 988 | templateArg, _ := cmd.Flags().GetString("template") |
| 989 | bridge, _ := cmd.Flags().GetString("bridge") |
| 990 | unprivileged, _ := cmd.Flags().GetBool("unprivileged") |
| 991 | nesting, _ := cmd.Flags().GetBool("nesting") |
| 992 | start, _ := cmd.Flags().GetBool("start") |
| 993 | |
| 994 | if swapMB < 0 { |
| 995 | return printError(fmt.Errorf("--swap must be >= 0")) |
| 996 | } |
| 997 | |
| 998 | ctx := context.Background() |
| 999 | |
| 1000 | node, err := session.findNodeByName(ctx, nodeName) |
| 1001 | if err != nil { |
| 1002 | return printError(err) |
| 1003 | } |
| 1004 | if !node.Online { |
| 1005 | return printError(fmt.Errorf("node %q is offline", nodeName)) |
| 1006 | } |
| 1007 | |
| 1008 | client, err := session.clientForNode(ctx, nodeName) |
| 1009 | if err != nil { |
| 1010 | return printError(err) |
| 1011 | } |
| 1012 | |
| 1013 | // Resolve template to a full storage volid. |
| 1014 | // Accepted forms (in priority order): |
| 1015 | // "local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst" → full volid, use as-is |
| 1016 | // "debian-13-standard_13.1-2_amd64.tar.zst" → filename, prepend storage:vztmpl/ |
| 1017 | // "debian-13-standard" → package name, search storage content |
| 1018 | template := templateArg |
| 1019 | switch { |
| 1020 | case strings.Contains(templateArg, ":"): |
| 1021 | // Already a full volid — use as-is. |
| 1022 | case strings.Contains(templateArg, "."): |
| 1023 | // Bare filename — prepend the rootfs storage prefix. |
| 1024 | template = rootfsStorage + ":vztmpl/" + templateArg |
| 1025 | default: |
| 1026 | // Package name — search vztmpl content already on the node's storages. |
| 1027 | template, err = resolveLXCTemplateFromStorage(client, nodeName, templateArg) |
| 1028 | if err != nil { |
nothing calls this directly
no test coverage detected