Skip to content

Commit

Permalink
Extensions: Adds extensions package (#4718)
Browse files Browse the repository at this point in the history
Adds the core components for the azd management plane of azd extensions.
  • Loading branch information
wbreza authored Jan 28, 2025
1 parent 2e4db61 commit 3c97bdd
Show file tree
Hide file tree
Showing 13 changed files with 1,638 additions and 0 deletions.
16 changes: 16 additions & 0 deletions cli/azd/pkg/extensions/extension.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package extensions

// Extension represents an installed extension.
type Extension struct {
Id string `json:"id"`
Namespace string `json:"namespace"`
DisplayName string `json:"displayName"`
Description string `json:"description"`
Version string `json:"version"`
Usage string `json:"usage"`
Path string `json:"path"`
Source string `json:"source"`
}
68 changes: 68 additions & 0 deletions cli/azd/pkg/extensions/file_source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package extensions

import (
"fmt"
"os"
"path/filepath"

"github.com/azure/azure-dev/cli/azd/pkg/config"
)

// newFileSource creates a new file base registry source.
func newFileSource(name string, path string) (Source, error) {
absolutePath, err := getAbsolutePath(path)
if err != nil {
return nil, fmt.Errorf("failed converting path '%s' to absolute path, %w", path, err)
}

registryBytes, err := os.ReadFile(absolutePath)
if err != nil {
return nil, fmt.Errorf("failed reading file '%s', %w", path, err)
}

return newJsonSource(name, string(registryBytes))
}

// getAbsolutePath converts a relative path to an absolute path.
func getAbsolutePath(filePath string) (string, error) {
// Check if the path is absolute
if filepath.IsAbs(filePath) {
return filePath, nil
}

roots := []string{}

// Get the current working directory
cwd, err := os.Getwd()
if err != nil {
return "", err
}

azdConfigPath, err := config.GetUserConfigDir()
if err != nil {
return "", err
}

roots = append(roots, cwd)
roots = append(roots, azdConfigPath)

for _, root := range roots {
// Join the root directory with the relative path
absolutePath := filepath.Join(root, filePath)

// Normalize the path to handle any ".." or "." segments
absolutePath, err = filepath.Abs(absolutePath)
if err != nil {
return "", err
}

if _, err := os.Stat(absolutePath); err == nil {
return absolutePath, nil
}
}

return "", fmt.Errorf("file '%s' was not found, %w", filePath, os.ErrNotExist)
}
20 changes: 20 additions & 0 deletions cli/azd/pkg/extensions/json_source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package extensions

import (
"encoding/json"
"fmt"
)

// newJsonSource creates a new JSON base registry source.
func newJsonSource(name string, jsonRegistry string) (Source, error) {
var registry *Registry
err := json.Unmarshal([]byte(jsonRegistry), &registry)
if err != nil {
return nil, fmt.Errorf("unable to unmarshal extensions JSON %w", err)
}

return newRegistrySource(name, registry)
}
Loading

0 comments on commit 3c97bdd

Please sign in to comment.