diff --git a/cmd/climc/shell/k8s/k8s.go b/cmd/climc/shell/k8s/k8s.go index dea37f1e5a..d7c5757031 100644 --- a/cmd/climc/shell/k8s/k8s.go +++ b/cmd/climc/shell/k8s/k8s.go @@ -22,6 +22,7 @@ func init() { initRepo() initChart() initRelease() + initReleaseApps() // kubernetes original resources initRaw() diff --git a/cmd/climc/shell/k8s/releaseapps.go b/cmd/climc/shell/k8s/releaseapps.go new file mode 100644 index 0000000000..0406189027 --- /dev/null +++ b/cmd/climc/shell/k8s/releaseapps.go @@ -0,0 +1,27 @@ +package k8s + +import ( + "fmt" + + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/mcclient/modules/k8s" + o "yunion.io/x/onecloud/pkg/mcclient/options/k8s" +) + +func initReleaseApps() { + cmdN := func(app string) string { + return resourceCmdN(fmt.Sprintf("app-%s", app), "create") + } + R(&o.AppCreateOptions{}, cmdN("meter"), "Create yunion meter helm release", func(s *mcclient.ClientSession, args *o.AppCreateOptions) error { + params, err := args.Params() + if err != nil { + return err + } + ret, err := k8s.MeterReleaseApps.Create(s, params) + if err != nil { + return err + } + printObject(ret) + return nil + }) +} diff --git a/cmd/climc/shell/k8s/repos.go b/cmd/climc/shell/k8s/repos.go index c423e69712..5744130ccb 100644 --- a/cmd/climc/shell/k8s/repos.go +++ b/cmd/climc/shell/k8s/repos.go @@ -58,4 +58,13 @@ func initRepo() { printObject(repo) return nil }) + + R(&o.RepoGetOptions{}, cmdN("sync"), "Sync a repository", func(s *mcclient.ClientSession, args *o.RepoGetOptions) error { + repo, err := k8s.Repos.PerformAction(s, args.NAME, "sync", nil) + if err != nil { + return err + } + printObject(repo) + return nil + }) } diff --git a/pkg/mcclient/modules/k8s/helm_release.go b/pkg/mcclient/modules/k8s/helm_release.go index 0df6b7fba4..f4efabcbff 100644 --- a/pkg/mcclient/modules/k8s/helm_release.go +++ b/pkg/mcclient/modules/k8s/helm_release.go @@ -1,19 +1,41 @@ package k8s import ( + "yunion.io/x/jsonutils" + + "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/modules" ) var ( - Releases *ReleaseManager + Releases *ReleaseManager + MeterReleaseApps *ReleaseAppManager + dummyReleaseApps *ReleaseAppManager ) type ReleaseManager struct { *NamespaceResourceManager } +type ReleaseAppManager struct { + *NamespaceResourceManager +} + +func NewReleaseAppManager(keyword, keywordPlural string) *ReleaseAppManager { + return &ReleaseAppManager{ + NamespaceResourceManager: NewNamespaceResourceManager(keyword, keywordPlural, NewColumns(), NewColumns()), + } +} + +func (m *ReleaseAppManager) Create(session *mcclient.ClientSession, params jsonutils.JSONObject) (jsonutils.JSONObject, error) { + return m.CreateInContext(session, params, dummyReleaseApps, "") +} + func init() { Releases = &ReleaseManager{ NewNamespaceResourceManager("release", "releases", NewColumns(), NewColumns())} + dummyReleaseApps = NewReleaseAppManager("releaseapp", "releaseapps") + MeterReleaseApps = NewReleaseAppManager("app_meter", "app_meters") modules.Register(Releases) + modules.Register(MeterReleaseApps) } diff --git a/pkg/mcclient/options/k8s/release.go b/pkg/mcclient/options/k8s/release.go index a63bc601cc..d6714a8216 100644 --- a/pkg/mcclient/options/k8s/release.go +++ b/pkg/mcclient/options/k8s/release.go @@ -85,22 +85,16 @@ func (o ReleaseCreateUpdateOptions) Params() (*jsonutils.JSONDict, error) { } type ReleaseCreateOptions struct { - NamespaceWithClusterOptions - ReleaseCreateUpdateOptions - Name string `help:"Release name, If unspecified, it will autogenerate one for you"` + AppBaseCreateOptions CHARTNAME string `help:"Helm chart name, e.g stable/etcd"` } func (o ReleaseCreateOptions) Params() (*jsonutils.JSONDict, error) { - params, err := o.ReleaseCreateUpdateOptions.Params() + params, err := o.AppBaseCreateOptions.Params() if err != nil { return nil, err } - params.Update(o.NamespaceWithClusterOptions.Params()) params.Add(jsonutils.NewString(o.CHARTNAME), "chart_name") - if o.Name != "" { - params.Add(jsonutils.NewString(o.Name), "release_name") - } return params, nil } diff --git a/pkg/mcclient/options/k8s/releaseapp.go b/pkg/mcclient/options/k8s/releaseapp.go new file mode 100644 index 0000000000..1c7882a324 --- /dev/null +++ b/pkg/mcclient/options/k8s/releaseapp.go @@ -0,0 +1,37 @@ +package k8s + +import ( + "yunion.io/x/jsonutils" +) + +type AppBaseCreateOptions struct { + NamespaceWithClusterOptions + ReleaseCreateUpdateOptions + Name string `help:"Release name, If unspecified, it will autogenerate one for you"` +} + +func (o AppBaseCreateOptions) Params() (*jsonutils.JSONDict, error) { + params, err := o.ReleaseCreateUpdateOptions.Params() + if err != nil { + return nil, err + } + params.Update(o.NamespaceWithClusterOptions.Params()) + if o.Name != "" { + params.Add(jsonutils.NewString(o.Name), "release_name") + } + return params, nil +} + +type AppCreateOptions struct { + AppBaseCreateOptions + CHARTNAME string `help:"Helm release app chart name, e.g yunion/meter"` +} + +func (o AppCreateOptions) Params() (*jsonutils.JSONDict, error) { + params, err := o.AppBaseCreateOptions.Params() + if err != nil { + return nil, err + } + params.Add(jsonutils.NewString(o.CHARTNAME), "chart_name") + return params, nil +}