mirror of
https://github.com/apricote/hcloud-upload-image.git
synced 2026-01-13 13:21:01 +00:00
feat: set server type explicitly (#36)
- **CLI**: New flag `--server-type` that overrides the `--architecture` flag and allows users to specify the server type they want - **Lib**: New field in `UploadOptions`: `ServerType *hcloud.ServerType` that overrides the `Architecture` field and allows users to specify the server type they want Closes #30
This commit is contained in:
parent
f244acdfaf
commit
42eeb00a07
2 changed files with 32 additions and 5 deletions
|
|
@ -17,6 +17,7 @@ const (
|
||||||
uploadFlagImagePath = "image-path"
|
uploadFlagImagePath = "image-path"
|
||||||
uploadFlagCompression = "compression"
|
uploadFlagCompression = "compression"
|
||||||
uploadFlagArchitecture = "architecture"
|
uploadFlagArchitecture = "architecture"
|
||||||
|
uploadFlagServerType = "server-type"
|
||||||
uploadFlagDescription = "description"
|
uploadFlagDescription = "description"
|
||||||
uploadFlagLabels = "labels"
|
uploadFlagLabels = "labels"
|
||||||
)
|
)
|
||||||
|
|
@ -43,12 +44,12 @@ This does cost a bit of money for the server.`,
|
||||||
imagePathString, _ := cmd.Flags().GetString(uploadFlagImagePath)
|
imagePathString, _ := cmd.Flags().GetString(uploadFlagImagePath)
|
||||||
imageCompression, _ := cmd.Flags().GetString(uploadFlagCompression)
|
imageCompression, _ := cmd.Flags().GetString(uploadFlagCompression)
|
||||||
architecture, _ := cmd.Flags().GetString(uploadFlagArchitecture)
|
architecture, _ := cmd.Flags().GetString(uploadFlagArchitecture)
|
||||||
|
serverType, _ := cmd.Flags().GetString(uploadFlagServerType)
|
||||||
description, _ := cmd.Flags().GetString(uploadFlagDescription)
|
description, _ := cmd.Flags().GetString(uploadFlagDescription)
|
||||||
labels, _ := cmd.Flags().GetStringToString(uploadFlagLabels)
|
labels, _ := cmd.Flags().GetStringToString(uploadFlagLabels)
|
||||||
|
|
||||||
options := hcloudimages.UploadOptions{
|
options := hcloudimages.UploadOptions{
|
||||||
ImageCompression: hcloudimages.Compression(imageCompression),
|
ImageCompression: hcloudimages.Compression(imageCompression),
|
||||||
Architecture: hcloud.Architecture(architecture),
|
|
||||||
Description: hcloud.Ptr(description),
|
Description: hcloud.Ptr(description),
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
}
|
}
|
||||||
|
|
@ -69,6 +70,12 @@ This does cost a bit of money for the server.`,
|
||||||
options.ImageReader = imageFile
|
options.ImageReader = imageFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if architecture != "" {
|
||||||
|
options.Architecture = hcloud.Architecture(architecture)
|
||||||
|
} else if serverType != "" {
|
||||||
|
options.ServerType = &hcloud.ServerType{Name: serverType}
|
||||||
|
}
|
||||||
|
|
||||||
image, err := client.Upload(ctx, options)
|
image, err := client.Upload(ctx, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to upload the image: %w", err)
|
return fmt.Errorf("failed to upload the image: %w", err)
|
||||||
|
|
@ -99,7 +106,12 @@ func init() {
|
||||||
uploadFlagArchitecture,
|
uploadFlagArchitecture,
|
||||||
cobra.FixedCompletions([]string{string(hcloud.ArchitectureX86), string(hcloud.ArchitectureARM)}, cobra.ShellCompDirectiveNoFileComp),
|
cobra.FixedCompletions([]string{string(hcloud.ArchitectureX86), string(hcloud.ArchitectureARM)}, cobra.ShellCompDirectiveNoFileComp),
|
||||||
)
|
)
|
||||||
_ = uploadCmd.MarkFlagRequired(uploadFlagArchitecture)
|
|
||||||
|
uploadCmd.Flags().String(uploadFlagServerType, "", "Explicitly use this server type to generate the image. Mutually exclusive with --architecture.")
|
||||||
|
|
||||||
|
// Only one of them needs to be set
|
||||||
|
uploadCmd.MarkFlagsOneRequired(uploadFlagArchitecture, uploadFlagServerType)
|
||||||
|
uploadCmd.MarkFlagsMutuallyExclusive(uploadFlagArchitecture, uploadFlagServerType)
|
||||||
|
|
||||||
uploadCmd.Flags().String(uploadFlagDescription, "", "Description for the resulting image")
|
uploadCmd.Flags().String(uploadFlagDescription, "", "Description for the resulting image")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,17 @@ type UploadOptions struct {
|
||||||
// used with [hcloud.ArchitectureX86] or [hcloud.ArchitectureARM] servers.
|
// used with [hcloud.ArchitectureX86] or [hcloud.ArchitectureARM] servers.
|
||||||
//
|
//
|
||||||
// Internally this decides what server type is used for the temporary server.
|
// Internally this decides what server type is used for the temporary server.
|
||||||
|
//
|
||||||
|
// Optional if [UploadOptions.ServerType] is set.
|
||||||
Architecture hcloud.Architecture
|
Architecture hcloud.Architecture
|
||||||
|
|
||||||
|
// ServerType can be optionally set to override the default server type for the architecture.
|
||||||
|
// Situations where this makes sense:
|
||||||
|
//
|
||||||
|
// - Your image is larger than the root disk of the default server types.
|
||||||
|
// - The default server type is no longer available, or not temporarily out of stock.
|
||||||
|
ServerType *hcloud.ServerType
|
||||||
|
|
||||||
// Description is an optional description that the resulting image (snapshot) will have. There is no way to
|
// Description is an optional description that the resulting image (snapshot) will have. There is no way to
|
||||||
// select images by its description, you should use Labels if you need to identify your image later.
|
// select images by its description, you should use Labels if you need to identify your image later.
|
||||||
Description *string
|
Description *string
|
||||||
|
|
@ -159,9 +168,15 @@ func (s *Client) Upload(ctx context.Context, options UploadOptions) (*hcloud.Ima
|
||||||
|
|
||||||
// 2. Create Server
|
// 2. Create Server
|
||||||
logger.InfoContext(ctx, "# Step 2: Creating Server")
|
logger.InfoContext(ctx, "# Step 2: Creating Server")
|
||||||
serverType, ok := serverTypePerArchitecture[options.Architecture]
|
var serverType *hcloud.ServerType
|
||||||
if !ok {
|
if options.ServerType != nil {
|
||||||
return nil, fmt.Errorf("unknown architecture %q, valid options: %q, %q", options.Architecture, hcloud.ArchitectureX86, hcloud.ArchitectureARM)
|
serverType = options.ServerType
|
||||||
|
} else {
|
||||||
|
var ok bool
|
||||||
|
serverType, ok = serverTypePerArchitecture[options.Architecture]
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("unknown architecture %q, valid options: %q, %q", options.Architecture, hcloud.ArchitectureX86, hcloud.ArchitectureARM)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.DebugContext(ctx, "creating server with config",
|
logger.DebugContext(ctx, "creating server with config",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue