Skip to content
This repository has been archived by the owner on Jul 13, 2021. It is now read-only.

Commit

Permalink
support oamctl trait-list
Browse files Browse the repository at this point in the history
  • Loading branch information
wonderflow committed Nov 14, 2019
1 parent 50cde72 commit 73faebb
Show file tree
Hide file tree
Showing 8 changed files with 256 additions and 11 deletions.
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 [email protected]:oam-dev/oamctl.git
```

### Build the binary

Run the following command to install _oamctl_

```
Expand All @@ -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.
27 changes: 27 additions & 0 deletions pkg/apis/core.oam.dev/v1alpha1/register.go
Original file line number Diff line number Diff line change
@@ -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
}
91 changes: 91 additions & 0 deletions pkg/apis/core.oam.dev/v1alpha1/traits.deepcopy.go
Original file line number Diff line number Diff line change
@@ -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
}
29 changes: 29 additions & 0 deletions pkg/apis/core.oam.dev/v1alpha1/traits_types.go
Original file line number Diff line number Diff line change
@@ -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"`
}
2 changes: 1 addition & 1 deletion pkg/convert/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion pkg/convert/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
18 changes: 9 additions & 9 deletions pkg/convert/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down
82 changes: 82 additions & 0 deletions pkg/convert/trait_list.go
Original file line number Diff line number Diff line change
@@ -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 ""
}

0 comments on commit 73faebb

Please sign in to comment.