mirror of
https://github.com/kubevela/kubevela.git
synced 2026-03-05 11:11:28 +00:00
* Feat: addon service impl * get addon from git/configmap * add ListAddonRegistries * add GetAddonModel * add CreateAddonRegistry and bcode/addon.go * add applyAddonData * update * Fix: getAddonFromGit * Fix: getAddonFromGit, remove trailing .git * add comment * add enable/disable/status impl * add deleteAddonRegistry and check dup addon * read addon without accessing database * change to query parameter, add addon detail * Feat: add addon readme for apiserver * Make enable/disable/status runnable * chore: fix bcode * Fix: refactor parse to util * Fix: refactor addonutil to pkg * add addon test for create and delete addon registry * fix version prefix * add post func * add enable/disable test * add provider aws readme * done testing * fix comment and refactor statusAddon * move enable/disable logic to usecase * add GITHUB_TOKEN env * Fix: Add github token support and use it in test * add license Co-authored-by: qiaozp <chivalry.pp@gmail.com>
121 lines
2.6 KiB
Go
121 lines
2.6 KiB
Go
package utils
|
|
|
|
import (
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// TypeLocal represents github
|
|
const TypeLocal = "local"
|
|
|
|
// TypeOss represent oss
|
|
const TypeOss = "oss"
|
|
|
|
// TypeGithub represents github
|
|
const TypeGithub = "github"
|
|
|
|
// TypeUnknown represents parse failed
|
|
const TypeUnknown = "unknown"
|
|
|
|
// Content contains different type of content needed when building Registry
|
|
type Content struct {
|
|
OssContent
|
|
GithubContent
|
|
LocalContent
|
|
}
|
|
|
|
// LocalContent for local registry
|
|
type LocalContent struct {
|
|
AbsDir string `json:"abs_dir"`
|
|
}
|
|
|
|
// OssContent for oss registry
|
|
type OssContent struct {
|
|
BucketURL string `json:"bucket_url"`
|
|
}
|
|
|
|
// GithubContent for cap center
|
|
type GithubContent struct {
|
|
Owner string `json:"owner"`
|
|
Repo string `json:"repo"`
|
|
Path string `json:"path"`
|
|
Ref string `json:"ref"`
|
|
}
|
|
|
|
// Parse will parse config from address
|
|
func Parse(addr string) (string, *Content, error) {
|
|
URL, err := url.Parse(addr)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
l := strings.Split(strings.TrimPrefix(URL.Path, "/"), "/")
|
|
switch URL.Scheme {
|
|
case "http", "https":
|
|
switch URL.Host {
|
|
case "github.com":
|
|
// We support two valid format:
|
|
// 1. https://github.com/<owner>/<repo>/tree/<branch>/<path-to-dir>
|
|
// 2. https://github.com/<owner>/<repo>/<path-to-dir>
|
|
if len(l) < 3 {
|
|
return "", nil, errors.New("invalid format " + addr)
|
|
}
|
|
if l[2] == "tree" {
|
|
// https://github.com/<owner>/<repo>/tree/<branch>/<path-to-dir>
|
|
if len(l) < 5 {
|
|
return "", nil, errors.New("invalid format " + addr)
|
|
}
|
|
return TypeGithub, &Content{
|
|
GithubContent: GithubContent{
|
|
Owner: l[0],
|
|
Repo: l[1],
|
|
Path: strings.Join(l[4:], "/"),
|
|
Ref: l[3],
|
|
},
|
|
}, nil
|
|
}
|
|
// https://github.com/<owner>/<repo>/<path-to-dir>
|
|
return TypeGithub, &Content{
|
|
GithubContent: GithubContent{
|
|
Owner: l[0],
|
|
Repo: l[1],
|
|
Path: strings.Join(l[2:], "/"),
|
|
Ref: "", // use default branch
|
|
},
|
|
},
|
|
nil
|
|
case "api.github.com":
|
|
if len(l) != 5 {
|
|
return "", nil, errors.New("invalid format " + addr)
|
|
}
|
|
//https://api.github.com/repos/<owner>/<repo>/contents/<path-to-dir>
|
|
return TypeGithub, &Content{
|
|
GithubContent: GithubContent{
|
|
Owner: l[1],
|
|
Repo: l[2],
|
|
Path: l[4],
|
|
Ref: URL.Query().Get("ref"),
|
|
},
|
|
},
|
|
nil
|
|
default:
|
|
}
|
|
case "oss":
|
|
return TypeOss, &Content{
|
|
OssContent: OssContent{
|
|
BucketURL: URL.Host,
|
|
},
|
|
}, nil
|
|
case "file":
|
|
return TypeLocal, &Content{
|
|
LocalContent: LocalContent{
|
|
AbsDir: URL.Path,
|
|
},
|
|
}, nil
|
|
|
|
}
|
|
|
|
return TypeUnknown, nil, nil
|
|
}
|