Skip to content

Commit

Permalink
feat: get/list proposal(#26)
Browse files Browse the repository at this point in the history
  • Loading branch information
dayuy committed May 25, 2023
1 parent e68e625 commit 19beae4
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 5 deletions.
3 changes: 2 additions & 1 deletion cmd/bc-cli/get/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package get

import (
"github.com/bestchains/bc-cli/pkg/federation"
"github.com/bestchains/bc-cli/pkg/proposal"
"os"

"github.com/bestchains/bc-cli/pkg/account"
Expand All @@ -42,7 +43,7 @@ func NewGetCmd() *cobra.Command {
//cmd.AddCommand(chaincodebuild.NewCCBGetCmd(common.Options{IOStreams: genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}}))
//cmd.AddCommand(channel.NewChanGetCmd(common.Options{IOStreams: genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}}))
//cmd.AddCommand(vote.NewVoteGetCmd(common.Options{IOStreams: genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}}))
//cmd.AddCommand(proposal.NewProposalGetCmd(common.Options{IOStreams: genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}}))
cmd.AddCommand(proposal.NewProposalGetCmd(common.Options{IOStreams: genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}}))
//cmd.AddCommand(policy.NewPolicyGetCmd(common.Options{IOStreams: genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}}))
return cmd
}
2 changes: 2 additions & 0 deletions pkg/common/ibp.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ const (
UserResource = "users"
Channel = "channels"
Configmap = "configmaps"
Proposal = "proposals"
Vote = "votes"
)

func InKubeGetter() (*clientcmdapi.Config, error) {
Expand Down
108 changes: 104 additions & 4 deletions pkg/proposal/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,116 @@ limitations under the License.
package proposal

import (
"github.com/bestchains/bc-cli/pkg/common"
"context"
"encoding/json"
"fmt"

"github.com/spf13/cobra"
"github.com/spf13/viper"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/kubectl/pkg/cmd/get"

"github.com/bestchains/bc-cli/pkg/common"
"github.com/bestchains/bc-cli/pkg/utils"
)

func NewProposalGetCmd(option common.Options) *cobra.Command {
defaultPrintFlag := get.NewGetPrintFlags()
cmd := &cobra.Command{
Use: "",
RunE: func(cmd *cobra.Command, args []string) error {
return nil
Use: "proposal [NAME]",
Run: func(cmd *cobra.Command, args []string) {
cfg, err := clientcmd.BuildConfigFromKubeconfigGetter("", common.InKubeGetter)
if err != nil {
fmt.Fprintln(option.ErrOut, err)
return
}
cli, err := dynamic.NewForConfig(cfg)
if err != nil {
fmt.Fprintln(option.ErrOut, err)
return
}

list := corev1.List{
TypeMeta: v1.TypeMeta{
Kind: "List",
APIVersion: "v1",
},
ListMeta: v1.ListMeta{},
}
var obj runtime.Object
if len(args) == 0 {
username := viper.GetString("auth.username")
organizations, err := cli.Resource(schema.GroupVersionResource{Group: common.IBPGroup, Version: common.IBPVersion, Resource: common.OrganizationResource}).List(context.TODO(), v1.ListOptions{
LabelSelector: fmt.Sprintf("bestchains.organization.admin=%s", username),
})
if err != nil {
fmt.Fprintln(option.ErrOut, err)
return
}
var proposalNames []string
for _, org := range organizations.Items {
namespace := org.GetName()
votes, err := cli.Resource(schema.GroupVersionResource{Group: common.IBPGroup, Version: common.IBPVersion, Resource: common.Vote}).Namespace(namespace).List(context.TODO(), v1.ListOptions{})
if err != nil {
fmt.Fprintln(option.ErrOut, err)
continue
}
for _, vote := range votes.Items {
proposalName := utils.GetNestedString(vote.Object, "spec", "proposalName")
proposalNames = append(proposalNames, proposalName)
}
}
for _, proposalName := range utils.RemoveDuplicateForStringSlice(proposalNames) {
proposal, err := cli.Resource(schema.GroupVersionResource{Group: common.IBPGroup, Version: common.IBPVersion, Resource: common.Proposal}).Get(context.TODO(), proposalName, v1.GetOptions{})
if err != nil {
fmt.Fprintln(option.ErrOut, err)
continue
}
list.Items = append(list.Items, runtime.RawExtension{Object: proposal})
}
} else {
for _, arg := range args {
proposal, err := cli.Resource(schema.GroupVersionResource{Group: common.IBPGroup, Version: common.IBPVersion, Resource: common.Proposal}).Get(context.TODO(), arg, v1.GetOptions{})
if err != nil {
fmt.Fprintln(option.ErrOut, err)
continue
}
list.Items = append(list.Items, runtime.RawExtension{Object: proposal})
}
}

if len(list.Items) != 1 {
listData, err := json.Marshal(list)
if err != nil {
fmt.Fprintln(option.ErrOut, err)
return
}
converted, err := runtime.Decode(unstructured.UnstructuredJSONScheme, listData)
if err != nil {
fmt.Fprintln(option.ErrOut, err)
return
}
obj = converted
} else {
obj = list.Items[0].Object
}

p, err := defaultPrintFlag.ToPrinter()
if err != nil {
fmt.Fprintln(option.ErrOut, err)
return
}
p.PrintObj(obj, option.Out)
return
},
}
defaultPrintFlag.AddFlags(cmd)

return cmd
}
23 changes: 23 additions & 0 deletions pkg/utils/tools.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package utils

import "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

// GetNestedString returns the string value of a nested field.
// Returns "" if value is not found or not a string.
func GetNestedString(obj map[string]interface{}, fields ...string) string {
val, _, _ := unstructured.NestedString(obj, fields...)
return val
}

// RemoveDuplicateForStringSlice returns a new slice with duplicate elements removed.
func RemoveDuplicateForStringSlice(elements []string) []string {
result := make([]string, 0, len(elements))
temp := map[string]struct{}{}
for _, element := range elements {
if _, ok := temp[element]; !ok {
temp[element] = struct{}{}
result = append(result, element)
}
}
return result
}

0 comments on commit 19beae4

Please sign in to comment.