Skip to content

Commit 736602f

Browse files
amirejazdmjb
andauthored
use default naming for workloads when name is not provided (#1864)
When we do not provide the workload name it is unable to verify whether the workload already exists causing re running the same workload. This change make sure we use the default consistent naming and even if the name is not provided we can check whether the workload is already running. Co-authored-by: Don Browne <[email protected]>
1 parent 5dffcba commit 736602f

File tree

3 files changed

+55
-16
lines changed

3 files changed

+55
-16
lines changed

cmd/thv/app/run.go

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,16 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
183183
return fmt.Errorf("failed to create workload manager: %v", err)
184184
}
185185

186-
if runFlags.Name != "" {
187-
exists, err := workloadManager.DoesWorkloadExist(ctx, runFlags.Name)
188-
if err != nil {
189-
return fmt.Errorf("failed to check if workload exists: %v", err)
190-
}
191-
if exists {
192-
return fmt.Errorf("workload with name '%s' already exists", runFlags.Name)
193-
}
186+
if runFlags.Name == "" {
187+
runFlags.Name = getworkloadDefaultName(serverOrImage)
188+
logger.Infof("No workload name specified, using generated name: %s", runFlags.Name)
189+
}
190+
exists, err := workloadManager.DoesWorkloadExist(ctx, runFlags.Name)
191+
if err != nil {
192+
return fmt.Errorf("failed to check if workload exists: %v", err)
193+
}
194+
if exists {
195+
return fmt.Errorf("workload with name '%s' already exists", runFlags.Name)
194196
}
195197
err = validateGroup(ctx, workloadManager, serverOrImage)
196198
if err != nil {
@@ -238,6 +240,43 @@ func deriveRemoteName(remoteURL string) (string, error) {
238240
return hostname, nil
239241
}
240242

243+
// getworkloadDefaultName generates a default workload name based on the serverOrImage input
244+
// This function reuses the existing system's naming logic to ensure consistency
245+
func getworkloadDefaultName(serverOrImage string) string {
246+
// If it's a protocol scheme (uvx://, npx://, go://)
247+
if runner.IsImageProtocolScheme(serverOrImage) {
248+
// Extract package name from protocol scheme using the existing parseProtocolScheme logic
249+
_, packageName, err := runner.ParseProtocolScheme(serverOrImage)
250+
if err != nil {
251+
return ""
252+
}
253+
254+
// Use the existing packageNameToImageName function from the runner package
255+
return runner.PackageNameToImageName(packageName)
256+
}
257+
258+
// If it's a URL (remote server)
259+
if networking.IsURL(serverOrImage) {
260+
name, err := deriveRemoteName(serverOrImage)
261+
if err != nil {
262+
return ""
263+
}
264+
return name
265+
}
266+
267+
// Check if it's a server name from registry
268+
// Registry server names are typically multi-word names with hyphens
269+
if !strings.Contains(serverOrImage, "://") && !strings.Contains(serverOrImage, "/") && !strings.Contains(serverOrImage, ":") {
270+
// Likely a registry server name (no protocol, no slashes, no colons), return as-is
271+
return serverOrImage
272+
}
273+
274+
// For container images, use the existing container.GetOrGenerateContainerName logic
275+
// We pass empty string as containerName to force generation, and extract the baseName
276+
_, baseName := container.GetOrGenerateContainerName("", serverOrImage)
277+
return baseName
278+
}
279+
241280
func runForeground(ctx context.Context, workloadManager workloads.Manager, runnerConfig *runner.RunConfig) error {
242281
ctx, cancel := context.WithCancel(ctx)
243282
defer cancel()

pkg/runner/protocol.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func BuildFromProtocolSchemeWithName(
4848
imageName string,
4949
dryRun bool,
5050
) (string, error) {
51-
transportType, packageName, err := parseProtocolScheme(serverOrImage)
51+
transportType, packageName, err := ParseProtocolScheme(serverOrImage)
5252
if err != nil {
5353
return "", err
5454
}
@@ -70,8 +70,8 @@ func BuildFromProtocolSchemeWithName(
7070
return buildImageFromTemplateWithName(ctx, imageManager, transportType, packageName, templateData, imageName)
7171
}
7272

73-
// parseProtocolScheme extracts the transport type and package name from the protocol scheme.
74-
func parseProtocolScheme(serverOrImage string) (templates.TransportType, string, error) {
73+
// ParseProtocolScheme extracts the transport type and package name from the protocol scheme.
74+
func ParseProtocolScheme(serverOrImage string) (templates.TransportType, string, error) {
7575
if strings.HasPrefix(serverOrImage, UVXScheme) {
7676
return templates.TransportTypeUVX, strings.TrimPrefix(serverOrImage, UVXScheme), nil
7777
}
@@ -266,7 +266,7 @@ func generateImageName(transportType templates.TransportType, packageName string
266266
tag := time.Now().Format("20060102150405")
267267
return strings.ToLower(fmt.Sprintf("toolhivelocal/%s-%s:%s",
268268
string(transportType),
269-
packageNameToImageName(packageName),
269+
PackageNameToImageName(packageName),
270270
tag))
271271
}
272272

@@ -335,10 +335,10 @@ func buildImageFromTemplateWithName(
335335
return finalImageName, nil
336336
}
337337

338-
// Replace slashes with dashes to create a valid Docker image name. If there
338+
// PackageNameToImageName replaces slashes with dashes to create a valid Docker image name. If there
339339
// is a version in the package name, the @ is replaced with a dash.
340340
// For local paths, we clean up the path to make it a valid image name.
341-
func packageNameToImageName(packageName string) string {
341+
func PackageNameToImageName(packageName string) string {
342342
imageName := packageName
343343

344344
// Handle local paths by cleaning them up

pkg/runner/protocol_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ func TestPackageNameToImageName(t *testing.T) {
113113
for _, tt := range tests {
114114
t.Run(tt.name, func(t *testing.T) {
115115
t.Parallel()
116-
result := packageNameToImageName(tt.input)
116+
result := PackageNameToImageName(tt.input)
117117
if result != tt.expected {
118-
t.Errorf("packageNameToImageName(%q) = %q, want %q", tt.input, result, tt.expected)
118+
t.Errorf("PackageNameToImageName(%q) = %q, want %q", tt.input, result, tt.expected)
119119
}
120120
})
121121
}

0 commit comments

Comments
 (0)