PR-3051: Fix download deploy package out of k8s cluster (#3136)
* Fix download deploy package out of k8s cluster Signed-off-by: LiuXiang <lx1036@126.com> * Fix pkg getdeploy cli command to fetch pkgs stored in storagesvc and remote pkgs Signed-off-by: Md Soharab Ansari <soharab.ansari@infracloud.io> * Instead of Contains, parse url and check path for better validation Signed-off-by: Md Soharab Ansari <soharab.ansari@infracloud.io> --------- Signed-off-by: LiuXiang <lx1036@126.com> Signed-off-by: Md Soharab Ansari <soharab.ansari@infracloud.io> Co-authored-by: LiuXiang <lx1036@126.com>
This commit is contained in:
@@ -165,12 +165,19 @@ func DownloadURL(fileUrl string) (io.ReadCloser, error) {
|
|||||||
|
|
||||||
func DownloadStrorageURL(ctx context.Context, client cmd.Client, fileUrl string) (io.ReadCloser, error) {
|
func DownloadStrorageURL(ctx context.Context, client cmd.Client, fileUrl string) (io.ReadCloser, error) {
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
storagesvcURL, err := util.GetStorageURL(ctx, client)
|
var err error
|
||||||
|
|
||||||
|
valid, err := validArchiveURL(fileUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(fileUrl, storagesvcURL.String()+"/v1/archive?id=") {
|
if valid {
|
||||||
|
storagesvcURL, err := util.GetStorageURL(ctx, client)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
url, err := url.Parse(fileUrl)
|
url, err := url.Parse(fileUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -229,3 +236,28 @@ func PrintPackageSummary(writer io.Writer, pkg *fv1.Package) {
|
|||||||
fmt.Fprintf(w, "%v\n%v", "Build Logs:", buildlog)
|
fmt.Fprintf(w, "%v\n%v", "Build Logs:", buildlog)
|
||||||
w.Flush()
|
w.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validArchiveURL checks if the given URL is a valid archive URL
|
||||||
|
func validArchiveURL(urlStr string) (bool, error) {
|
||||||
|
// Parse the URL string into a URL object
|
||||||
|
parsedURL, err := url.Parse(urlStr)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to parse URL: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the path starts with /v1/archive
|
||||||
|
if !strings.HasPrefix(parsedURL.Path, "/v1/archive") {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get query parameters
|
||||||
|
queryParams := parsedURL.Query()
|
||||||
|
|
||||||
|
// Check if 'id' parameter exists
|
||||||
|
if queryParams.Get("id") == "" {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL matches all criteria
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,3 +32,35 @@ func TestPrintPackageSummary(t *testing.T) {
|
|||||||
t.Errorf("PrintPackageBuildLog() = %v, want %v", gotWriter, expected)
|
t.Errorf("PrintPackageBuildLog() = %v, want %v", gotWriter, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidArchiveURL(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
url string
|
||||||
|
expected bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Valid Archive URL",
|
||||||
|
url: "http://storagesvc.fission/v1/archive?id=/fission/fission-functions/Fc4c15f47-bb49-47c5-b382-526a6539841d",
|
||||||
|
expected: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Invalid Archive URL",
|
||||||
|
url: "https://raw.githubusercontent.com/imaginery/training/refs/heads/fission/hello-go?token=ABCD",
|
||||||
|
expected: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := validArchiveURL(tt.url)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("got error %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got != tt.expected {
|
||||||
|
t.Errorf("expected %t got %t", got, tt.expected)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user