-
-
Notifications
You must be signed in to change notification settings - Fork 103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support GITHUB_TOKEN
for HTTP Requests to github.com
#871
base: main
Are you sure you want to change the base?
Changes from all commits
5970788
9ff8329
c901066
85c70e5
2494df6
5c92533
65b4c92
450a6f2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ import ( | |
"bytes" | ||
"encoding/json" | ||
"fmt" | ||
"net/url" | ||
"os" | ||
"path" | ||
"path/filepath" | ||
|
@@ -15,6 +16,7 @@ import ( | |
"github.com/spf13/viper" | ||
|
||
"github.com/cloudposse/atmos/pkg/schema" | ||
"github.com/cloudposse/atmos/pkg/utils" | ||
u "github.com/cloudposse/atmos/pkg/utils" | ||
"github.com/cloudposse/atmos/pkg/version" | ||
) | ||
|
@@ -100,6 +102,8 @@ func InitCliConfig(configAndStacksInfo schema.ConfigAndStacksInfo, processStacks | |
// system dir (`/usr/local/etc/atmos` on Linux, `%LOCALAPPDATA%/atmos` on Windows) | ||
// home dir (~/.atmos) | ||
// current directory | ||
// ENV var ATMOS_CLI_CONFIG_PATH | ||
// ENV var ATMOS_REMOTE_CONFIG_URL from GITHUB | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This task should not be implementing a new ENV for fetching remote config. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Listener430 lets reduce the scope of this PR. Delete anything that introduces new functionality (like remote atmos configs, new environment variables, etc). |
||
// ENV vars | ||
// Command-line arguments | ||
|
||
|
@@ -200,6 +204,18 @@ func InitCliConfig(configAndStacksInfo schema.ConfigAndStacksInfo, processStacks | |
} | ||
} | ||
|
||
// Process remote config from a GITHUB URL from the path in ENV var `ATMOS_REMOTE_CONFIG_URL` | ||
configFilePath6 := os.Getenv("ATMOS_REMOTE_CONFIG_URL") | ||
if len(configFilePath6) > 0 { | ||
found, err = processRemoteConfigFile(atmosConfig, configFilePath6, v) | ||
if err != nil { | ||
return atmosConfig, err | ||
} | ||
if found { | ||
configFound = true | ||
} | ||
} | ||
|
||
if !configFound { | ||
// If `atmos.yaml` not found, use the default config | ||
// Set `ATMOS_LOGS_LEVEL` ENV var to "Debug" to see the message about Atmos using the default CLI config | ||
|
@@ -383,3 +399,34 @@ func processConfigFile( | |
|
||
return true, nil | ||
} | ||
|
||
// processRemoteConfigFile attempts to download and merge a remote atmos.yaml | ||
// from a URL. It currently only supports GitHub URLs. | ||
Comment on lines
+403
to
+404
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's remove from this PR. We need more requirements before implementing this. |
||
func processRemoteConfigFile( | ||
atmosConfig schema.AtmosConfiguration, | ||
rawURL string, | ||
v *viper.Viper, | ||
) (bool, error) { | ||
parsedURL, err := url.Parse(rawURL) | ||
if err != nil { | ||
u.LogWarning(atmosConfig, fmt.Sprintf("Failed to parse remote config URL '%s': %s", rawURL, err.Error())) | ||
return false, nil | ||
} | ||
|
||
if parsedURL.Scheme != "https" || parsedURL.Host != "github.com" { | ||
return false, nil | ||
} | ||
|
||
data, err := utils.DownloadFileFromGitHub(rawURL) | ||
if err != nil { | ||
u.LogWarning(atmosConfig, fmt.Sprintf("Failed to download remote config from GitHub '%s': %s", rawURL, err.Error())) | ||
return false, nil | ||
} | ||
|
||
err = v.MergeConfig(bytes.NewReader(data)) | ||
if err != nil { | ||
return false, fmt.Errorf("failed to merge remote config from GitHub '%s': %w", rawURL, err) | ||
} | ||
|
||
return true, nil | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -242,3 +242,33 @@ func GetFileNameFromURL(rawURL string) (string, error) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fileName, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// ParseGitHubURL parses a GitHub URL and returns the owner, repo, file path and branch | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func ParseGitHubURL(rawURL string) (owner, repo, filePath, branch string, err error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
u, err := url.Parse(rawURL) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "", "", "", "", fmt.Errorf("invalid URL: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Expected format: https://github.com/owner/repo/blob/branch/path/to/file | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parts := strings.Split(u.Path, "/") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(parts) < 5 || (parts[3] != "blob" && parts[3] != "raw") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "", "", "", "", fmt.Errorf("invalid GitHub URL format") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
owner = parts[1] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
repo = parts[2] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
branch = parts[4] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filePath = strings.Join(parts[5:], "/") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return owner, repo, filePath, branch, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// ParseFilenameFromURL extracts the file name from a URL | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func ParseFilenameFromURL(url string) string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parts := strings.Split(url, "/") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(parts) == 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return parts[len(parts)-1] // e.g. "dev.yaml" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+267
to
+274
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add validation and error handling for robustness. The function should validate input and handle edge cases properly. Consider this more robust implementation: -func ParseFilenameFromURL(url string) string {
+func ParseFilenameFromURL(rawURL string) (string, error) {
+ if rawURL == "" {
+ return "", fmt.Errorf("empty URL provided")
+ }
+
+ parsedURL, err := url.Parse(rawURL)
+ if err != nil {
+ return "", fmt.Errorf("invalid URL: %w", err)
+ }
+
parts := strings.Split(parsedURL.Path, "/")
if len(parts) == 0 {
- return ""
+ return "", fmt.Errorf("URL has no path components: %s", rawURL)
}
- return parts[len(parts)-1] // e.g. "dev.yaml"
+ filename := parts[len(parts)-1]
+ if filename == "" {
+ return "", fmt.Errorf("URL ends with a slash: %s", rawURL)
+ }
+ return filename, nil
} 📝 Committable suggestion
Suggested change
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Delete commented coded