From 73faebb202b6bf67e0f44ea73b1a510ba00896c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E5=85=83?= Date: Thu, 14 Nov 2019 17:09:21 +0800 Subject: [PATCH] support oamctl trait-list --- README.md | 16 ++++ pkg/apis/core.oam.dev/v1alpha1/register.go | 27 ++++++ .../core.oam.dev/v1alpha1/traits.deepcopy.go | 91 +++++++++++++++++++ .../core.oam.dev/v1alpha1/traits_types.go | 29 ++++++ pkg/convert/migrate.go | 2 +- pkg/convert/migrate_test.go | 2 +- pkg/convert/root.go | 18 ++-- pkg/convert/trait_list.go | 82 +++++++++++++++++ 8 files changed, 256 insertions(+), 11 deletions(-) create mode 100644 pkg/apis/core.oam.dev/v1alpha1/register.go create mode 100644 pkg/apis/core.oam.dev/v1alpha1/traits.deepcopy.go create mode 100644 pkg/apis/core.oam.dev/v1alpha1/traits_types.go create mode 100644 pkg/convert/trait_list.go diff --git a/README.md b/README.md index 277b740..5778c52 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,16 @@ oamctl is a tiny tool help oam user manage oam app. ## Install +### Download the repo + +```shell script +$ mkdir -p ${GOPATH}/src/github.com/oam-dev/ +$ cd ${GOPATH}/src/github.com/oam-dev/ +$ git clone git@github.com:oam-dev/oamctl.git +``` + +### Build the binary + Run the following command to install _oamctl_ ``` @@ -15,3 +25,9 @@ go install ## Usage ### [oamctl migrate](docs/migrate.md) + +This command can create oam ApplicationConfiguration yaml from exist k8s resource + +### Trait-list + +This command will list trait with version and workload type that could be applied. \ No newline at end of file diff --git a/pkg/apis/core.oam.dev/v1alpha1/register.go b/pkg/apis/core.oam.dev/v1alpha1/register.go new file mode 100644 index 0000000..ae0f9b7 --- /dev/null +++ b/pkg/apis/core.oam.dev/v1alpha1/register.go @@ -0,0 +1,27 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const GroupName = "core.oam.dev" +const GroupVersion = "v1alpha1" + +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: GroupVersion} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &Trait{}, + &TraitList{}, + ) + + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/apis/core.oam.dev/v1alpha1/traits.deepcopy.go b/pkg/apis/core.oam.dev/v1alpha1/traits.deepcopy.go new file mode 100644 index 0000000..40857e5 --- /dev/null +++ b/pkg/apis/core.oam.dev/v1alpha1/traits.deepcopy.go @@ -0,0 +1,91 @@ +package v1alpha1 + +import "k8s.io/apimachinery/pkg/runtime" + +func (in *Trait) DeepCopyInto(out *Trait) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +func (in *Trait) DeepCopy() *Trait { + if in == nil { + return nil + } + out := new(Trait) + in.DeepCopyInto(out) + return out +} + +func (in *Trait) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +func (in *TraitList) DeepCopyInto(out *TraitList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Trait, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +func (in *TraitList) DeepCopy() *TraitList { + if in == nil { + return nil + } + out := new(TraitList) + in.DeepCopyInto(out) + return out +} + +func (in *TraitList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +func (in *TraitSpec) DeepCopyInto(out *TraitSpec) { + *out = *in + if in.AppliesTo != nil { + in, out := &in.AppliesTo, &out.AppliesTo + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +func (in *TraitSpec) DeepCopy() *TraitSpec { + if in == nil { + return nil + } + out := new(TraitSpec) + in.DeepCopyInto(out) + return out +} + +func (in *TraitStatus) DeepCopyInto(out *TraitStatus) { + *out = *in + return +} + +func (in *TraitStatus) DeepCopy() *TraitStatus { + if in == nil { + return nil + } + out := new(TraitStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/core.oam.dev/v1alpha1/traits_types.go b/pkg/apis/core.oam.dev/v1alpha1/traits_types.go new file mode 100644 index 0000000..b4f178e --- /dev/null +++ b/pkg/apis/core.oam.dev/v1alpha1/traits_types.go @@ -0,0 +1,29 @@ +package v1alpha1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +type TraitSpec struct { + AppliesTo []string `json:"appliesTo"` + Properties string `json:"properties"` +} + +type TraitStatus struct { +} + +// +genclient + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type Trait struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec TraitSpec `json:"spec,omitempty"` + Status TraitStatus `json:"status,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type TraitList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Trait `json:"items"` +} diff --git a/pkg/convert/migrate.go b/pkg/convert/migrate.go index ef1beb2..af41936 100644 --- a/pkg/convert/migrate.go +++ b/pkg/convert/migrate.go @@ -6,8 +6,8 @@ import ( "github.com/sirupsen/logrus" - "github.com/spf13/cobra" "github.com/oam-dev/oamctl/pkg/util" + "github.com/spf13/cobra" v1 "k8s.io/api/apps/v1" v12 "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" diff --git a/pkg/convert/migrate_test.go b/pkg/convert/migrate_test.go index fe2403d..5bf548e 100644 --- a/pkg/convert/migrate_test.go +++ b/pkg/convert/migrate_test.go @@ -8,8 +8,8 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" - "github.com/stretchr/testify/assert" "github.com/oam-dev/oamctl/pkg/util" + "github.com/stretchr/testify/assert" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" diff --git a/pkg/convert/root.go b/pkg/convert/root.go index fff898b..3e86c1e 100644 --- a/pkg/convert/root.go +++ b/pkg/convert/root.go @@ -20,10 +20,10 @@ import ( ) var ( - cfgFile string - nameSpace string - scheme = runtime.NewScheme() - mgr ctrl.Manager + cfgFile string + nameSpace string + runtimeScheme = runtime.NewScheme() + mgr ctrl.Manager ) // rootCmd represents the base command when called without any subcommands @@ -46,14 +46,14 @@ func Execute() { } func init() { - _ = appsv1.AddToScheme(scheme) - _ = v1beta1.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - _ = v2beta2.AddToScheme(scheme) + _ = appsv1.AddToScheme(runtimeScheme) + _ = v1beta1.AddToScheme(runtimeScheme) + _ = corev1.AddToScheme(runtimeScheme) + _ = v2beta2.AddToScheme(runtimeScheme) var metricsAddr string flag.StringVar(&metricsAddr, "metrics-addr", ":52014", "The address the metric endpoint binds to.") flag.Parse() - m, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme, MetricsBindAddress: metricsAddr}) + m, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: runtimeScheme, MetricsBindAddress: metricsAddr}) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/pkg/convert/trait_list.go b/pkg/convert/trait_list.go new file mode 100644 index 0000000..11608b4 --- /dev/null +++ b/pkg/convert/trait_list.go @@ -0,0 +1,82 @@ +package convert + +import ( + "fmt" + "os" + "strings" + "text/tabwriter" + + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/oam-dev/oamctl/pkg/apis/core.oam.dev/v1alpha1" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + + "sigs.k8s.io/controller-runtime/pkg/client/config" + + "github.com/spf13/cobra" +) + +// migrateCmd represents the create command +var listCmd = &cobra.Command{ + Use: "trait-list", + Short: "list all oam traits from k8s clusters", + Long: `list all oam traits from k8s clusters, with name, version and PRIMITIVES`, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println(listTraits(args)) + }, +} + +func init() { + rootCmd.AddCommand(listCmd) + // Here you will define your flags and configuration settings. + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // migrateCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: +} + +func listTraits(args []string) string { + cfg, err := config.GetConfig() + if err != nil { + fmt.Println(err) + return "" + } + v1alpha1.AddToScheme(scheme.Scheme) + crdConfig := *cfg + crdConfig.ContentConfig.GroupVersion = &schema.GroupVersion{Group: v1alpha1.GroupName, Version: v1alpha1.GroupVersion} + crdConfig.APIPath = "/apis" + crdConfig.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + crdConfig.UserAgent = rest.DefaultKubernetesUserAgent() + traitsClient, err := rest.UnversionedRESTClientFor(&crdConfig) + if err != nil { + fmt.Println(err) + return "" + } + traitsList := &v1alpha1.TraitList{} + err = traitsClient.Get().Resource("traits").Do().Into(traitsList) + if err != nil { + fmt.Println(err) + return "" + } + if len(traitsList.Items) < 1 { + return "no traits found" + } + + // initialize tabwriter + w := new(tabwriter.Writer) + + // minwidth, tabwidth, padding, padchar, flags + w.Init(os.Stdout, 8, 8, 0, '\t', tabwriter.DiscardEmptyColumns) + defer w.Flush() + fmt.Fprintf(w, "%s\t%s\t%s\t", "NAME", "VERSION", "PRIMITIVES") + fmt.Fprintf(w, "\n%s\t%s\t%s\t", "--------", "-------", "----------") + + for _, v := range traitsList.Items { + fmt.Fprintf(w, "\n%s\t%s\t%s\t", v.Name, v.Annotations["version"], strings.Join(v.Spec.AppliesTo, ", ")) + } + return "" +}